Tulis program python untuk menghitung angka genap dan ganjil dalam array bilangan bulat tertentu menggunakan lambda

Dalam tutorial ini, kita akan mempelajari fungsi anonim, yang biasa disebut fungsi lambda. Kami akan memahami apa itu, bagaimana menjalankannya, dan sintaksnya

Apa itu Fungsi Lambda di Python?

Fungsi Lambda di Python adalah fungsi anonim, menyiratkan mereka tidak memiliki nama. Kata kunci def diperlukan untuk membuat fungsi tipikal di Python, seperti yang sudah kita ketahui. Kita juga bisa menggunakan kata kunci lambda di Python untuk mendefinisikan fungsi tanpa nama

Sintaks Fungsi Python Lambda

Fungsi ini menerima jumlah input apa pun tetapi hanya mengevaluasi dan mengembalikan satu ekspresi

Fungsi Lambda dapat digunakan kapan pun argumen fungsi diperlukan. Selain bentuk formulasi lain dalam fungsi, ia memiliki berbagai aplikasi dalam domain pengkodean tertentu. Penting untuk diingat bahwa menurut sintaks, fungsi lambda terbatas pada satu pernyataan

Contoh Fungsi Lambda di Python

Contoh fungsi lambda yang menambahkan 4 ke nomor input ditampilkan di bawah

Kode

Keluaran

Fungsi lambda adalah "lambda num. num+4" dalam program yang diberikan. Parameternya adalah num, dan persamaan yang dihitung dan dikembalikan adalah num * 4

Tidak ada label untuk fungsi ini. Ini menghasilkan objek fungsi yang terkait dengan pengidentifikasi "tambah". Kita sekarang dapat menyebutnya sebagai fungsi standar. Pernyataan lambda, "lambda num. num+4", hampir sama dengan

Kode

Keluaran

Apa Perbedaan Antara Fungsi Lambda dan Def?

Mari kita lihat contoh ini untuk melihat bagaimana fungsi def yang ditentukan konvensional berbeda dari fungsi yang ditentukan menggunakan kata kunci lambda. Program ini menghitung kebalikan dari angka yang diberikan

Kode

Keluaran

Def keyword:  0.16666666666666666
Lambda keyword:  0.16666666666666666

Fungsi reciprocal() dan lambda_reciprocal() bertindak serupa dan seperti yang diharapkan dalam skenario sebelumnya. Mari kita lihat lebih dekat contoh di atas

Keduanya menghasilkan kebalikan dari angka tertentu tanpa menggunakan Lambda. Namun, kami ingin mendeklarasikan sebuah fungsi dengan nama resiprokal dan mengirim nomor ke sana saat menjalankan def. Kami juga diharuskan menggunakan kata kunci return untuk memberikan output dari mana pun fungsi dipanggil setelah dieksekusi

Menggunakan Lambda. Alih-alih pernyataan "kembali", definisi Lambda selalu menyertakan pernyataan yang diberikan pada output. Keindahan fungsi lambda adalah kenyamanannya. Kita tidak perlu mengalokasikan ekspresi lambda ke variabel karena kita dapat meletakkannya di sembarang tempat ketika fungsi diminta

Menggunakan Fungsi Lambda dengan filter()

Metode filter() menerima dua argumen dengan Python. fungsi dan iterable seperti daftar

Fungsi dipanggil untuk setiap item dari daftar, dan iterable atau daftar baru dikembalikan yang hanya menampung elemen-elemen yang mengembalikan True ketika diberikan ke fungsi

Berikut adalah ilustrasi sederhana penggunaan metode filter() untuk mengembalikan hanya angka ganjil dari daftar

Kode

Keluaran

Menggunakan Fungsi Lambda dengan map()

Metode dan daftar diteruskan ke fungsi map() Python

Fungsi dijalankan untuk semua elemen dalam daftar, dan daftar baru dihasilkan dengan elemen yang dihasilkan oleh fungsi yang diberikan untuk setiap item

Metode map() digunakan untuk mengkuadratkan semua entri dalam daftar dalam contoh ini

Kode

Keluaran

[4, 16, 25, 1, 9, 49, 64, 81, 100]
_

Menggunakan Fungsi Lambda dengan Pemahaman Daftar

Kami akan menerapkan fungsi lambda yang digabungkan dengan pemahaman daftar dan kata kunci lambda dengan perulangan for dalam contoh ini. Kami akan mencoba mencetak kuadrat angka dalam rentang 0 hingga 11

Kode

Keluaran

0 1 4 9 16 25 36 49 64 81 100 

Menggunakan Fungsi Lambda dengan if-else

Kami akan menggunakan fungsi lambda dengan blok if-else

Kode

Keluaran

Menggunakan Lambda dengan Berbagai Pernyataan

Beberapa ekspresi tidak diperbolehkan dalam fungsi lambda, tetapi kita dapat membuat 2 fungsi lambda atau lebih dan setelah itu memanggil ekspresi lambda kedua sebagai argumen untuk yang pertama. Mari gunakan lambda untuk menemukan elemen maksimum ketiga

Dalam dokumen ini, kita akan mengikuti tur fitur Python yang cocok untuk mengimplementasikan program dalam gaya fungsional. Setelah pengantar konsep pemrograman fungsional, kita akan melihat fitur bahasa seperti s dan s dan modul pustaka yang relevan seperti dan

Perkenalan

Bagian ini menjelaskan konsep dasar pemrograman fungsional;

