Python3.8 führt einige Erkenntnisse zum Walross-Operator ein

1. Einleitung

Warum wird dieser Operator mit Walrossen in Verbindung gebracht? Da es wie ein liegendes Walross aussieht, ist das Bild der Augen und Zähne das Bild des Walross-Operators, wie unten gezeigt:

Der Walross-Operator, auch Walross-Selektor genannt, ist in der Go-Sprache sehr verbreitet und wurde auch in Python 3.8 eingeführt. Wir haben ihn in den vorherigen ROS-Tastatur-Fernsteuerungsrobotern eingeführt und die Geschwindigkeit über den Parameterserver angegeben . Bei der Verwendung von Parametern Um die Geschwindigkeit anzugeben, verwenden Sie den Walross-Operator

./keys_to_twist_ramps.py _linear_scale:=0.5 _angular_scale:=1.0 _linear_accel:=1.0 _angular_accel:=1.0

Beim Starten einer Startdatei wird dieser Walross-Operator manchmal häufig verwendet, beispielsweise zum Laden einer Modellbeschreibungsdatei:
roslaunch pkg_name xxx.launch model:='$(find urdf_pkg)/urdf/x.urdf'
Seine Verwendung ist die gleiche wie die Zuweisungsoperation Das Symbol = sieht sehr ähnlich aus, ist aber dennoch sehr unterschiedlich.
Da es in der neuen Version eingeführt wird, sollte es meiner Meinung nach einige Vorteile geben, also lernen wir es kennen, GoGoGo, lernen wir es gemeinsam kennen.

2. Beispiel

Durch die Verwendung des Walross-Operators kann der Code präziser gestaltet werden, und in einigen Fällen kann die Verwendung des Walross-Operators die Leistung des Codes verbessern. Wenn Sie beispielsweise einen Teil des Werts eines Ausdrucks einer Variablen zuweisen, können Sie die wiederholte Berechnung desselben Ausdrucks in einer Schleife vermeiden und so die Effizienz des Codes verbessern.

2.1. Auftrag

Zuweisungsoperationen sind am häufigsten. In diesem Fall können Sie den Walross-Operator verwenden, um den Code präziser und effizienter zu gestalten.

x = 11
if x > 10:print("x大于10")
#转换成海象运算符
if (y := 11) > 10:print("y大于10")

x="hello world"
n=len(x)
if (n > 10):print(f"x长度{n},大于10")
#x长度11,大于10

#转换成海象运算符
y="hello chyichin"
if (n := len(y)) > 10:print(f"y长度{n},大于10")
#y长度14,大于10

Durch den Walross-Operator muss n hier die Länge der Zeichenfolge nicht erneut berechnen.

 2.2. Zyklus

n=3
while n:
    print(n)
    n-=1
/*
2
1
0
*/

In Walross-Operator umwandeln:

n=3
while (n := n-1)+1:
    print(n)
/*
2
1
0
*/

 In ähnlicher Weise kann die Eingabe im folgenden Fall auch direkt abgerufen und zugewiesen werden.

while True:
    txt=input("输入hello:")
    if(txt=='hello'):break

#转成海象运算符:
while (txt := input("输入hello:"))!='hello':continue

2.3. Dateien lesen

Wenn Sie eine Datei lesen, verwenden Sie while, um mit dem Lesen fortzufahren. Die Verwendung ist die gleiche wie oben:

f = open('test.txt','r',encoding='utf-8')
while True:
    content=f.read()
    if not content:break
    print(content)

f.close()

Ersetzen Sie durch den Walross-Operator:

f = open('test.txt','r',encoding='utf-8')
while content := f.read():
    print(content)

2.4. Listenableitung

Bei Verwendung der Listenableitung kann der Walross-Operator die Leistung verbessern. Schauen wir uns ein Beispiel an. Eine herkömmliche Schreibweise:

l=[1,3,5,7,9]
n=0
def f(x):
    global n
    n+=1
    print(f"执行次数:{n}")
    return x**2

print([f(i) for i in l if f(i)>1])
/*
执行次数:1
执行次数:2
执行次数:3
执行次数:4
执行次数:5
执行次数:6
执行次数:7
执行次数:8
执行次数:9
[9, 25, 49, 81]
*/

Werfen wir einen Blick auf den Ausführungsprozess: Quadrieren Sie 5 Zahlen, führen Sie sie 5 Mal aus und erhalten Sie Werte größer als 1 aus der Liste [1, 9, 25, 49, 81]. Es gibt 4 Werte, die die Bedingungen erfüllen , wir müssen also noch einmal 4 Mal ausgeführt werden, also insgesamt 9 Ausführungen.

Wenn wir zum Walross-Operator wechseln, müssen wir ihn nur fünfmal ausführen, wie folgt:

l=[1,3,5,7,9]
n=0
def f(x):
    global n
    n+=1
    print(f"执行次数:{n}")
    return x**2

print([x for i in l if (x := f(i))>1])
/*
执行次数:1
执行次数:2
执行次数:3
执行次数:4
执行次数:5
[9, 25, 49, 81]
*/

3. Unterschied

Der Unterschied besteht hier hauptsächlich im Zuweisungsoperator = . Da er sehr ähnlich aussieht, müssen Sie auf einige häufige Szenarien achten, in denen der Walross-Operator nicht verwendet werden kann.

3.1. Zuweisungsvorgang

a=1 ist kein Problem, wenn Sie den Walross-Operator a:=1 verwenden

  File "<stdin>", line 1
    a:=1
     ^
SyntaxError: invalid syntax

Es wird ein Syntaxfehler gemeldet. Daher ist es nicht möglich, Zuweisungsvorgänge direkt auf diese Weise durchzuführen, und dies ist auch nicht erforderlich.

3.2. Befolgen Sie den Zuweisungsvorgang

Ebenso können zusammengesetzte Zuweisungsoperatoren wie a+=3 den Walrossoperator a:+=3 nicht verwenden

  File "<stdin>", line 1
    a:+=3
      ^
SyntaxError: invalid syntax

3.3. Anonyme Funktionen

Achten Sie auch auf die Verwendung des Lambda- Ausdrucks

f1=lambda x:x**3
f1(3)
#27

 Es gibt kein Problem, wenn Sie es normal so schreiben, aber es funktioniert nicht, wenn Sie es in den Walross-Operator ändern.

f2:=lambda x:x**3
File "<stdin>", line 1
    f2:=lambda x:x**3
      ^
SyntaxError: invalid syntax

Es muss in Klammern eingeschlossen werden, das war's also

(f2:=lambda x:x**3)
f2(4)
#64

Der Zweck der Verwendung des Walross-Operators selbst besteht darin, den Code prägnanter und eleganter zu gestalten und die Leistung zu verbessern. Wenn er übermäßig oder unsachgemäß verwendet wird, verringert sich die Lesbarkeit und Leistung des Codes. Es hängt also vom Szenario ab. Alles dient der Lesbarkeit des Codes und der Leistung der Berechnung. Sie können die Grundlagen nicht ignorieren!

Guess you like

Origin blog.csdn.net/weixin_41896770/article/details/134174354