Saya berasal dari latar belakang OOP dan mencoba belajar python. Saya menggunakan max
fungsi yang menggunakan ekspresi lambda untuk mengembalikan instance bertipe Player
maksimum di totalScore
antara daftar players
.
def winner():
w = max(players, key=lambda p: p.totalScore)
Fungsi dengan benar mengembalikan instance bertipe Player
maksimum totalScore
. Saya bingung tentang tiga hal berikut:
- Bagaimana cara
max
kerjanya? Apa argumen yang diambilnya? Saya melihat dokumentasi tetapi gagal untuk mengerti. - Apa gunanya kata kunci
key
dalam fungsi maks? Saya tahu ini juga digunakan dalam kontekssort
fungsi - Arti ungkapan lambda? Bagaimana cara membacanya? Bagaimana mereka bekerja?
Ini semua adalah pertanyaan konseptual yang sangat noobish tetapi akan membantu saya memahami bahasa. Akan membantu jika Anda bisa memberikan contoh untuk menjelaskan. Terima kasih
python max lambda
dan mungkin sebenarnya lebih bermanfaat bagi pengguna baru.Jawaban:
lambda
adalah fungsi anonim, itu setara dengan:Sekarang
max
menjadi:Tetapi karena
def
pernyataan adalah pernyataan majemuk, mereka tidak dapat digunakan di mana ekspresi diperlukan, itulah sebabnya terkadanglambda
digunakan.Perhatikan bahwa
lambda
itu setara dengan apa yang Anda masukkan dalam pernyataan pengembalian adef
. Dengan demikian, Anda tidak dapat menggunakan pernyataan di dalamlambda
, hanya ekspresi yang diizinkan.Apa yang
max
harus dilakukanJadi, itu hanya mengembalikan objek yang terbesar.
Bagaimana cara
key
kerjanya?Secara default di Python 2
key
membandingkan item berdasarkan seperangkat aturan berdasarkan jenis objek (misalnya string selalu lebih besar dari integer).Untuk memodifikasi objek sebelum perbandingan, atau membandingkan berdasarkan atribut / indeks tertentu, Anda harus menggunakan
key
argumen.Contoh 1:
Contoh sederhana, misalkan Anda memiliki daftar angka dalam bentuk string, tetapi Anda ingin membandingkan item tersebut dengan nilai integernya.
Di sini
max
membandingkan item menggunakan nilai aslinya (string dibandingkan secara leksikografis sehingga Anda akan mendapatkan'2'
sebagai output):Untuk membandingkan item dengan menggunakan nilai integer mereka
key
dengan sederhanalambda
:Contoh 2: Menerapkan
max
ke daftar tupel.Secara default
max
akan membandingkan item dengan indeks pertama. Jika indeks pertama sama maka akan membandingkan indeks kedua. Seperti dalam contoh saya, semua item memiliki indeks pertama yang unik, jadi Anda akan mendapatkan ini sebagai jawabannya:Tetapi, bagaimana jika Anda ingin membandingkan setiap item dengan nilai pada indeks 1? Sederhana: gunakan
lambda
:Membandingkan item dalam iterable yang berisi objek dari tipe yang berbeda :
Daftar dengan barang-barang campuran:
Dalam Python 2 dimungkinkan untuk membandingkan item dari dua jenis :
Tetapi dalam Python 3 Anda tidak bisa melakukan itu lagi :
Tapi ini berhasil, karena kami membandingkan versi integer dari setiap objek:
sumber
lengths = map(lambda word: len(word), words)
manawords=['It', 'is', 'raining', 'cats', 'and', 'dogs']
saya melihat bahwa lambda mengulangi setiap kata dalam daftar. Apakah selalu melakukan ini?max
tidaklambda
(key
arg adalah opsional), dan selama iterasi setiap item diteruskan ke fungsi yang ditentukankey
dan nilai yang dikembalikan kemudian digunakan untuk perbandingan.max(lis, key=lambda x:int(x))
dapat disederhanakan sebagaimax(lis, key=int)
. Python memiliki fungsi bawaan, int (). Anda juga dapat menggunakan fungsi bawaan lainnya sebagaikey
argumen. Misalnya Anda bisa mendapatkan string terpanjang darilis=['a', 'aa', 'aaa']
olehmax(lis, key=len)
max
,min
,sorted
dll benar. Plus saya sebutkanmax(lis, key=int)
di bagian akhir. :-)Versi sangat disederhanakan dari
max
:Mengenai lambda:
sumber
Itu mencari item "terbesar" di iterable. Saya akan berasumsi bahwa Anda dapat mencari apa itu, tetapi jika tidak, itu adalah sesuatu yang dapat Anda putar, yaitu daftar atau string.
Key
adalah fungsi lambda yang akan memberi tahumax
objek mana di iterable yang lebih besar dari yang lain. Katakanlah jika Anda menyortir beberapa objek yang Anda buat sendiri, dan bukan sesuatu yang jelas, seperti bilangan bulat.Itu semacam pertanyaan yang lebih besar. Secara sederhana, lambda adalah fungsi yang bisa Anda sampaikan , dan minta kode lain menggunakannya. Ambil ini sebagai contoh:
Ini mengambil dua objek,
a
danb
, dan sebuah fungsif
. Ia memanggilf()
setiap objek, lalu menambahkannya bersama. Jadi lihatlah panggilan ini:sum()
mengambil2
, dan memanggil ekspresi lambda di atasnya. Jadif(a)
menjadi2 * 2
, yang menjadi 4. Kemudian melakukan ini untukb
, dan menambahkan keduanya bersama-sama.Dalam istilah yang tidak begitu sederhana, lambda berasal dari lambda calculus, yang merupakan gagasan tentang fungsi yang mengembalikan fungsi; konsep matematika yang sangat keren untuk mengekspresikan komputasi. Anda dapat membaca tentang itu di sini , dan kemudian benar-benar mengerti hal itu di sini .
Mungkin lebih baik membaca tentang ini sedikit lebih banyak, karena lambdas dapat membingungkan, dan itu tidak segera jelas seberapa berguna mereka. Periksa di sini .
sumber
max
fungsi digunakan untuk mendapatkan hasil maksimal dariiterable
.Iterator dapat berupa daftar, tupel, objek dict, dll. Atau bahkan objek kustom seperti pada contoh yang Anda berikan.
Jadi, pada
key=func
dasarnya memungkinkan kita untuk memberikan argumen opsionalkey
ke fungsi yang atas dasar iterator / argumen yang diberikan diurutkan & maksimum dikembalikan.lambda
adalah kata kunci python yang bertindak sebagai fungsi semu. Jadi, ketika Anda mengirimkanplayer
objek ke sana, itu akan kembaliplayer.totalScore
. Dengan demikian, iterable yang diteruskan ke fungsimax
akan mengurutkan sesuai dengankey
totalScore dariplayer
objek yang diberikan kepadanya & akan mengembalikanplayer
yang memiliki maksimumtotalScore
.Jika tidak ada
key
argumen yang diberikan, maksimum dikembalikan sesuai dengan urutan Python default.Contoh -
sumber
Menurut dokumentasi :
Apa yang dikatakan adalah bahwa dalam kasus Anda, Anda memberikan daftar, dalam hal ini
players
. Kemudianmax
fungsi akan beralih ke semua item dalam daftar dan membandingkannya satu sama lain untuk mendapatkan "maksimum".Seperti yang dapat Anda bayangkan, dengan objek yang kompleks seperti
player
menentukan nilainya untuk perbandingan itu rumit, jadi Anda diberikankey
argumen untuk menentukan bagaimanamax
fungsi akan menentukan nilai masing-masingplayer
. Dalam hal ini, Anda menggunakan fungsi lambda untuk mengatakan "untuk masing-masingp
diplayers
dapatkanp.totalscore
dan menggunakannya sebagai nilai untuk perbandingan".sumber
max
dibangun pada fungsi yang mengambil argumen pertamaiterable
(seperti daftar atau tuple)argumen kata kunci
key
memiliki nilai defaultNone
tetapi menerima fungsi untuk mengevaluasi, menganggapnya sebagai pembungkus yang mengevaluasi iterable berdasarkan fungsiPertimbangkan contoh kamus ini:
Ex:
Seperti yang Anda lihat jika Anda hanya meneruskan iterable tanpa kwarg (fungsi ke
key
) itu mengembalikan nilai kunci maksimum (berdasarkan abjad)Ex. Alih-alih menemukan nilai maksimal kunci secara abjad, Anda mungkin perlu menemukan kunci maks dengan panjang kunci:
dalam contoh ini fungsi lambda adalah mengembalikan panjang kunci yang akan diiterasi karenanya ketika mengevaluasi nilai alih-alih mempertimbangkan secara alfabetis akan melacak panjang maks kunci dan mengembalikan kunci yang memiliki panjang maks
Ex.
dalam contoh ini fungsi lambda adalah mengembalikan nilai kunci kamus terkait yang memiliki nilai maksimum
sumber