Bahasa pemrograman mendukung penguraian masalah dalam beberapa cara berbeda

  • Sebagian besar bahasa pemrograman bersifat prosedural. program adalah daftar instruksi yang memberi tahu komputer apa yang harus dilakukan dengan input program. C, Pascal, dan bahkan shell Unix adalah bahasa prosedural

  • Dalam bahasa deklaratif, Anda menulis spesifikasi yang menjelaskan masalah yang harus dipecahkan, dan implementasi bahasa menentukan cara melakukan perhitungan secara efisien. SQL adalah bahasa deklaratif yang kemungkinan besar Anda kenal;

  • Program berorientasi objek memanipulasi kumpulan objek. Objek memiliki kondisi internal dan mendukung metode yang menanyakan atau mengubah kondisi internal ini dengan cara tertentu. Smalltalk dan Java adalah bahasa berorientasi objek. C++ dan Python adalah bahasa yang mendukung pemrograman berorientasi objek, tetapi tidak memaksakan penggunaan fitur berorientasi objek

  • Pemrograman fungsional menguraikan masalah menjadi serangkaian fungsi. Idealnya, fungsi hanya menerima input dan menghasilkan output, dan tidak memiliki keadaan internal yang memengaruhi output yang dihasilkan untuk input tertentu. Bahasa fungsional terkenal termasuk keluarga ML (Standard ML, OCaml, dan varian lainnya) dan Haskell

Perancang beberapa bahasa komputer memilih untuk menekankan satu pendekatan tertentu pada pemrograman. Hal ini sering membuat sulit untuk menulis program yang menggunakan pendekatan yang berbeda. Bahasa lain adalah bahasa multi-paradigma yang mendukung beberapa pendekatan berbeda. Lisp, C++, dan Python adalah multi-paradigma; . Dalam sebuah program besar, bagian yang berbeda dapat ditulis dengan menggunakan pendekatan yang berbeda;

Dalam program fungsional, input mengalir melalui serangkaian fungsi. Setiap fungsi beroperasi pada inputnya dan menghasilkan beberapa output. Gaya fungsional mencegah fungsi dengan efek samping yang mengubah keadaan internal atau membuat perubahan lain yang tidak terlihat dalam nilai kembalian fungsi. Fungsi yang tidak memiliki efek samping sama sekali disebut fungsional murni. Menghindari efek samping berarti tidak menggunakan struktur data yang diperbarui saat program berjalan;

Beberapa bahasa sangat ketat tentang kemurnian dan bahkan tidak memiliki pernyataan penugasan seperti

for line in file:
    # do something for each line
    ...
2 atau
for line in file:
    # do something for each line
    ...
3, tetapi sulit untuk menghindari semua efek samping, seperti mencetak ke layar atau menulis ke file disk. Contoh lainnya adalah pemanggilan fungsi or , yang keduanya tidak mengembalikan nilai yang berguna. Keduanya dipanggil hanya karena efek sampingnya mengirim beberapa teks ke layar atau menghentikan eksekusi sebentar

Program python yang ditulis dalam gaya fungsional biasanya tidak akan terlalu ekstrim untuk menghindari semua I/O atau semua tugas; . Misalnya, penerapan suatu fungsi akan tetap menggunakan penetapan ke variabel lokal, tetapi tidak akan mengubah variabel global atau memiliki efek samping lainnya

Pemrograman fungsional dapat dianggap kebalikan dari pemrograman berorientasi objek. Objek adalah kapsul kecil yang berisi beberapa keadaan internal bersama dengan kumpulan pemanggilan metode yang memungkinkan Anda mengubah keadaan ini, dan program terdiri dari membuat set perubahan keadaan yang tepat. Pemrograman fungsional ingin menghindari perubahan keadaan sebanyak mungkin dan bekerja dengan data yang mengalir antar fungsi. Di Python Anda dapat menggabungkan dua pendekatan dengan menulis fungsi yang mengambil dan mengembalikan instance yang mewakili objek dalam aplikasi Anda (pesan email, transaksi, dll. )

Desain fungsional mungkin tampak seperti kendala yang aneh untuk dikerjakan. Mengapa Anda harus menghindari objek dan efek samping?

  • Probabilitas formal

  • Modularitas

  • Komposabilitas

  • Kemudahan debugging dan pengujian

Probabilitas formal

Manfaat teoretis adalah lebih mudah untuk membangun bukti matematis bahwa program fungsional itu benar

Untuk waktu yang lama, para peneliti tertarik untuk menemukan cara untuk membuktikan bahwa program benar secara matematis. Ini berbeda dengan menguji program pada banyak masukan dan menyimpulkan bahwa keluarannya biasanya benar, atau membaca kode sumber program dan menyimpulkan bahwa kode terlihat benar;

Teknik yang digunakan untuk membuktikan program benar adalah dengan menuliskan invarian, properti dari input data dan variabel program yang selalu benar. Untuk setiap baris kode, Anda kemudian menunjukkan bahwa jika invarian X dan Y benar sebelum baris dieksekusi, invarian X' dan Y' yang sedikit berbeda adalah benar setelah baris dieksekusi. Ini berlanjut hingga Anda mencapai akhir program, di mana invarian harus sesuai dengan kondisi yang diinginkan pada keluaran program

Penghindaran penugasan pemrograman fungsional muncul karena penugasan sulit ditangani dengan teknik ini;

