>>> range(1,11)
gibt Ihnen
[1,2,3,4,5,6,7,8,9,10]
Warum nicht 1-11?
Haben sie das einfach zufällig so gemacht oder hat das einen Wert, den ich nicht sehe?
>>> range(1,11)
gibt Ihnen
[1,2,3,4,5,6,7,8,9,10]
Warum nicht 1-11?
Haben sie das einfach zufällig so gemacht oder hat das einen Wert, den ich nicht sehe?
Weil es üblicher ist, die range(0, 10)
die zurückgibt [0,1,2,3,4,5,6,7,8,9]
die 10 Elemente enthält, was gleichbedeutend ist mit len(range(0, 10))
. Denken Sie daran, dass Programmierer eine 0-basierte Indizierung bevorzugen.
Beachten Sie auch den folgenden gemeinsamen Codeausschnitt:
for i in range(len(li)):
pass
Könnten Sie sehen, dass wenn range()
stieg auf genau len(li)
dass dies problematisch sein könnte? Der Programmierer müsste explizit 1 subtrahieren. Dies entspricht auch dem allgemeinen Trend, dass Programmierer lieber for(int i = 0; i < 10; i++)
über for(int i = 0; i <= 9; i++)
.
Wenn Sie häufig Bereiche mit einem Startwert von 1 aufrufen, sollten Sie vielleicht eine eigene Funktion definieren:
>>> def range1(start, end):
... return range(start, end+1)
...
>>> range1(1, 10)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Obwohl es hier einige nützliche algorithmische Erklärungen gibt, denke ich, dass es hilfreich sein könnte, einige einfache "reale" Argumente hinzuzufügen, warum es auf diese Weise funktioniert, was ich bei der Einführung in das Thema für junge Neulinge als nützlich empfunden habe:
Bei etwas wie "Bereich(1,10)" kann Verwirrung entstehen, wenn man denkt, dass das Parameterpaar den "Anfang und das Ende" darstellt.
Es heißt eigentlich "Start" und "Stop".
Nun, wenn es waren der "End"-Wert, dann könnte man erwarten, dass diese Zahl als letzter Eintrag in die Sequenz aufgenommen wird. Sie ist aber nicht das "Ende".
Andere nennen diesen Parameter fälschlicherweise "count", denn wenn Sie immer nur "range(n)" verwenden, wird natürlich "n" Mal wiederholt. Diese Logik bricht zusammen, wenn Sie den Startparameter hinzufügen.
Daher ist es wichtig, sich den Namen zu merken: " stoppen ". Das bedeutet, dass dies der Punkt ist, an dem die Iteration bei Erreichen sofort beendet wird. Nicht nach diesen Punkt.
Während "Start" also tatsächlich den ersten zu berücksichtigenden Wert darstellt, wird bei Erreichen des "Stop"-Wertes "abgebrochen", anstatt mit der Verarbeitung "auch dieses Wertes" fortzufahren, bevor angehalten wird.
Eine Analogie, die ich verwendet habe, um dies den Kindern zu erklären, ist, dass es sich ironischerweise besser benimmt als Kinder! Es hört nicht auf nach er soll - er bricht sofort ab, ohne seine Arbeit zu beenden. (Sie bekommen das ;) )
Eine andere Analogie: Wenn Sie ein Auto fahren, fahren Sie nicht Pass ein Stopp-, Vorfahrt- oder Vorfahrt-lassen-Schild, und am Ende steht es irgendwo neben oder hinter Ihrem Auto. Technisch gesehen haben Sie das Schild noch nicht erreicht, wenn Sie anhalten. Es gehört nicht zu den "Dingen, an denen Sie auf Ihrer Fahrt vorbeigekommen sind".
Ich hoffe, das hilft, den Pythonitos/Pythonitas etwas zu erklären!
Es ist auch nützlich für die Aufteilung von Bereichen; range(a,b)
kann aufgeteilt werden in range(a, x)
y range(x, b)
, wohingegen Sie bei einem umfassenden Bereich entweder x-1
o x+1
. Während Sie selten Bereiche aufteilen müssen, neigen Sie dazu, Listen recht häufig aufzuteilen, was einer der Gründe ist, warum das Aufteilen einer Liste l[a:b]
enthält das a-te Element, aber nicht das b-te. Dann range
mit der gleichen Eigenschaft macht es schön konsistent.
Sie funktioniert gut in Kombination mit der nullbasierten Indizierung und len()
. Zum Beispiel, wenn Sie 10 Einträge in einer Liste haben x
Sie sind von 0-9 nummeriert. range(len(x))
gibt Ihnen 0-9.
Natürlich wird man Ihnen sagen, dass es pythonischer ist, die for item in x
o for index, item in enumerate(x)
statt for i in range(len(x))
.
Auch das Schneiden funktioniert auf diese Weise: foo[1:4]
sind die Punkte 1-3 von foo
(wobei zu beachten ist, dass die Position 1 aufgrund der auf Null basierenden Indizierung eigentlich die zweite Position ist). Aus Gründen der Konsistenz sollten sie beide auf die gleiche Weise funktionieren.
Ich stelle mir das so vor: "die erste Zahl, die Sie wollen, gefolgt von der ersten Zahl, die Sie nicht wollen." Wenn Sie 1-10 wollen, ist die erste Zahl, die Sie nicht wollen, 11, also range(1, 11)
.
Wenn es in einer bestimmten Anwendung umständlich wird, ist es einfach genug, eine kleine Hilfsfunktion zu schreiben, die 1 zum Endindex hinzufügt und range()
.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.