Python:我不懂这种语法

时间:2017-04-07 12:09:24

标签: python list

现在我了解网络编程。我想给自己写一个recvall函数。我的消息通过TCP套接字发送,并始终以\r\n结束。谷歌搜索一些文章和博客文章,我找到了一个我不明白的方法。可以写得更简单吗?

def recvuntil(s, needle):
    data = ""
    while data[-len(needle):] != needle:
        data += s.recv(1)
    return data

我不明白的一句话:while data[-len(needle):] != needle:。它对我没有任何意义(但是,它有效)。 -len(needle)应返回一个负数,字符串从0 ...

开始编号

4 个答案:

答案 0 :(得分:2)

表达式data[n:]计算从编号为n的序列到序列末尾的所有数据元素。当n为否定时,它指定从序列右侧开始的位置,因此data[-n:]可以被重新描述为“序列的最后n个元素。”

因为在这种情况下序列是一个字符串而n是某个目标字符串的长度,所以你可以将循环读作“当数据字符串的末尾不是目标字符串时。”

它显然不是由经验丰富的Python程序员编写的,因为对此的口语拼写将是

while not data.endswith(target):

答案 1 :(得分:1)

在python中,您可以从列表末尾开始对使用元素使用负索引 索引-1访问列表的最后一个元素。

>>> t = [0, 1, 2, 3, 4, 5]
>>> t[-1]
5
>>> t[-1:]
[5]
>>> t[-len(t)]
0
>>> t[0] == t[-len(t)]
True

答案 2 :(得分:1)

您看到的一行是从后面访问数组(负数组索引)和splicing的示例。

-len(needle)会给出needle列表的幅度长度的负值。 data[-len(needle)]将从数组末尾获取len(needle)值。 splice运算符:将使data[-len(needle):]从数组末尾的len(needle)值到数组末尾获取所有值。

例如,我们可以说len(needle) = 2data = [2, 5, 6, 7]

声明data[-len(needle):]在功能上等同于data[-2:],它将为您提供[6, 7]

答案 3 :(得分:1)

说你有一个清单:

l = [1, 2, 4]

l[-2:]表示切换列表开始其第二个最后一个元素。

In [47]: l[-2:]
Out[47]: [2, 4]

因此,您基本上创建了一个新列表,该列表通常较短(但可以与原始列表相同),从原始列表的元素开始并以原始列表的特定元素结束。