filter
, map
, Dan reduce
bekerja sempurna di Python 2. Berikut adalah contoh:
>>> def f(x):
return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
>>> def cube(x):
return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>> def add(x,y):
return x+y
>>> reduce(add, range(1, 11))
55
Namun dalam Python 3, saya menerima output berikut:
>>> filter(f, range(2, 25))
<filter object at 0x0000000002C14908>
>>> map(cube, range(1, 11))
<map object at 0x0000000002C82B70>
>>> reduce(add, range(1, 11))
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
reduce(add, range(1, 11))
NameError: name 'reduce' is not defined
Saya akan sangat menghargai jika seseorang dapat menjelaskan kepada saya mengapa ini terjadi.
Tangkapan layar kode untuk kejelasan lebih lanjut:
python
python-3.x
filter
functional-programming
reduce
Dick Lucas
sumber
sumber
Jawaban:
Anda dapat membaca tentang perubahan pada What's New In Python 3.0 . Anda harus membacanya dengan seksama ketika Anda berpindah dari 2.x ke 3.x karena banyak yang telah diubah.
Seluruh jawaban di sini adalah kutipan dari dokumentasi.
Tampilan Dan Iterator Alih-alih Daftar
Dibangun
sumber
list(map(...)
mana-mana .. bagaimana dunia membantu keterbacaan ..python
sepertinya tidak dapat menangani aplikasi progresif / streaming dari kombinator fungsional. Bahasa lain saya dapat membuat rantai selusin operasi terhadap koleksi berturut-turut dan itu dapat dibaca. Sini? apa yang Anda inginkan - selusin cara bersarangin
??list
panggilan sama sekali? Saya pikir arti "streaming" adalah "tidak ada daftar sama sekali; proses setiap elemen dari input sepenuhnya sebelum pindah ke yang berikutnya".map
.Fungsionalitas
map
danfilter
sengaja diubah untuk mengembalikan iterator, dan mengurangi dihapus dari menjadi built-in dan ditempatkan difunctools.reduce
.Jadi, untuk
filter
danmap
, Anda dapat membungkusnya denganlist()
untuk melihat hasil seperti yang Anda lakukan sebelumnya.Rekomendasi sekarang adalah bahwa Anda mengganti penggunaan peta dan filter dengan ekspresi generator atau pemahaman daftar. Contoh:
Mereka mengatakan bahwa untuk loop adalah 99 persen dari waktu lebih mudah dibaca daripada mengurangi, tapi saya hanya akan bertahan
functools.reduce
.Sunting : Angka 99 persen ditarik langsung dari halaman What's New In Python 3.0 yang ditulis oleh Guido van Rossum.
sumber
[i*i*i for i in range(1,11)]
i**3
akan memanggili.__pow__(3)
dani*i*i
i.__mul__(i).__mul__(i)
(atau sesuatu seperti itu). Dengan ints itu tidak masalah tetapi dengan angka numpy / kelas khusus bahkan mungkin menghasilkan hasil yang berbeda.list(list(list(.. )))
untuk melakukan apa yang sudah verbose dengan python.Sebagai tambahan untuk jawaban lain, ini kedengarannya seperti kasus penggunaan yang baik untuk manajer konteks yang akan memetakan kembali nama-nama fungsi ini ke yang mengembalikan daftar dan memperkenalkan
reduce
di namespace global.Implementasi cepat mungkin terlihat seperti ini:
Dengan penggunaan yang terlihat seperti ini:
Yang mencetak:
Hanya 2 sen saya :-)
sumber
python
sebagai bahasa berantakan - tetapi memiliki v baik untuk perpustakaan yang sangat baik:numpy
,pandas
,statsmodels
dan teman-teman .. Saya telah buliding perpustakaan kenyamanan seperti Anda menunjukkan di sini untuk mengurangi rasa sakit dari bahasa asli - tetapi telah kehilangan energi dan mencoba untuk tidak menyimpang jauh dari adata.frame
/datatable
, atauxarray
. Tapi pujian untuk mencoba ..Karena
reduce
metode ini telah dihapus dari fungsi bawaan dari Python3, jangan lupa untuk mengimporfunctools
dalam kode Anda. Silakan lihat potongan kode di bawah ini.sumber
Berikut adalah contoh-contoh dari Filter, map dan pengurangan fungsi
//Saring
//Peta
//Mengurangi
Fungsi pengurangan, karena tidak umum digunakan, telah dihapus dari fungsi bawaan di Python 3. Masih tersedia di modul functools, sehingga Anda dapat melakukan:
sumber
Salah satu keunggulan peta, filter, dan reduksi adalah seberapa terbaca mereka ketika Anda "rantai" mereka bersama untuk melakukan sesuatu yang kompleks. Namun, sintaks bawaan tidak terbaca dan semuanya "mundur". Jadi, saya sarankan menggunakan
PyFunctional
paket ( https://pypi.org/project/PyFunctional/ ). Berikut perbandingan keduanya:Versi PyFunctional
Sintaks yang sangat terbaca. Anda bisa mengatakan:
Versi Python default
Semuanya mundur. Anda perlu mengatakan:
sumber