Pengantar Python Functools

Hai, Habrovsk. Kami telah menyiapkan terjemahan bahan lain yang bermanfaat sebelum dimulainya kursus Pengembang Python .




Python adalah bahasa pemrograman berorientasi objek tingkat tinggi. Salah satu keuntungan terbesar Python adalah ia memiliki fungsi khusus yang memungkinkan Anda untuk menulis kode yang dapat digunakan kembali menggunakan alat bahasa bawaan.

Functools adalah pustaka Python yang dirancang untuk bekerja dengan fungsi tingkat tinggi. Fungsi tersebut dapat mengambil fungsi lain dan mengembalikan fungsi. Mereka membantu pengembang menulis kode yang dapat digunakan kembali. Fungsi dapat digunakan atau diperluas tanpa menulis ulang sepenuhnya. Modul functools di Python menyediakan berbagai alat yang memungkinkan Anda untuk mencapai efek yang dijelaskan. Misalnya, berikut ini:

  • Sebagian
  • Pemesanan penuh;
  • update_wrapperuntuk parsial .

Fungsi parsial adalah salah satu alat utama yang disediakan oleh functools . Mari kita cari tahu dengan contoh-contoh.

Fitur parsial dalam Python


Dalam modul functools , fungsi parsial dianggap sebagai salah satu alat yang paling penting. Menggunakan fungsi parsial , Anda dapat mengganti fungsi yang sudah ada yang telah melewati argumen. Selain itu, kami juga dapat membuat versi baru dari fungsi dengan menambahkan dokumentasi berkualitas.

Kita dapat membuat fungsi baru dengan memberikan argumen parsial. Kami juga dapat membekukan beberapa argumen fungsi, yang akan mengarah pada tampilan objek baru. Cara lain untuk merepresentasikan parsial , adalah dengan bantuannya kita dapat membuat fungsi dengan nilai default. Sebagian mendukung kata kunci dan argumen posisi sebagai diperbaiki.
Mari kita lihat contohnya.

Bagaimana cara membuat fungsi parsial ?


Untuk membuat fungsi parsial , gunakan functoolspartial() dari perpustakaan . Itu ditulis sebagai berikut:

partial(func, /, *args, ** kwargs)

Jadi, Anda membuat fungsi parsial yang memanggil func , melewatinya dengan kata kunci dan argumen posisional. Di sini, beberapa argumen yang diperlukan biasanya diteruskan untuk memanggil fungsi func . Argumen yang tersisa dilewatkan dalam * args dan ** kwargs .

Misalkan fungsi di bawah ini menambahkan dua angka:

def multiply(x, y):
 
    return x * y

Sekarang perhatikan kasus ketika kami perlu menggandakan atau melipatgandakan nomor yang diberikan. Dalam hal ini, kami mendefinisikan fungsi baru seperti yang ditunjukkan di bawah ini:

def multiply(x, y):
        return x * y
 
def doubleNum(x):
       return multiply(x, 2)
 
def tripleNum(x):
       return multiply(x, 3)

Ketika skrip fungsi hanya 2-3, tentu saja, itu lebih logis untuk dilakukan, seperti yang ditunjukkan di atas. Tetapi ketika Anda perlu menulis 100 fungsi lainnya, maka tidak masuk akal untuk menulis ulang kode yang sama berkali-kali. Di sinilah fungsi parsial berguna . Untuk menggunakannya, pertama-tama, kita perlu mengimpor sebagian dari Functools .

from functools import partial
 
def multiply(x, y):
       return x * y
 
doubleNum = partial(multiply, 2)
   tripleNum = partial(multiply, 3)
 
Print(doubleNum(10))
 
Output: 20

Seperti yang Anda lihat dari contoh, nilai default akan diganti oleh variabel di sebelah kiri. Alih-alih x akan ada 2, dan bukannya y akan ada 10 saat memanggil doubleNum (10) . Dalam contoh ini, pesanan tidak akan menjadi masalah, tetapi dalam penggunaan lain, itu mungkin penting. Mari kita lihat contoh kasus ini untuk memahami urutan substitusi variabel.

from functools import partial
def orderFunc(a,b,c,d):
      return a*4 + b*3 + c*2 + d
 
result = partial(orderFunc,5,6,7)
print(result(8))
 
Output: 60

Pemesanan penuh


Kami memiliki fungsi orderFunc()di mana kami mengalikan adengan 4, bdengan 3, cdengan 2 dan menambahkan dnilai ke jumlah.

