map(function, iterable, ...)
Terapkan fungsi ke setiap item yang dapat diubah dan kembalikan daftar hasil. Jika argumen iterable tambahan diteruskan, fungsi harus mengambil banyak argumen dan diterapkan ke item dari semua iterable secara paralel.
Jika satu iterable lebih pendek dari yang lain itu diasumsikan diperpanjang dengan Tidak ada item.
Jika fungsi adalah None
, fungsi identitas diasumsikan; jika ada beberapa argumen, map()
mengembalikan daftar yang terdiri dari tupel yang berisi item yang sesuai dari semua iterables (semacam operasi transpos).
Argumen iterable dapat berupa urutan atau objek iterable; hasilnya selalu daftar.
Apa peran ini dalam membuat produk Cartesius?
content = map(tuple, array)
Apa efek menempatkan tuple di mana saja di sana? Saya juga memperhatikan bahwa tanpa fungsi peta output abc
dan dengannya, itu a, b, c
.
Saya ingin sepenuhnya memahami fungsi ini. Definisi referensi juga sulit dimengerti. Bulu yang terlalu mewah.
sumber
map
?map(None, a, b, c)
ternyata dilakukanzip(a, b, c)
. Tetapi Anda sangat jarang melihatnya dalam praktik, justru karenazip
panggilan itu setara.tuple
adalah fungsi (well, ini lebih bernuansa dari itu, tetapi berperilaku seperti fungsi) yang mengambil iterable, dan memberi Anda tuple dengan elemen yang sama - jadituple([1, 2, 3])
setara dengan(1, 2, 3)
. Sebabmap(tuple, array)
,array
akan menjadi iterable dari iterables (pikirkan daftar daftar), dan itu memberi Anda kembali setiap daftar batin berubah menjadi tuple.Jawaban:
map
tidak terlalu pythonic. Saya akan merekomendasikan menggunakan daftar pemahaman sebagai gantinya:pada dasarnya setara dengan:
map
sendiri tidak dapat melakukan produk Cartesian, karena panjang daftar outputnya selalu sama dengan daftar inputnya. Anda dapat dengan mudah melakukan produk Cartesian dengan pemahaman daftar:Sintaksnya sedikit membingungkan - pada dasarnya setara dengan:
sumber
map
verbose jauh lebih sedikit daripada daftar pemahaman, setidaknya untuk kasus yang Anda tunjukkan.map
persamaannya[v.__name__ for v in (object, str)]
?map(lambda v: v.__name__, list)
?map
- kadang lebih cepat daripada pemahaman, kadang tidak, justru karena fungsi panggilan overhead? Secara khusus, heuristik yang saya pelajari adalah bahwa ketika menggunakanmap
mengharuskan Anda untuk memperkenalkan panggilan fungsi tambahan, pemahaman lebih cepat? Misalnya saya dituntun untuk percaya bahwamap(lambda foo: foo.bar, my_list)
itu lebih lambat daripadafoo.bar for foo in my_list
, dan bahkanmap(operator.add, my_list_of_pairs)
lebih lambat daripadax + y for x, y in my_list_of_pairs
, justru karena panggilan fungsi tambahan.map
sama sekali tidak berhubungan dengan produk Cartesian, meskipun saya membayangkan seseorang yang fasih dalam pemrograman fungsional dapat menghasilkan beberapa cara yang mustahil untuk memahami cara menghasilkan yang menggunakanmap
.map
di Python 3 setara dengan ini:dan satu-satunya perbedaan dalam Python 2 adalah bahwa ia akan membangun daftar lengkap hasil untuk mengembalikan sekaligus, bukan
yield
ing.Meskipun konvensi Python biasanya lebih suka daftar pemahaman (atau ekspresi generator) untuk mencapai hasil yang sama dengan panggilan
map
, terutama jika Anda menggunakan ekspresi lambda sebagai argumen pertama:Sebagai contoh dari apa yang Anda minta di komentar pada pertanyaan - "mengubah string menjadi array", dengan 'array' Anda mungkin ingin tuple atau daftar (keduanya berperilaku sedikit seperti array dari bahasa lain) -
Penggunaan di
map
sini adalah jika Anda mulai dengan daftar string alih-alih string tunggal -map
dapat mendaftarkan semuanya secara individual:Catatan yang
map(list, a)
setara dalam Python 2, tetapi dalam Python 3 Anda perlulist
panggilan jika Anda ingin melakukan apa pun selain memberi makan ke dalam satufor
lingkaran (atau fungsi pemrosesan sepertisum
itu hanya membutuhkan iterable, dan bukan urutan). Tetapi perhatikan juga bahwa pemahaman daftar biasanya lebih disukai:sumber
map
membuat daftar baru dengan menerapkan fungsi ke setiap elemen sumber:n-ary
map
setara dengan zipping input iterables bersama-sama dan kemudian menerapkan fungsi transformasi pada setiap elemen dari daftar ritsleting menengah. Ini bukan produk Cartesian:Saya telah menggunakan di
zip
sini, tetapimap
perilaku sebenarnya sedikit berbeda ketika iterables tidak memiliki ukuran yang sama - seperti dicatat dalam dokumentasinya, ia memperluas iterables untuk mengandungNone
.sumber
[2,4,6]
untuk pemahaman daftar dan loop eksplisit, tetapi peta mengembalikan objek peta - misalnya saya mendapatkan ini:<map at 0x123a49978>
Yang kemudian harus saya paksa masuk ke dalam daftar.Sederhanakan sedikit, Anda dapat membayangkan
map()
melakukan sesuatu seperti ini:Seperti yang Anda lihat, dibutuhkan fungsi dan daftar, dan mengembalikan daftar baru dengan hasil menerapkan fungsi ke masing-masing elemen dalam daftar input. Saya mengatakan "menyederhanakan sedikit" karena pada kenyataannya
map()
dapat memproses lebih dari satu iterable:Untuk bagian kedua dalam pertanyaan: Apa peran ini dalam membuat produk Cartesian? baik,
map()
bisa digunakan untuk menghasilkan produk kartesius dari daftar seperti ini:... Tapi jujur saja, menggunakan
product()
adalah cara yang lebih sederhana dan alami untuk menyelesaikan masalah:Either way, hasilnya adalah produk kartesius
lst
seperti yang didefinisikan di atas:sumber
Itu
map()
fungsi yang ada untuk menerapkan prosedur yang sama untuk setiap item dalam struktur data iterable, seperti daftar, generator, string, dan hal-hal lainnya.Mari kita lihat sebuah contoh:
map()
dapat mengulangi setiap item dalam daftar dan menerapkan fungsi untuk setiap item, daripada mengembalikan (memberikan Anda kembali) daftar baru.Bayangkan Anda memiliki fungsi yang mengambil angka, menambahkan 1 ke nomor itu dan mengembalikannya:
Anda juga memiliki daftar angka:
jika Anda ingin menambah setiap angka dalam daftar, Anda dapat melakukan hal berikut:
Catatan: Minimal
map()
membutuhkan dua argumen. Pertama nama fungsi dan kedua sesuatu seperti daftar.Mari kita lihat beberapa hal keren lainnya yang
map()
bisa dilakukan.map()
dapat mengambil beberapa iterables (daftar, string, dll.) dan meneruskan elemen dari setiap iterable ke fungsi sebagai argumen.Kami memiliki tiga daftar:
map()
dapat membuat Anda daftar baru yang menampung penambahan elemen pada indeks tertentu.Sekarang ingat
map()
, butuh fungsi. Kali ini kita akan menggunakansum()
fungsi bawaan . Berlarimap()
memberikan hasil sebagai berikut:INGAT:
Dalam Python 2
map()
, akan iterate (melalui elemen daftar) sesuai dengan daftar terpanjang, dan meneruskanNone
ke fungsi untuk daftar pendek, jadi fungsi Anda harus mencariNone
dan menanganinya, jika tidak, Anda akan mendapatkan kesalahan. Dalam Python 3map()
akan berhenti setelah selesai dengan daftar terpendek. Juga, dalam Python 3,map()
mengembalikan sebuah iterator, bukan daftar.sumber
Python3 - map (func, iterable)
Satu hal yang tidak disebutkan sepenuhnya (walaupun @BlooB menyebutkannya) adalah peta mengembalikan objek peta BUKAN daftar. Ini adalah perbedaan besar ketika datang ke kinerja waktu pada inisialisasi dan iterasi. Pertimbangkan dua tes ini.
Seperti yang Anda lihat, menginisialisasi fungsi peta hampir tidak memerlukan waktu sama sekali. Namun iterasi melalui objek peta membutuhkan waktu lebih lama daripada hanya iterasi melalui iterable. Ini berarti bahwa fungsi yang diteruskan ke peta () tidak diterapkan ke setiap elemen hingga elemen tersebut tercapai dalam iterasi. Jika Anda ingin daftar, gunakan daftar pemahaman. Jika Anda berencana untuk mengulanginya dalam for for loop dan akan pecah di beberapa titik, maka gunakan peta.
sumber