Da Sie auf Python 3 sind, ist es einfach. PEP 3132 führte eine willkommene Vereinfachung der Syntax beim Zuweisen zu Tupeln ein - Erweitertes iterierbares Entpacken . In der Vergangenheit muss bei der Zuweisung zu Variablen in einem Tupel die Anzahl der Elemente links von der Zuweisung genau der Anzahl rechts entsprechen.
In Python 3 können wir jede Variable auf der linken Seite als Liste festlegen, indem wir ein Sternchen * voranstellen. Dadurch werden so viele Werte wie möglich erfasst, während die Variablen rechts davon ausgefüllt werden (es muss also nicht das Element ganz rechts sein). Dies vermeidet viele böse Scheiben, wenn wir die Länge eines Tupels nicht kennen.
a, *b = "foo".split(":")
print("a:", a, "b:", b)
Gibt:
a: foo b: []
BEARBEITEN Sie folgende Kommentare und Diskussionen:
Im Vergleich zur Perl-Version ist dies erheblich anders, aber es ist die Python (3) -Methode. Im Vergleich zur Perl-Version re.split()
wäre dies ähnlicher, jedoch ist das Aufrufen der RE-Engine zum Aufteilen um ein einzelnes Zeichen ein unnötiger Aufwand.
Mit mehreren Elementen in Python:
s = 'hello:world:sailor'
a, *b = s.split(":")
print("a:", a, "b:", b)
gibt:
a: hello b: ['world', 'sailor']
Jedoch in Perl:
my $s = 'hello:world:sailor';
my ($a, $b) = split /:/, $s;
print "a: $a b: $b\n";
gibt:
a: hello b: world
Es ist ersichtlich, dass zusätzliche Elemente in Perl ignoriert werden oder verloren gehen. Das ist bei Bedarf in Python ziemlich einfach zu replizieren:
s = 'hello:world:sailor'
a, *b = s.split(":")
b = b[0]
print("a:", a, "b:", b)
Also, a, *b = s.split(":")
Äquivalent in Perl wäre
my ($a, @b) = split /:/, $s;
NB: Wir sollten verwenden nicht $a
und $b
im Allgemeinen Perl , da sie eine besondere Bedeutung haben , wenn verwendet mit sort
. Ich habe sie hier verwendet, um die Konsistenz mit dem Python-Beispiel zu gewährleisten.
Python hat einen zusätzlichen Trick im Ärmel, wir können zu jedem Element im Tupel auf der linken Seite entpacken:
s = "one:two:three:four"
a, *b, c = s.split(':')
print("a:", a, "b:", b, "c:", c)
Gibt:
a: one b: ['two', 'three'] c: four
Während in der äquivalenten Perl, das Array ( @b
IS) gierig, und die skalare $c
ist undef
:
use strict;
use warnings;
my $s = 'one:two:three:four';
my ($a, @b, $c) = split /:/, $s;
print "a: $a b: @b c: $c\n";
Gibt:
Use of uninitialized value $c in concatenation (.) or string at gash.pl line 8.
a: one b: two three four c:
$x
und$y
erhalten Sie in Perl, wenn die Zeichenfolge das Muster nicht enthält? Werden beiden die gesamte Zeichenfolge zugewiesen oder wird$y
null oder so?