Kami telah membuat fungsi parsialresult() yang memanggil orderFunc()dengan nilai 5, 6 dan 7. Sekarang nilai 5, 6 dan 7 akan menggantikan variabel a, bdan ckarenanya. Variabel dakan diganti oleh 8, karena ditransmisikan saat dipanggil result(). Hasilnya adalah (4 * 5 + 6 * 3 + 7 * 2 + 8) = 60.

Dalam hal ini, urutan nilai yang dikirimkan akan berpengaruh, karena jika urutan berubah, hasilnya juga akan berubah. Untuk memperbaiki variabel, Anda dapat menggunakan kata kunci alih-alih argumen posisi. Mari kita menulis ulang kode di atas menggunakan kata kunci sebagai argumen.

from functools import partial
def orderFunc(a,b,c,d):
       return a*4 + b*3 + c*2 + d
 
 result = partial(orderFunc,c=5,d=6)
print(result(8,4))
 
Output: 60

Di sini kita menetapkan nilai 5 untuk variabel cdan 6 untuk variabel d. Alih-alih variabel a, bnilai 8 dan 4. Akan muncul. Sebagai hasilnya, kita mendapatkan (8 * 4 + 4 * 3 + 5 * 2 + 6) = 60. Fungsi

parsial dapat ditentukan dalam satu lingkaran dan digunakan untuk perhitungan berulang. Mari kita lihat sebuah contoh:

from functools import partial
 
def add(x,y):
      return x + y
 
add_partials = []
for i in range (1, 10):
      function = partial(add, i)
      add_partials.append(function)
      print('Sum of {} and 2 is {}'.format(i,add_partials[i-1](2)))
 
  
Output:
 
Sum of 1 and 2 is 3
Sum of 2 and 2 is 4
Sum of 3 and 2 is 5
Sum of 4 and 2 is 6
Sum of 5 and 2 is 7
Sum of 6 and 2 is 8
Sum of 7 and 2 is 9
Sum of 8 and 2 is 10
Sum of 9 and 2 is 11

Dalam contoh ini, kami akan merangkum rentang nilai tertentu dengan 2, menggunakan kembali fungsi yang ada. Kita dapat memanggil parsial dalam loop dan menggunakan fungsinya untuk menghitung jumlah. Seperti yang dapat dilihat dari nilai-nilai pada output, kami memiliki siklus dari 1 hingga 10 dan semua nilai dalam interval ini ditambahkan ke 2 menggunakan fungsi parsial , yang memanggil fungsi penambahan.

Metadata


Meskipun fungsi parsial independen, mereka mempertahankan memori (metadata) dari fungsi yang diperluas.

from functools import partial
 
def add(x,y):
      return x + y
 
# create a new function that multiplies by 2
result = partial(add,y=5)
print(result.func)
print(result.keywords)
 
Output:
<function add at 0x7f27b1aab620>
{'y': 5}

Panggilan pertama ke func akan melewati nama fungsi dan alamatnya dalam memori, dan panggilan kedua dengan kata kunci akan meneruskan kata kunci ke fungsi. Dengan demikian, fungsi parsial dapat disebut mendokumentasikan diri menggunakan metadata yang mereka terima dari fungsi yang dapat diperluas. Kita dapat memperbarui metadata fungsi menggunakan alat lain dari functools . Merupakan alat yang dapat Anda gunakan untuk memperbarui fitur metadata. Mari kita cari tahu dengan sebuah contoh.

update_wrapper partial

Update_wrapper

def multiply(x, y):
 
    """Test string."""
 
    return x * y
 
 result = functools.partial(multiply, y=2)
 
 try:
 
    print ('Function Name:'+result.__name__)
 
except AttributeError:
 
    print('Function Name: __no name__')
 
 print ('Function Doc:'+result.__doc__)
 
 print('Updating wrapper:')
 
functools.update_wrapper(result, multiply)
 
 print ('Function Name:'+result.__name__)
 
print ('Function Doc:'+result.__doc__)
 
Output:
 
Function Name: __no name__
 
Function Doc:partial(func, *args, **keywords) - new function with partial application
 
    of the given arguments and keywords.
 
 
Updating wrapper:
 
Function Name: multiply
Function Doc: Test string.

Sekarang, seperti yang Anda lihat dari output, sebelum menggunakan pembungkus, fungsi tidak memiliki nama atau dokumen yang ditetapkan untuk itu. Segera setelah kami memperbarui nama dan doc fungsi dengan update_wrapper, kami melihat hasil yang sesuai pada output.

Kesimpulan


Dengan functools kita dapat menyingkirkan kode yang berlebihan dan meningkatkan kemungkinan menggunakan kembali kode dalam Python. Semakin sering Anda menggunakan fungsi parsial , semakin banyak kasus penggunaan yang akan Anda buka. Eksperimen dan nikmati!



Ikuti saja.



All Articles