Saya mencoba membuat daftar dengan angka 1-1000
di dalamnya. Jelas ini akan mengganggu menulis / membaca, jadi saya mencoba membuat daftar dengan kisaran di dalamnya. Dalam Python 2 tampaknya:
some_list = range(1,1000)
akan bekerja, tetapi dalam Python 3 jangkauan mirip dengan xrange
Python 2?
Adakah yang bisa memberikan wawasan tentang hal ini?
python
python-3.x
list
range
Rumah perahu
sumber
sumber
some_list[i] == i+1
jadi Anda mungkin tidak benar-benar membutuhkan daftar.Jawaban:
Anda bisa membuat daftar dari objek rentang:
Ini adalah bagaimana Anda melakukannya dengan generator di python2.x juga. Secara umum, Anda mungkin tidak memerlukan daftar karena Anda bisa mendapatkan nilai yang
my_list[i]
lebih efisien (i + 1
), dan jika Anda hanya perlu mengulanginya, Anda bisa langsung kembalirange
.Perhatikan juga bahwa pada python2.x,
xrange
masih dapat diindeks 1 . Ini berarti bahwarange
pada python3.x juga memiliki properti yang sama 21
print xrange(30)[12]
berfungsi untuk python2.x2 Pernyataan analog dengan 1 di python3.x adalah
print(range(30)[12])
dan berfungsi juga.sumber
list(arg)
dipahami dalam bahasa lain sebagai memanggil konstruktorlist
kelas. Sebenarnya, ini juga merupakan kasus Python. Debat apakah objek diisi selama konstruksi (seperti dalam kasus C ++) atau hanya selama metode yang pertama kali disebut secara otomatis (seperti dalam__init__()
metode Python ) tidak dapat mengubah ide abstrak dasar. Pandangan saya adalah bahwa konstruktor daftar mengambil iterator dan mengisi daftar dengan nilai yang dikembalikan .'range' object is not callable
Dalam Python <= 3,4 Anda dapat, seperti yang disarankan orang lain, gunakan
list(range(10))
untuk membuat daftar di luar rentang (Secara umum, semua iterable).Alternatif lain, diperkenalkan
3.5
dengan Python dengan generalisasi yang tidak dibongkar, adalah dengan menggunakan*
daftar literal[]
:Meskipun ini setara dengan
list(r)
, itu adalah sintaks literal dan fakta bahwa tidak ada panggilan fungsi yang terlibat membiarkannya mengeksekusi lebih cepat. Ini juga lebih sedikit karakter, jika Anda perlu kode golf :-)sumber
[*range(10)]
berfungsi dengan baik ketika Anda tidak membutuhkannyarange
untuk tujuan apa pun selain menginisialisasilist
. Catatan sisi: Bagian favorit saya (oke, tidak benar-benar) dari generalisasi pembongkaran adalah bahwaset
s sekarang kosong memiliki sintaksis literal{*()}
,, atau seperti saya menyebutnya, operator monyet bermata satu. ;-)di Python 3.x,
range()
fungsi mendapat tipenya sendiri. jadi dalam hal ini Anda harus menggunakan iteratorlist(range(1000))
sumber
list(range(1000))()
Alasan mengapa Python3 tidak memiliki fungsi untuk secara langsung mendapatkan daftar berkisar adalah karena desainer Python3 asli cukup pemula di Python2. Dia hanya mempertimbangkan penggunaan
range()
fungsi dalam for for, oleh karena itu, daftar tidak perlu diperluas. Bahkan, sangat sering kita perlu menggunakanrange()
fungsi untuk menghasilkan daftar dan beralih ke fungsi.Oleh karena itu, dalam hal ini, Python3 kurang nyaman dibandingkan dengan Python2 karena:
xrange()
danrange()
;range()
danlist(range())
Meskipun demikian, Anda masih dapat menggunakan ekspansi daftar dengan cara ini:
sumber
list
, karena itulah biasanya hal yang salah untuk dilakukan. Untuk 99 dari 100 kasus penggunaan, membuat aktuallist
tidak efisien dan tidak ada gunanya, karenarange
itu sendiri bertindak seperti urutan yang tidak berubah dalam hampir setiap cara, kadang-kadang lebih efisien untuk mem-boot (mis. Tes penahanan untukint
sO(1)
, vsO(n)
untuklist
s). Dalam Python 2, orang cenderung menggunakanrange
secara default, meskipunxrange
itu hampir selalu merupakan pilihan yang lebih baik; di Python 3, Anda dapat secara eksplisit memilih untuk masuklist
, tidak mendapatkannya secara tidak sengaja dengan menggunakan nama yang salah.Anda benar-benar tidak perlu menggunakan angka 1-1000 dalam daftar. Tetapi jika karena alasan tertentu Anda benar-benar membutuhkan angka-angka ini, maka Anda dapat melakukannya:
Singkatnya, Daftar Pemahaman:
Pemahaman daftar di atas diterjemahkan menjadi:
Ini hanya sintaksis pemahaman daftar, meskipun dari 2.x. Saya tahu ini akan bekerja di python 3, tetapi saya tidak yakin apakah ada sintaks yang ditingkatkan juga
Rentang mulai termasuk parameter pertama; tetapi berakhir Hingga, Tidak Termasuk Parameter kedua (ketika diberikan 2 parameter; jika parameter pertama dibiarkan, itu akan mulai pada '0')
sumber
list(range(1000))
list()
konstruktor dengan iterable . Thelist()
konstruktor tahu cara membuat daftar baru ketika diberi objek iterable.list(range(1000))
akan bekerja di python3 sepertilist(xrange(1000))
di python2Sebenarnya, jika Anda ingin 1-1000 (inklusif), gunakan
range(...)
fungsi dengan parameter 1 dan 1001:,range(1, 1001)
karenarange(start, end)
fungsinya berubah dari awal hingga (akhir-1), inklusif.sumber
Gunakan Range di Python 3.
Berikut adalah contoh fungsi yang mengembalikan di antara angka-angka dari dua angka
sumber
Sebenarnya, ini adalah retro-gradasi dari Python3 dibandingkan dengan Python2. Tentu saja, Python2 yang menggunakan range () dan xrange () lebih nyaman daripada Python3 yang menggunakan list (range ()) dan range () masing-masing. Alasannya adalah karena perancang asli Python3 tidak terlalu berpengalaman, mereka hanya menganggap penggunaan fungsi rentang oleh banyak pemula untuk beralih pada sejumlah besar elemen di mana memori dan CPU tidak efisien; tetapi mereka mengabaikan penggunaan fungsi rentang untuk menghasilkan daftar nomor. Sekarang, sudah terlambat bagi mereka untuk kembali.
Jika saya menjadi desainer Python3, saya akan:
Itu harus optimal.
sumber