Sayangnya, membuktikan program benar sebagian besar tidak praktis dan tidak relevan dengan perangkat lunak Python. Bahkan program sepele membutuhkan bukti yang panjangnya beberapa halaman; . Bahkan jika Anda menulis atau membuat bukti, akan ada pertanyaan untuk memverifikasi bukti tersebut;

Modularitas

Manfaat yang lebih praktis dari pemrograman fungsional adalah memaksa Anda untuk memecahkan masalah Anda menjadi potongan-potongan kecil. Hasilnya, program lebih modular. Lebih mudah menentukan dan menulis fungsi kecil yang melakukan satu hal daripada fungsi besar yang melakukan transformasi rumit. Fungsi kecil juga lebih mudah dibaca dan untuk memeriksa kesalahan

Kemudahan debugging dan pengujian

Menguji dan men-debug program bergaya fungsional lebih mudah

Debugging disederhanakan karena fungsi umumnya kecil dan ditentukan dengan jelas. Saat program tidak berfungsi, setiap fungsi adalah titik antarmuka tempat Anda dapat memeriksa apakah datanya benar. Anda dapat melihat input dan output perantara untuk dengan cepat mengisolasi fungsi yang menyebabkan bug

Pengujian lebih mudah karena setiap fungsi adalah subjek potensial untuk pengujian unit. Fungsi tidak bergantung pada status sistem yang perlu direplikasi sebelum menjalankan pengujian;

Komposabilitas

Saat Anda mengerjakan program bergaya fungsional, Anda akan menulis sejumlah fungsi dengan input dan output yang bervariasi. Beberapa dari fungsi-fungsi ini akan terspesialisasi untuk aplikasi tertentu, tetapi yang lain akan berguna dalam berbagai macam program. Misalnya, fungsi yang mengambil jalur direktori dan mengembalikan semua file XML dalam direktori, atau fungsi yang mengambil nama file dan mengembalikan isinya, dapat diterapkan ke berbagai situasi.

Seiring waktu, Anda akan membentuk perpustakaan utilitas pribadi. Seringkali Anda akan merakit program baru dengan mengatur fungsi yang ada dalam konfigurasi baru dan menulis beberapa fungsi khusus untuk tugas saat ini

Iterator

Saya akan mulai dengan melihat fitur bahasa Python yang merupakan fondasi penting untuk menulis program bergaya fungsional. iterator

Iterator adalah objek yang mewakili aliran data; . Iterator Python harus mendukung metode yang disebut yang tidak memerlukan argumen dan selalu mengembalikan elemen berikutnya dari aliran. Jika tidak ada lagi elemen di aliran, harus memunculkan pengecualian. Iterator tidak harus terbatas;

Fungsi bawaan mengambil objek arbitrer dan mencoba mengembalikan iterator yang akan mengembalikan konten atau elemen objek, memunculkan jika objek tidak mendukung iterasi. Beberapa tipe data bawaan Python mendukung iterasi, yang paling umum adalah daftar dan kamus. Sebuah objek dipanggil jika Anda bisa mendapatkan iterator untuk itu

Anda dapat bereksperimen dengan antarmuka iterasi secara manual

>>> L = [1, 2, 3]
>>> it = iter(L)
>>> it  
<...iterator object at ...>
>>> it.__next__()  # same as next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

Python mengharapkan objek yang dapat diubah dalam beberapa konteks berbeda, yang paling penting adalah pernyataannya. Dalam pernyataan

>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
..     print(i)
2
3
5
7
11
13
_2, Y harus berupa iterator atau beberapa objek yang dapat membuat iterator. Kedua pernyataan ini setara

for i in iter(obj):
    print(i)

for i in obj:
    print(i)

Iterator dapat diwujudkan sebagai daftar atau tupel dengan menggunakan fungsi konstruktor atau

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_

Pembongkaran urutan juga mendukung iterator. jika Anda tahu sebuah iterator akan mengembalikan elemen N, Anda dapat mengekstraknya menjadi N-tuple

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
_

Fungsi bawaan seperti dan dapat mengambil satu argumen iterator dan akan mengembalikan elemen terbesar atau terkecil. Operator

>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
..     print(i)
2
3
5
7
11
13
8 dan
>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
..     print(i)
2
3
5
7
11
13
9 juga mendukung iterator.
>>> line_list = ['  line 1\n', 'line 2  \n', ' \n', '']

>>> # Generator expression -- returns iterator
>>> stripped_iter = (line.strip() for line in line_list)

>>> # List comprehension -- returns list
>>> stripped_list = [line.strip() for line in line_list]
0 benar jika X ditemukan di aliran yang dikembalikan oleh iterator. Anda akan mengalami masalah yang jelas jika iteratornya tidak terbatas;

Perhatikan bahwa Anda hanya dapat maju dalam sebuah iterator; . Objek Iterator secara opsional dapat memberikan kemampuan tambahan ini, tetapi protokol iterator hanya menentukan metode. Oleh karena itu, fungsi dapat menggunakan semua keluaran iterator, dan jika Anda perlu melakukan sesuatu yang berbeda dengan aliran yang sama, Anda harus membuat iterator baru

Tipe Data Yang Mendukung Iterator

Kita telah melihat bagaimana list dan tuple mendukung iterator. Bahkan, setiap jenis urutan Python, seperti string, secara otomatis akan mendukung pembuatan iterator

