2017-04-07 4 views
-3

Jetzt lerne ich über Netzwerkprogrammierung. Ich wollte mir eine recvall Funktion schreiben. Meine Nachrichten werden über TCP-Sockets gesendet und enden immer mit dem \r\n. Bei einigen Artikeln und Blog-Posts habe ich eine Methode gefunden, die ich nicht verstehe. Kann es einfacher geschrieben werden?Python: Ich verstehe diese Syntax nicht

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

Die Linie verstehe ich nicht: while data[-len(needle):] != needle:. Es macht für mich keinen Sinn (aber es funktioniert). sollte eine negative Zahl zurückgeben und die Strings sind nummeriert ab 0 ...

+1

In Kürze 'data [-len (Nadel):]' alle Einträge von len (Nadel) von rechts bis zum Ende.In einer Liste minus Zahlen vom Ende, positive von Anfang an –

+0

Mit anderen Worten, während das Ende der Daten nicht Nadel entspricht ... – Bull

Antwort

2

Der Ausdruck data[n:] auswertet, da alle Elemente der Daten von dem einen n bis zum Ende der Sequenz numeriert. Wenn n negativ ist, gibt es eine Position an, die am rechten Ende der Sequenz beginnt, und so kann data[-n:] als "die letzten n Elemente der Sequenz" umformuliert werden.

Da in diesem Fall die Sequenz eine Zeichenfolge ist und n die Länge einer Zielzeichenfolge ist, könnten Sie die Schleife als "während das Ende der Datenzeichenfolge nicht die Zielzeichenfolge ist" lesen.

Es eindeutig nicht von einem erfahrenen Programmierer Python geschrieben wurde, denn dies ist seit dem Umgang Rechtschreibung würde jedoch

while not data.endswith(target): 
1

In Python können Sie negative Index zu Access-Element beginnend am Ende der Liste verwenden.
Index -1 Zugriff auf das letzte Element der Liste.

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

Die Linie, die Sie sehen, ist ein Beispiel für beide ein Array von der Rückseite zugreifen (der negative Array-Index) und splicing.

wird ein negativer Wert der Größenordnung Länge der needle Liste geben. data[-len(needle)] wird der len(needle) th Wert vom Ende des Arrays erhalten. Der Spleißoperator : bewirkt, dass data[-len(needle):] alle Werte vom len(needle) ten Wert vom Ende des Arrays bis zum Ende des Arrays abruft.

Zum Beispiel sagen wir len(needle) = 2 und data = [2, 5, 6, 7].

Die Aussage data[-len(needle):] ist funktionell äquivalent zu data[-2:], die Ihnen [6, 7] geben wird.

1

Sagen Sie eine Liste haben:

l = [1, 2, 4] 

l[-2:] bedeutet die Liste Start seiner zweiten letzte Element schneiden.

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

Sie sind also im Grunde eine neue Liste erstellen, die in der Regel kürzer ist (kann aber gleich lang wie das Original sein), die aus einem Element der ursprünglichen Liste beginnt und endet an einem bestimmten Element der ursprünglichen Liste.

Verwandte Themen