Ich versuche, eine Liste mit Zahlen 1-1000
zu erstellen. Natürlich wäre das Schreiben/Lesen ärgerlich, also versuche ich, eine Liste mit einem Bereich darin zu erstellen. In Python 2 scheint es so zu sein:
some_list = range(1,1000)
hätte funktioniert, aber in Python 3 ähnelt der Bereich der xrange
von Python 2?
Kann jemand einen Einblick in das geben?
Sie können einfach eine Liste aus dem Bereichsobjekt erstellen:
my_list = list(range(1, 1001))
So machen Sie es auch mit Generatoren in python2.x. Normalerweise benötigen Sie wahrscheinlich keine Liste, da Sie my_list[i]
effizienter (i + 1
) verwenden können. Wenn Sie nur durchlaufen müssen, können Sie einfach auf range
zurückgreifen.
Beachten Sie außerdem, dass xrange
auf python2.x noch indizierbar ist1. Dies bedeutet, dass range
auf python3.x auch dieselbe Eigenschaft hat2
1print xrange(30)[12]
funktioniert für python2.x
2Die analoge Aussage zu 1 in python3.x ist print(range(30)[12])
und das funktioniert auch.
in Python 3.x hat die Funktion range()
einen eigenen Typ. In diesem Fall müssen Sie den Iterator verwenden
list(range(1000))
In Pythons <= 3.4 können Sie, wie von anderen vorgeschlagen, list(range(10))
verwenden, um aus einem Bereich eine Liste zu erstellen (im Allgemeinen beliebig iterierbar).
Eine andere in Python 3.5
eingeführte Alternative mit ihren Auspack-Verallgemeinerungen ist die Verwendung von *
in einem Listenliteral []
:
>>> r = range(10)
>>> l = [*r]
>>> print(l)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Obwohl dies äquivalent zu list(r)
ist, ist es eine wörtliche Syntax und die Tatsache, dass kein Funktionsaufruf beteiligt ist, führt dazu, dass der Befehl schneller ausgeführt wird. Es sind auch weniger Charaktere, wenn Sie Golf spielen müssen :-)
Der Grund, warum Python3 keine Funktion zum direkten Abrufen einer Bereichsliste hat, liegt darin, dass der ursprüngliche Python3-Designer in Python2 ein Neuling war. Er hat nur die Verwendung der Funktion range () in einer for-Schleife berücksichtigt, daher sollte die Liste niemals erweitert werden müssen. In der Tat müssen wir häufig die Funktion range () verwenden, um eine Liste zu erstellen und an eine Funktion zu übergeben.
Daher ist Python3 in diesem Fall weniger bequem als Python2, weil:
Dennoch können Sie die Listenerweiterung auf diese Weise verwenden:
[*range(N)]
Sie sollten wirklich nicht die Nummern 1-1000 in einer Liste verwenden müssen. Wenn Sie aus irgendeinem Grund wirklich diese Zahlen benötigen, könnten Sie Folgendes tun:
[i for i in range(1, 1001)]
Listenverständnis auf den Punkt gebracht:
Das obige Listenverständnis übersetzt in:
nums = []
for i in range(1, 1001):
nums.append(i)
Dies ist nur die Listenverständnissyntax, jedoch ab 2.x. Ich weiß, dass dies in Python 3 funktionieren wird, aber ich bin nicht sicher, ob es auch eine aktualisierte Syntax gibt
Der Bereich beginnt mit dem ersten Parameter. endet jedoch auf/zu, nicht eingeschlossen der zweite Parameter (wenn 2 Parameter angegeben werden; wenn der erste Parameter nicht angegeben ist, beginnt er mit '0')
range(start, end+1)
[start, start+1, .., end]
Wenn Sie 1-1000 (einschließlich) möchten, verwenden Sie die Funktion range(...)
mit den Parametern 1 und 1001: range(1, 1001)
, da die Funktion range(start, end)
vom Anfang bis (Ende-1) einschließlich geht.
Tatsächlich ist dies eine Retrogradation von Python3 im Vergleich zu Python2. Sicherlich ist Python2, das range () und xrange () verwendet, bequemer als Python3, das list (range ()) und range () verwendet. Der Grund dafür ist, dass der ursprüngliche Designer von Python3 nicht sehr erfahren ist. Er hat lediglich die Verwendung der Range-Funktion von vielen Anfängern für das Durchlaufen einer großen Anzahl von Elementen in Betracht gezogen, bei denen sowohl Speicher als auch CPU ineffizient sind. Sie vernachlässigten jedoch die Verwendung der Range-Funktion zur Erstellung einer Nummernliste. Nun ist es zu spät, um sich schon wieder zu ändern.
Wenn ich der Designer von Python3 sein sollte, werde ich:
Das sollte optimal sein.
Verwenden Sie Range in Python 3.
Hier ist eine Beispielfunktion, die Zahlen zwischen zwei Zahlen zurückgibt
def get_between_numbers(a, b):
"""
This function will return in between numbers from two numbers.
:param a:
:param b:
:return:
"""
x = []
if b < a:
x.extend(range(b, a))
x.append(a)
else:
x.extend(range(a, b))
x.append(b)
return x
Ergebnis
print(get_between_numbers(5, 9))
print(get_between_numbers(9, 5))
[5, 6, 7, 8, 9]
[5, 6, 7, 8, 9]