Memanggil kamus mengembalikan iterator yang akan mengulang kunci kamus

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
..      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
..     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12

Perhatikan bahwa dimulai dengan Python 3. 7, urutan iterasi kamus dijamin sama dengan urutan penyisipan. Di versi sebelumnya, perilaku tidak ditentukan dan dapat bervariasi di antara implementasi

Menerapkan ke kamus selalu mengulang kunci, tetapi kamus memiliki metode yang mengembalikan iterator lain. Jika Anda ingin mengulangi nilai atau pasangan kunci/nilai, Anda dapat secara eksplisit memanggil metode or untuk mendapatkan iterator yang sesuai

Konstruktor dapat menerima iterator yang mengembalikan aliran hingga

>>> stripped_list = [line.strip() for line in line_list
..                  if line != ""]
1 tupel

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}

File juga mendukung iterasi dengan memanggil metode hingga tidak ada lagi baris dalam file. Ini berarti Anda dapat membaca setiap baris file seperti ini

for line in file:
    # do something for each line
    ...

Set dapat mengambil kontennya dari iterable dan memungkinkan Anda melakukan iterasi pada elemen set

>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
..     print(i)
2
3
5
7
11
13
_

Ekspresi generator dan pemahaman daftar

Dua operasi umum pada output iterator adalah 1) melakukan beberapa operasi untuk setiap elemen, 2) memilih subset elemen yang memenuhi beberapa kondisi. Misalnya, diberi daftar string, Anda mungkin ingin menghapus spasi kosong dari setiap baris atau mengekstrak semua string yang berisi substring yang diberikan

