Katakanlah kita memiliki fungsi add sebagai berikut
def add(x, y):
return x + y
kami ingin menerapkan fungsi peta untuk sebuah array
map(add, [1, 2, 3], 2)
Semantiknya adalah saya ingin menambahkan 2 ke setiap elemen array. Tetapi map
fungsinya membutuhkan daftar pada argumen ketiga juga.
Catatan: Saya menempatkan contoh tambahkan untuk kesederhanaan. Fungsi asli saya jauh lebih rumit. Dan tentu saja opsi pengaturan nilai default y
dalam fungsi add tidak dipertanyakan karena akan diubah untuk setiap panggilan.
map(add,[1,2,3],[2]*3)
secara umummap
mengambil fungsi sebagai argumen pertama, dan jika fungsi ini mengambil argumen K , Anda harus menindaklanjuti dengan K iterable:addTriple(a,b,c) -> map(addTriple,[...],[...],[...])
Jawaban:
Salah satu opsi adalah pemahaman daftar:
Lebih banyak pilihan:
sumber
add()
fungsi non-sepelemap()
tidak akan membantu.map()
berperilaku sepertizip_longest()
di Python 2, sementara itu berperilaku sepertizip()
di Python 3.)Dokumen secara eksplisit menyarankan ini adalah penggunaan utama untuk
itertools.repeat
:Dan tidak ada alasan untuk lulus
len([1,2,3])
sebagaitimes
argumen;map
berhenti segera setelah iterable pertama dikonsumsi, sehingga iterable tak terbatas baik-baik saja:Bahkan, ini setara dengan contoh
repeat
dalam dokumen:Ini membuat solusi malas-fungsional-bahasa-y yang bagus yang juga dapat dibaca dengan sempurna dalam istilah Python-iterator.
sumber
def f(x,y,z): \\ return '.'.join([x,y,z])
lalu:list(map(f, list('abc'), repeat('foo'), list('defgh')))
kembali['a.foo.d', 'b.foo.e', 'c.foo.f']
.repeat()
, karenamap()
akan berjalan sampai iterator terpanjang habis dalam versi Python itu, mengisiNone
semua nilai yang hilang. Mengatakan bahwa "tidak ada alasan" untuk melewatkan parameter salah.Gunakan pemahaman daftar.
Jika Anda benar-benar , benar-benar , benar-benar ingin menggunakan
map
, memberikan fungsi anonim sebagai argumen pertama:sumber
Peta dapat berisi banyak argumen, cara standarnya adalah
Dalam pertanyaan Anda, seharusnya
sumber
Jawaban yang benar lebih sederhana dari yang Anda pikirkan. Cukup lakukan:
Dan mengubah implementasi add untuk mengambil tuple yaitu
Ini dapat menangani setiap kasus penggunaan yang rumit di mana kedua parameter add bersifat dinamis.
sumber
Kadang-kadang saya menyelesaikan situasi serupa (seperti menggunakan metode pandas. Apply ) menggunakan penutupan
Untuk menggunakannya, Anda mendefinisikan fungsi yang secara dinamis mendefinisikan dan mengembalikan pembungkus untuk fungsi Anda, secara efektif membuat salah satu parameter menjadi konstan.
Sesuatu seperti ini:
Lalu,
add_constant(y)
kembalikan fungsi yang bisa digunakan untuk menambahy
nilai apa pun yang diberikan:Yang memungkinkan Anda untuk menggunakannya dalam situasi apa pun di mana parameter diberikan satu per satu:
sunting
Jika Anda tidak ingin harus menulis fungsi penutupan di tempat lain, Anda selalu memiliki kemungkinan untuk membuatnya dengan menggunakan fungsi lambda:
sumber
Jika Anda memilikinya tersedia, saya akan mempertimbangkan menggunakan numpy. Ini sangat cepat untuk jenis operasi ini:
Ini dengan asumsi aplikasi nyata Anda melakukan operasi matematika (yang dapat di-vektor).
sumber
Jika Anda benar-benar perlu menggunakan fungsi peta (seperti tugas kelas saya di sini ...), Anda dapat menggunakan fungsi wrapper dengan 1 argumen, meneruskan sisanya ke yang asli di tubuhnya; yaitu:
Kotor & jelek, masih melakukan trik
sumber
myFunc
perlureturn Func(arg, extraArguments)
Func
adalah nama fungsi asli Anda - untuk OP ketatadd
misalnyaSaya percaya starmap adalah yang Anda butuhkan:
sumber
Untuk meneruskan beberapa argumen ke suatu
map
fungsi.Di sini q adalah fungsi dengan beberapa argumen yang memetakan () panggilan. Pastikan, panjang kedua rentang yaitu
sumber
Di :
nums = [1, 2, 3]
Di :
map(add, nums, [2]*len(nums))
Di luar:
[3, 4, 5]
sumber
Anda dapat memasukkan lambda bersama dengan peta:
sumber
Dengan membungkus panggilan fungsi dengan lambda dan menggunakan membongkar bintang, Anda dapat melakukan peta dengan sejumlah argumen sewenang-wenang.
sumber
Pilihan lain adalah:
Format ini sangat berguna saat memanggil beberapa fungsi.
sumber