Próbuję zrobić listę z liczbami 1-1000
. Oczywiście pisanie / czytanie byłoby denerwujące, więc próbuję utworzyć listę z zakresem. W Pythonie 2 wygląda na to, że:
some_list = range(1,1000)
zadziałałoby, ale w Pythonie 3 zakres jest podobny do zakresu xrange
w Pythonie 2?
Czy ktoś może dać wgląd w to?
python
python-3.x
list
range
Boathouse
źródło
źródło
some_list[i] == i+1
więc prawdopodobnie i tak nie potrzebujesz listy.Odpowiedzi:
Możesz po prostu utworzyć listę z obiektu zakresu:
W ten sposób robisz to również z generatorami w python2.x. Zwykle jednak lista prawdopodobnie nie jest potrzebna, ponieważ można przyjąć wartość
my_list[i]
bardziej efektywnie (i + 1
), a jeśli potrzebujesz tylko iterować, możesz po prostu wrócić do niejrange
.Należy również zauważyć, że w python2.x
xrange
jest nadal indeksowalny 1 . Oznacza to, żerange
na python3.x również ma tę samą właściwość 21
print xrange(30)[12]
działa dla python2.x2 Analogiczna instrukcja do 1 w python3.x to
print(range(30)[12])
i to też działa.źródło
list(arg)
innych językach jest rozumiane jako wywołanie konstruktoralist
klasy. W rzeczywistości jest to również przypadek Pythona. Debata, czy obiekt jest wypełniany w trakcie konstrukcji (jak w przypadku C ++), czy tylko podczas pierwszej automatycznie wywoływanej metody (jak w__init__()
metodzie Pythona ) nie może zmienić podstawowej abstrakcyjnej idei. Uważam, że konstruktor listy przyjmuje iterator i wypełnia listę zwracanymi wartościami .'range' object is not callable
W Pythonie <= 3.4 możesz, jak sugerowali inni, użyć
list(range(10))
do utworzenia listy spoza zakresu (ogólnie rzecz biorąc, dowolna iterowalna).Inną alternatywą, wprowadzoną w Pythonie
3.5
z uogólnieniami dotyczącymi rozpakowywania, jest użycie*
w liście literału[]
:Chociaż jest to równoważne z
list(r)
, jest to składnia dosłowna, a fakt, że nie jest zaangażowane żadne wywołanie funkcji, pozwala jej wykonywać szybciej. To także mniej znaków, jeśli chcesz zakodować golfa :-)źródło
[*range(10)]
działa dobrze, gdy nie potrzebujeszrange
do żadnego celu, ale zainicjowanielist
. Na marginesie: Moją ulubioną (dobrze, nie do końca) częścią rozpakowywania uogólnień jest to, że pusteset
s mają teraz dosłowną składnię{*()}
, lub jak to nazywam, jednooki operator małpy. ;-)w Pythonie 3.x
range()
funkcja ma swój własny typ. więc w tym przypadku musisz użyć iteratoralist(range(1000))
źródło
list(range(1000))()
Powodem, dla którego Python3 nie ma funkcji do bezpośredniego pobierania listy zakresowej, jest to, że oryginalny projektant Python3 był całkiem nowicjuszem w Pythonie2. Rozważał tylko użycie
range()
funkcji w pętli for, dlatego lista nie powinna nigdy wymagać rozszerzenia. W rzeczywistości bardzo często musimy użyć tejrange()
funkcji, aby utworzyć listę i przekazać ją do funkcji.Dlatego w tym przypadku Python3 jest mniej wygodny w porównaniu do Python2, ponieważ:
xrange()
irange()
;range()
ilist(range())
Niemniej jednak możesz nadal korzystać z rozwijania listy w ten sposób:
źródło
list
, bo to zwykle źle rzeczą do zrobienia. W 99 na 100 przypadków użycia tworzenie rzeczywistej wartościlist
jest nieefektywne i bezcelowe, ponieważrange
samo w sobie zachowuje się jak niezmienna sekwencja prawie pod każdym względem, czasami bardziej efektywnie przy ładowaniu (np. Testy ograniczające dlaint
s sąO(1)
, a nieO(n)
dlalist
s). W Pythonie 2 ludzie zwykle używalirange
domyślnie, chociażxrange
prawie zawsze była to lepsza opcja; w Pythonie 3 możesz jawnie wyrazić zgodę na tolist
, a nie dostać to przypadkowo, używając złej nazwy.Naprawdę nie powinieneś używać liczb 1-1000 na liście. Ale jeśli z jakiegoś powodu naprawdę potrzebujesz tych liczb, możesz zrobić:
Rozumienie listy w pigułce:
Powyższe rozumienie listy przekłada się na:
To jest tylko składnia listy, chociaż od 2.x. Wiem, że to zadziała w Pythonie 3, ale nie jestem pewien, czy istnieje również ulepszona składnia
Zakres zaczyna się łącznie z pierwszym parametrem; ale kończy się do, bez drugiego parametru (jeśli podano 2 parametry; jeśli pierwszy parametr zostanie pozostawiony, rozpocznie się od „0”)
źródło
list(range(1000))
list()
konstruktora z iterowalnym .list()
Konstruktor wie, jak utworzyć nową listę, gdy podano żadnych iterable obiektu.list(range(1000))
będzie działać w python3 tak jaklist(xrange(1000))
w python2Właściwie, jeśli chcesz 1-1000 (włącznie), użyj
range(...)
funkcji z parametrami 1 i 1001:,range(1, 1001)
ponieważrange(start, end)
funkcja przechodzi od początku do (koniec-1) włącznie.źródło
Użyj zakresu w Pythonie 3.
Oto przykładowa funkcja, która zwraca między liczbami z dwóch liczb
źródło
W rzeczywistości jest to retro-gradacja Pythona3 w porównaniu do Pythona2. Z pewnością Python2, który używa range () i xrange (), jest wygodniejszy niż Python3, który używa odpowiednio list (range ()) i range (). Powodem jest to, że pierwotny projektant Pythona3 nie jest zbyt doświadczony, rozważali tylko użycie funkcji zakresu przez wielu początkujących w celu iteracji dużej liczby elementów, w których zarówno pamięć, jak i procesor są nieefektywne; ale zaniedbali użycie funkcji zakresu do utworzenia listy liczb. Teraz jest już za późno, aby mogli się już zmienić.
Gdybym miał być projektantem Pythona3, to:
To powinno być optymalne.
źródło