Saya tertarik dengan pemrograman fungsional dengan python dan sedang mengerjakan posting blog Mary Rose Cook Pengantar praktis untuk pemrograman fungsional.

Rupanya, itu ditulis dalam python 2 seperti ini:

name_lengths = map(len, ["Mary", "Isla", "Sam"])

print name_lengths
# => [4, 4, 3]

Di Python 3 menghasilkan ini:

<map object at 0x100b87a20>

Saya punya dua pertanyaan:

  1. Mengapa demikian?
  2. Selain mengonversi objek peta ke daftar dan kemudian menggunakan numpy, apakah ada yang lain solusi?
4
hrokr 14 Agustus 2017, 19:25

2 jawaban

Jawaban Terbaik

Seperti yang didokumentasikan, dalam panduan migrasi,

Dalam Python 2 map() mengembalikan daftar sementara di Python 3 mengembalikan sebuah iterator.

Python 2:

Terapkan fungsi ke setiap item yang dapat diubah dan kembalikan daftar hasil.

Python 3:

Kembalikan iterator yang menerapkan fungsi ke setiap item iterable, yang menghasilkan hasilnya.

Python 2 selalu melakukan yang setara dengan list(imap(...)), Python 3 memungkinkan evaluasi malas.

7
dhke 14 Agustus 2017, 16:31

Untuk melengkapi jawaban luar biasa @ dhke (ini terlalu panjang untuk dikomentari) pikirkan seperti ini. Anda ingin melakukan beberapa transformasi pada daftar dengan menggabungkan map, filter, dll. Jadi ada dua cara untuk memikirkan hal ini:

  1. Terapkan transformasi pertama ke seluruh daftar, lalu yang kedua, dll.
  2. Terapkan semua transformasi ke elemen pertama dari daftar, lalu yang kedua, dll.

Cara python3 memungkinkan untuk keduanya, sedangkan yang kedua tidak dapat ditulis secara ringkas dalam python 2: Anda harus secara eksplisit mengulangi daftar dengan loop for dan membuat daftar baru dari hasil.

2
Jared Smith 14 Agustus 2017, 16:35