Daftar pemahaman dan ekspresi generator (bentuk pendek. "listcomps" dan "genexps") adalah notasi ringkas untuk operasi semacam itu, yang dipinjam dari bahasa pemrograman fungsional Haskell (https. // www. haskell. org/). Anda dapat menghapus semua spasi putih dari aliran string dengan kode berikut

>>> line_list = ['  line 1\n', 'line 2  \n', ' \n', '']

>>> # Generator expression -- returns iterator
>>> stripped_iter = (line.strip() for line in line_list)

>>> # List comprehension -- returns list
>>> stripped_list = [line.strip() for line in line_list]

Anda hanya dapat memilih elemen tertentu dengan menambahkan kondisi

>>> stripped_list = [line.strip() for line in line_list
..                  if line != ""]
3

>>> stripped_list = [line.strip() for line in line_list
..                  if line != ""]

Dengan pemahaman daftar, Anda mendapatkan kembali daftar Python; . Ekspresi generator mengembalikan iterator yang menghitung nilai seperlunya, tidak perlu mewujudkan semua nilai sekaligus. Ini berarti pemahaman daftar tidak berguna jika Anda bekerja dengan iterator yang mengembalikan aliran tak terbatas atau jumlah data yang sangat besar. Ekspresi generator lebih disukai dalam situasi ini

Ekspresi generator dikelilingi oleh tanda kurung (“()”) dan pemahaman daftar diapit oleh tanda kurung siku (“[]”). Ekspresi generator memiliki bentuk

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
0

Sekali lagi, untuk pemahaman daftar hanya tanda kurung luar yang berbeda (tanda kurung siku bukan tanda kurung)

Elemen dari keluaran yang dihasilkan akan menjadi nilai berurutan dari

>>> stripped_list = [line.strip() for line in line_list
..                  if line != ""]
5. Klausa
>>> stripped_list = [line.strip() for line in line_list
..                  if line != ""]
_6 semuanya opsional;

Ekspresi generator selalu harus ditulis di dalam tanda kurung, tetapi tanda kurung yang menandakan pemanggilan fungsi juga dihitung. Jika Anda ingin membuat iterator yang akan segera diteruskan ke suatu fungsi, Anda dapat menulis

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
1

Klausa

>>> stripped_list = [line.strip() for line in line_list
..                  if line != ""]
_9 berisi urutan yang akan diulang. Urutan tidak harus sama panjang, karena diulang dari kiri ke kanan, tidak paralel. Untuk setiap elemen di
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
00,
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
01 diulang dari awal.
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
02 kemudian diulang untuk setiap pasangan elemen yang dihasilkan dari
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
00 dan
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
01

Dengan kata lain, pemahaman daftar atau ekspresi generator setara dengan kode Python berikut

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
2

Ini berarti bahwa ketika ada beberapa klausa

>>> stripped_list = [line.strip() for line in line_list
..                  if line != ""]
_9 tetapi tidak ada
>>> stripped_list = [line.strip() for line in line_list
..                  if line != ""]
6 klausa, panjang output yang dihasilkan akan sama dengan produk dari panjang semua urutan. Jika Anda memiliki dua daftar dengan panjang 3, daftar keluaran panjangnya 9 elemen

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
3

Untuk menghindari ambiguitas dalam tata bahasa Python, jika

>>> stripped_list = [line.strip() for line in line_list
..                  if line != ""]
5 membuat tuple, tuple harus dikelilingi dengan tanda kurung. Pemahaman daftar pertama di bawah ini adalah kesalahan sintaksis, sedangkan yang kedua benar

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
4

Generator

Generator adalah kelas fungsi khusus yang menyederhanakan tugas penulisan iterator. Fungsi reguler menghitung nilai dan mengembalikannya, tetapi generator mengembalikan iterator yang mengembalikan aliran nilai

Anda pasti sudah familiar dengan cara kerja pemanggilan fungsi biasa di Python atau C. Saat Anda memanggil suatu fungsi, ia mendapat ruang nama pribadi tempat variabel lokalnya dibuat. Saat fungsi mencapai pernyataan

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08, variabel lokal dihancurkan dan nilainya dikembalikan ke pemanggil. Panggilan selanjutnya ke fungsi yang sama membuat ruang nama pribadi baru dan sekumpulan variabel lokal baru. Namun, bagaimana jika variabel lokal tidak dibuang saat keluar dari suatu fungsi?

Inilah contoh paling sederhana dari fungsi generator

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
5

Fungsi apa pun yang mengandung kata kunci adalah fungsi generator;

Saat Anda memanggil fungsi generator, itu tidak mengembalikan nilai tunggal; . Saat mengeksekusi ekspresi

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
09, generator mengeluarkan nilai
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
11, mirip dengan pernyataan
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08. Perbedaan besar antara
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
09 dan pernyataan
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08 adalah bahwa saat mencapai
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
09 status eksekusi generator ditangguhkan dan variabel lokal dipertahankan. Pada panggilan selanjutnya ke metode generator, fungsi akan melanjutkan eksekusi

Berikut adalah contoh penggunaan generator

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
_17

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
6

Anda juga bisa menulis

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
18, atau
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
19

Di dalam fungsi generator,

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
20 menyebabkan
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
21 dibangkitkan dari metode. Setelah ini terjadi, atau bagian bawah fungsi tercapai, prosesi nilai berakhir dan generator tidak dapat menghasilkan nilai lebih lanjut

Anda dapat mencapai efek generator secara manual dengan menulis kelas Anda sendiri dan menyimpan semua variabel lokal generator sebagai variabel instan. Misalnya, mengembalikan daftar bilangan bulat dapat dilakukan dengan menyetel

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
23 ke 0, dan memiliki kenaikan metode
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
23 dan mengembalikannya. Namun, untuk generator yang cukup rumit, menulis kelas yang sesuai bisa jauh lebih berantakan

Suite pengujian disertakan dengan pustaka Python, Lib/test/test_generators. py, berisi sejumlah contoh yang lebih menarik. Inilah salah satu generator yang mengimplementasikan traversal berurutan dari sebuah pohon menggunakan generator secara rekursif

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
7

Dua contoh lain di

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
26 menghasilkan solusi untuk masalah N-Queens (menempatkan N ratu di papan catur NxN sehingga tidak ada ratu yang mengancam yang lain) dan Knight's Tour (menemukan rute yang membawa seorang ksatria ke setiap petak papan catur NxN tanpa mengunjungi

Melewati nilai ke generator

Dalam Python2. 4 dan sebelumnya, generator hanya menghasilkan output. Setelah kode generator dipanggil untuk membuat iterator, tidak ada cara untuk meneruskan informasi baru apa pun ke dalam fungsi saat eksekusi dilanjutkan. Anda dapat meretas kemampuan ini dengan membuat generator melihat variabel global atau dengan mengirimkan beberapa objek yang dapat diubah yang kemudian dimodifikasi oleh penelepon, tetapi pendekatan ini berantakan

Dalam Python2. 5 ada cara sederhana untuk meneruskan nilai ke generator. menjadi ekspresi, mengembalikan nilai yang dapat diberikan ke variabel atau dioperasikan

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
_8

Saya sarankan Anda selalu meletakkan tanda kurung di sekitar ekspresi

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
09 saat Anda melakukan sesuatu dengan nilai yang dikembalikan, seperti pada contoh di atas. Tanda kurung tidak selalu diperlukan, tetapi lebih mudah untuk selalu menambahkannya daripada harus mengingat saat dibutuhkan

(PEP 342 menjelaskan aturan yang tepat, yaitu bahwa ekspresi

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
09 harus selalu dalam tanda kurung kecuali ketika itu terjadi pada ekspresi tingkat atas di sisi kanan tugas. Ini berarti Anda dapat menulis
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
30 tetapi harus menggunakan tanda kurung ketika ada operasi, seperti pada
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
31. )

Nilai dikirim ke generator dengan memanggil metodenya. Metode ini melanjutkan kode generator dan ekspresi

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
09 mengembalikan nilai yang ditentukan. Jika metode reguler dipanggil,
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
_09 mengembalikan
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
36

Ini adalah penghitung sederhana yang bertambah 1 dan memungkinkan perubahan nilai penghitung internal

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
_9

Dan inilah contoh mengubah penghitung

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_0

Karena

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
_09 akan sering kembali ________7______36, Anda harus selalu memeriksa kasus ini. Jangan hanya menggunakan nilainya dalam ekspresi kecuali Anda yakin bahwa metode tersebut akan menjadi satu-satunya metode yang digunakan untuk melanjutkan fungsi generator Anda

Selain , ada dua metode lain pada generator

  • digunakan untuk memunculkan pengecualian di dalam generator;

  • memunculkan pengecualian di dalam generator untuk menghentikan iterasi. Saat menerima pengecualian ini, kode generator harus menaikkan atau ; . juga akan dipanggil oleh pengumpul sampah Python saat generator mengumpulkan sampah

    Jika Anda perlu menjalankan kode pembersihan saat terjadi, saya sarankan menggunakan suite

    for i in iter(obj):
        print(i)
    
    for i in obj:
        print(i)
    
    50 daripada menangkap

Efek kumulatif dari perubahan ini adalah mengubah generator dari produsen informasi satu arah menjadi produsen dan konsumen

Generator juga menjadi coroutine, bentuk subrutin yang lebih umum. Subrutin dimasukkan pada satu titik dan keluar pada titik lain (bagian atas fungsi, dan pernyataan

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08), tetapi coroutine dapat dimasukkan, keluar, dan dilanjutkan di berbagai titik (pernyataan
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
09)

Fungsi bawaan

Mari kita lihat lebih detail fungsi bawaan yang sering digunakan dengan iterator

Dua fungsi bawaan Python, dan duplikat fitur ekspresi generator

mengembalikan iterator atas urutan

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
_57

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_1

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_2

Anda tentu saja dapat mencapai efek yang sama dengan pemahaman daftar

mengembalikan iterator atas semua elemen urutan yang memenuhi kondisi tertentu, dan juga digandakan oleh pemahaman daftar. Predikat adalah fungsi yang mengembalikan nilai kebenaran dari suatu kondisi;

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_3

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_4

Ini juga dapat ditulis sebagai pemahaman daftar

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_5

menghitung elemen dalam iterable return 2-tuple yang berisi hitungan (dari awal) dan setiap elemen

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_6

sering digunakan saat mengulang daftar dan merekam indeks di mana kondisi tertentu terpenuhi

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_7

mengumpulkan semua elemen iterable ke dalam daftar, mengurutkan daftar, dan mengembalikan hasil yang diurutkan. Argumen kunci dan kebalikan diteruskan ke metode daftar yang dibangun

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_8

(Untuk diskusi yang lebih rinci tentang penyortiran, lihat. )

The and built-in melihat nilai kebenaran dari konten iterable. mengembalikan

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
_67 jika ada elemen dalam iterable adalah nilai sebenarnya, dan mengembalikan
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
67 jika semua elemen adalah nilai sebenarnya

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_9

mengambil satu elemen dari setiap iterable dan mengembalikannya dalam sebuah tuple

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
_0

Itu tidak membuat daftar dalam memori dan menghabiskan semua iterator input sebelum kembali; . (Istilah teknis untuk perilaku ini adalah evaluasi malas. )

Iterator ini dimaksudkan untuk digunakan dengan iterable yang semuanya memiliki panjang yang sama. Jika iterable memiliki panjang yang berbeda, aliran yang dihasilkan akan memiliki panjang yang sama dengan iterable terpendek

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
_1

Anda harus menghindari melakukan ini, karena sebuah elemen dapat diambil dari iterator yang lebih panjang dan dibuang. Ini berarti Anda tidak dapat menggunakan iterator lebih lanjut karena Anda berisiko melewatkan elemen yang dibuang

Modul itertools

Modul berisi sejumlah iterator yang umum digunakan serta fungsi untuk menggabungkan beberapa iterator. Bagian ini akan memperkenalkan isi modul dengan menunjukkan contoh-contoh kecil

Fungsi modul terbagi dalam beberapa kelas besar

  • Fungsi yang membuat iterator baru berdasarkan iterator yang sudah ada

  • Fungsi untuk memperlakukan elemen iterator sebagai argumen fungsi

  • Fungsi untuk memilih bagian dari keluaran iterator

  • Fungsi untuk mengelompokkan keluaran iterator

Membuat iterator baru

mengembalikan aliran tak terbatas dari nilai-nilai yang berjarak sama. Secara opsional, Anda dapat memberikan nomor awal, yang defaultnya adalah 0, dan interval antar angka, yang defaultnya adalah 1

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
_2

menyimpan salinan konten iterable yang disediakan dan mengembalikan iterator baru yang mengembalikan elemennya dari awal hingga akhir. Iterator baru akan mengulangi elemen-elemen ini tanpa batas

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
_3

mengembalikan elemen yang disediakan n kali, atau mengembalikan elemen tanpa henti jika n tidak disediakan

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
_4

mengambil jumlah iterable yang berubah-ubah sebagai input, dan mengembalikan semua elemen dari iterator pertama, lalu semua elemen dari iterable kedua, dan seterusnya, hingga semua iterable telah habis

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
_5

mengembalikan aliran yang merupakan bagian dari iterator. Dengan argumen stop tunggal, ini akan mengembalikan elemen stop pertama. Jika Anda memberikan indeks awal, Anda akan mendapatkan elemen stop-start, dan jika Anda memberikan nilai untuk langkah, elemen akan dilewati sesuai dengan itu. Tidak seperti pemotongan string dan daftar Python, Anda tidak dapat menggunakan nilai negatif untuk mulai, berhenti, atau melangkah

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
_6

mereplikasi iterator; . Jika Anda tidak memberikan nilai untuk n, standarnya adalah 2. Replikasi iterator memerlukan penyimpanan beberapa konten dari iterator sumber, jadi ini dapat menghabiskan banyak memori jika iteratornya besar dan salah satu iterator baru dikonsumsi lebih banyak daripada yang lain

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
_7

Memanggil fungsi pada elemen

Modul berisi satu set fungsi yang sesuai dengan operator Python. Beberapa contohnya adalah (menambahkan dua nilai), (sama seperti

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
81), dan (mengembalikan callable yang mengambil atribut
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
83)

mengasumsikan bahwa iterable akan mengembalikan aliran tupel, dan memanggil func menggunakan tupel ini sebagai argumen

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
_8

Memilih elemen

Grup fungsi lain memilih subset elemen iterator berdasarkan predikat

adalah kebalikan dari , mengembalikan semua elemen yang predikatnya mengembalikan salah

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
_9

mengembalikan elemen selama predikat mengembalikan true. Setelah predikat kembali salah, iterator akan menandakan akhir dari hasilnya

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
..      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
..     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
0

membuang elemen sementara predikat mengembalikan true, dan kemudian mengembalikan sisa hasil iterable

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
..      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
..     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
1

mengambil dua iterator dan mengembalikan hanya elemen data yang elemen penyeleksinya benar, berhenti setiap kali salah satunya habis

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
..      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
..     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
2

Fungsi kombinatorik

Mengembalikan sebuah iterator yang memberikan semua kemungkinan kombinasi r-tuple dari elemen-elemen yang terkandung dalam iterable

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
..      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
..     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
_3

Elemen-elemen dalam setiap tuple tetap dalam urutan yang sama seperti iterable mengembalikannya. Misalnya angka 1 selalu sebelum 2, 3, 4, atau 5 pada contoh di atas. Fungsi serupa, , menghilangkan kendala ini pada pesanan, mengembalikan semua pengaturan yang mungkin dengan panjang r

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
..      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
..     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
4

Jika Anda tidak memberikan nilai untuk r panjang iterable digunakan, artinya semua elemen permutasi

Perhatikan bahwa fungsi ini menghasilkan semua kemungkinan kombinasi berdasarkan posisi dan tidak mengharuskan konten iterable unik

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
..      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
..     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
5

Tuple identik

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
92 muncul dua kali, tetapi dua string 'a' berasal dari posisi yang berbeda

Fungsi melonggarkan kendala yang berbeda. elemen dapat diulang dalam satu tuple. Secara konseptual sebuah elemen dipilih untuk posisi pertama dari setiap tuple dan kemudian diganti sebelum elemen kedua dipilih

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
..      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
..     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
6

Mengelompokkan elemen

Fungsi terakhir yang akan saya bahas, , adalah yang paling rumit.

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
95 adalah fungsi yang dapat menghitung nilai kunci untuk setiap elemen yang dikembalikan oleh iterable. Jika Anda tidak menyediakan fungsi kunci, kuncinya hanyalah setiap elemen itu sendiri

mengumpulkan semua elemen berturut-turut dari iterable yang mendasarinya yang memiliki nilai kunci yang sama, dan mengembalikan aliran 2-tupel yang berisi nilai kunci dan iterator untuk elemen dengan kunci itu

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
..      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
..     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
7

mengasumsikan bahwa konten iterable yang mendasarinya sudah diurutkan berdasarkan kunci. Perhatikan bahwa iterator yang dikembalikan juga menggunakan iterable yang mendasarinya, jadi Anda harus menggunakan hasil iterator-1 sebelum meminta iterator-2 dan kunci yang sesuai

Modul functools

Modul ini berisi beberapa fungsi tingkat tinggi. Fungsi tingkat tinggi mengambil satu atau lebih fungsi sebagai input dan mengembalikan fungsi baru. Alat yang paling berguna dalam modul ini adalah fungsi

Untuk program yang ditulis dalam gaya fungsional, terkadang Anda ingin membuat varian dari fungsi yang sudah ada yang memiliki beberapa parameter yang terisi. Pertimbangkan fungsi Python

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
00; . Ini disebut "aplikasi fungsi parsial"

Konstruktor untuk mengambil argumen

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_05. Objek yang dihasilkan dapat dipanggil, jadi Anda bisa memanggilnya untuk memanggil
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
06 dengan argumen yang diisi

Ini contoh kecil tapi realistis

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
..      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
..     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
8

secara kumulatif melakukan operasi pada semua elemen iterable dan, oleh karena itu, tidak dapat diterapkan pada iterable tak terbatas. func harus berupa fungsi yang mengambil dua elemen dan mengembalikan satu nilai. mengambil dua elemen pertama A dan B dikembalikan oleh iterator dan menghitung

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
09. Ini kemudian meminta elemen ketiga, C, menghitung
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
10, menggabungkan hasil ini dengan elemen keempat yang dikembalikan, dan berlanjut hingga iterable habis. Jika iterable tidak mengembalikan nilai sama sekali, pengecualian akan dimunculkan. Jika nilai awal diberikan, ini digunakan sebagai titik awal dan
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
12 adalah perhitungan pertama

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
..      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
..     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
_9

Jika Anda menggunakan with , Anda akan menjumlahkan semua elemen iterable. Kasing ini sangat umum sehingga ada panggilan bawaan khusus untuk menghitungnya

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
0

Namun, untuk banyak penggunaan , akan lebih jelas jika hanya menulis loop yang jelas

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
1

Fungsi terkait adalah. Itu melakukan perhitungan yang sama, tetapi alih-alih hanya mengembalikan hasil akhir,

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
19 mengembalikan iterator yang juga menghasilkan setiap hasil parsial

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
2

Modul operator

Modul telah disebutkan sebelumnya. Ini berisi sekumpulan fungsi yang sesuai dengan operator Python. Fungsi-fungsi ini sering berguna dalam kode gaya fungsional karena menyelamatkan Anda dari menulis fungsi-fungsi sepele yang melakukan satu operasi

Beberapa fungsi dalam modul ini adalah

  • Operasi matematika.

    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    21,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    22,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    23,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    24,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    25, …

  • Operasi logis.

    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    _26,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    27

  • Operasi bitwise.

    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    _28,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    29,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    30

  • Perbandingan.

    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    _31,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    32,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    33,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    34,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    35, dan
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    36

  • Identitas objek.

    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    _37,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    38

Konsultasikan dokumentasi modul operator untuk daftar lengkap

Fungsi kecil dan ekspresi lambda

Saat menulis program bergaya fungsional, Anda sering membutuhkan sedikit fungsi yang berfungsi sebagai predikat atau menggabungkan elemen dalam beberapa cara

Jika ada built-in Python atau fungsi modul yang cocok, Anda tidak perlu mendefinisikan fungsi baru sama sekali

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
3

Jika fungsi yang Anda butuhkan tidak ada, Anda perlu menulisnya. Salah satu cara untuk menulis fungsi kecil adalah dengan menggunakan ekspresi.

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_39 mengambil sejumlah parameter dan ekspresi yang menggabungkan parameter ini, dan membuat fungsi anonim yang mengembalikan nilai ekspresi

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
_4

Alternatifnya adalah dengan menggunakan pernyataan

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_41 dan mendefinisikan fungsi dengan cara biasa

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
5

Alternatif mana yang lebih disukai?

Salah satu alasan preferensi saya adalah bahwa

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_39 sangat terbatas dalam fungsi yang dapat didefinisikannya. Hasilnya harus dapat dihitung sebagai ekspresi tunggal, yang berarti Anda tidak dapat memiliki
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
44 perbandingan atau
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
45 pernyataan multiway. Jika Anda mencoba melakukan terlalu banyak dalam pernyataan ________8______39, Anda akan berakhir dengan ekspresi yang terlalu rumit yang sulit dibaca. Cepat, apa yang dilakukan kode berikut?

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
6

Anda bisa mengetahuinya, tetapi butuh waktu untuk menguraikan ekspresi untuk mencari tahu apa yang terjadi. Menggunakan pernyataan pendek

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_41 membuat segalanya sedikit lebih baik

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
7

Tapi akan lebih baik jika saya hanya menggunakan

>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
..     print(i)
2
3
5
7
11
13
1 loop

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
8

Atau built-in dan ekspresi generator

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
_9

Banyak penggunaan lebih jelas bila ditulis sebagai

>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
..     print(i)
2
3
5
7
11
13
1 loop

Fredrik Lundh pernah menyarankan seperangkat aturan berikut untuk refactoring menggunakan

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
39

  1. Tulis fungsi lambda

  2. Tulis komentar yang menjelaskan apa yang dilakukan lambda

  3. Pelajari komentar tersebut sebentar, dan pikirkan nama yang menangkap inti dari komentar tersebut

  4. Ubah lambda menjadi pernyataan def, menggunakan nama itu

  5. Hapus komentar

Saya sangat menyukai aturan ini, tetapi Anda bebas untuk tidak setuju apakah gaya bebas lambda ini lebih baik

Riwayat Revisi dan Ucapan Terima Kasih

Penulis ingin mengucapkan terima kasih kepada orang-orang berikut untuk menawarkan saran, koreksi dan bantuan dengan berbagai draf artikel ini. Ian Bicking, Nick Coghlan, Nick Efford, Raymond Hettinger, Jim Jewett, Mike Krell, Leandro Lameiro, Jussi Salmela, Collin Winter, Blake Winton

Versi 0. 1. diposting 30 Juni 2006

Versi 0. 11. diposting 1 Juli 2006. Perbaikan salah ketik

Versi 0. 2. diposting 10 Juli 2006. Menggabungkan bagian genexp dan listcomp menjadi satu. Perbaikan salah ketik

Versi 0. 21. Menambahkan lebih banyak referensi yang disarankan di milis tutor

Versi 0. 30. Menambahkan bagian pada modul

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
_53 yang ditulis oleh Collin Winter;

Referensi

Umum

Struktur dan Interpretasi Program Komputer, oleh Harold Abelson dan Gerald Jay Sussman bersama Julie Sussman. Teks lengkap di https. // mit tekan. mit. pendidikan/sicp/. Dalam buku teks klasik ilmu komputer ini, bab 2 dan 3 membahas penggunaan urutan dan aliran untuk mengatur aliran data di dalam sebuah program. Buku ini menggunakan Skema untuk contohnya, tetapi banyak dari pendekatan desain yang dijelaskan dalam bab-bab ini dapat diterapkan pada kode Python bergaya fungsional

https. // www. defmacro. org/ramblings/fp. html. Pengenalan umum untuk pemrograman fungsional yang menggunakan contoh Java dan memiliki pengenalan sejarah yang panjang

https. //en. wikipedia. org/wiki/Pemrograman_Fungsional. Entri Wikipedia umum yang menjelaskan pemrograman fungsional

https. // en. wikipedia. org/wiki/Coroutine. Entri untuk coroutine

https. //en. wikipedia. org/wiki/Curry. Masuk untuk konsep kari

Khusus Python

https. //gnosis. cx/TPiP/. Bab pertama dari buku David Mertz Pemrosesan Teks dengan Python membahas pemrograman fungsional untuk pemrosesan teks, di bagian berjudul "Memanfaatkan Fungsi Orde Tinggi dalam Pemrosesan Teks"

Mertz juga menulis serangkaian artikel 3 bagian tentang pemrograman fungsional untuk situs DeveloperWorks IBM;