2017-04-07 117 views
-3

現在我學習網絡編程。我想寫一個recvall函數。我的消息通過TCP套接字發送,始終以\r\n結尾。用谷歌搜索一些文章和博客文章,我發現了一種我不明白的方法。它可以寫得更簡單嗎?Python:我不明白這個語法

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

該行我不明白:while data[-len(needle):] != needle:。這對我沒有任何意義(但是,它的工作原理)。 -len(needle)應該返回一個負數並且字符串從0開始編號...

+1

總之'數據[-len(針):]'從len(針)的所有條目從右到尾。在一個列表中減去數字cound從結尾,積極的從一開始 –

+0

換句話說,雖然數據的結尾不匹配針... – Bull

回答

2

表達data[n:]計算爲從所述一個數據的所有元素通過對序列的末尾編號n。當n爲負數時,它指定從序列的右端開始的位置,因此data[-n:]可以改寫爲「序列的最後n個元素」。

由於在這種情況下,序列是一個字符串,並且n是某個目標字符串的長度,因此您可以將該循環讀作「當數據字符串的末尾不是目標字符串」。

這顯然不是由有經驗的Python程序員編寫的,但是,由於這個通俗的拼寫是

while not data.endswith(target): 
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 
1

你所看到的線是兩個從後面訪問數組(一個例子負數組索引)和splicing

-len(needle)將給出needle列表的量級長度的負值。 data[-len(needle)]將從數組末尾獲得len(needle) th值。拼接操作符:將導致data[-len(needle):]從數組末尾到數組末尾,從len(needle) th值中獲取所有值。

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

聲明data[-len(needle):]在功能上等同於data[-2:],它會給你[6, 7]

1

假設你有一個清單:

l = [1, 2, 4] 

l[-2:]表示切片開始倒數第二個元素的列表。

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

所以你基本上創建新的列表,通常是較短的(但也可以是相同的長度與原始),其從原始列表的元素開始,並且在原始列表的特定元件結束。