现在我了解网络编程。我想给自己写一个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
...
答案 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) = 2
和data = [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]
因此,您基本上创建了一个新列表,该列表通常较短(但可以与原始列表相同),从原始列表的元素开始并以原始列表的特定元素结束。