Jadual Kandungan
Menetapkan Isu
Penghias
Parameter dan parameter kata kunci
Penghias Tempahan Tinggi
Rumah pembangunan bahagian belakang Tutorial Python Fahami penghias Python dalam satu artikel

Fahami penghias Python dalam satu artikel

Apr 12, 2023 pm 09:40 PM
python Penghias

Fahami penghias Python dalam satu artikel

Python ialah bahasa yang mesra pemula. Walau bagaimanapun, ia juga mempunyai banyak ciri canggih yang sukar dikuasai, seperti penghias. Ramai pemula tidak pernah memahami penghias dan cara mereka bekerja Dalam artikel ini, kami akan memperkenalkan selok-belok penghias.

Dalam Python, fungsi ialah struktur yang sangat fleksibel Kita boleh menetapkannya kepada pembolehubah, menghantarnya sebagai parameter kepada fungsi lain atau menggunakannya sebagai output fungsi. Penghias pada asasnya ialah fungsi yang membenarkan fungsi lain menambah beberapa fungsi tanpa pengubahsuaian.

Ini ialah maksud "hiasan". "hiasan" ini sendiri mewakili fungsi Jika anda menggunakannya untuk mengubah suai fungsi yang berbeza, ia bermakna menambah fungsi ini.

Secara umumnya, kita boleh menggunakan gula @ sintaksis (Syntactic Sugar) yang disediakan oleh penghias untuk menghiasi fungsi atau objek lain. Seperti yang ditunjukkan di bawah, kami menggunakan penghias @dec untuk menghiasi fungsi fungsi ():

@dec
def func():
 pass
Salin selepas log masuk

Cara terbaik untuk memahami penghias ialah memahami masalah yang diselesaikan oleh penghias dengan langkah bermula dari masalah khusus, dan tunjukkan keanggunan dan kuasanya.

Menetapkan Isu

Untuk memahami tujuan penghias, mari lihat contoh mudah. Katakan anda mempunyai fungsi penambahan ringkas dec.py Nilai lalai parameter kedua ialah 10:

# dec.py
def add(x, y=10):
 return x + y
Salin selepas log masuk

Mari kita lihat dengan lebih dekat fungsi penambahan ini:

>>> add(10, 20)
30
>>> add
<function add at 0x7fce0da2fe18>
>>> add.__name__
'add'
>>> add.__module__
'__main__'
>>> add.__defaults__ # default value of the `add` function
(10,)
>>> add.__code__.co_varnames # the variable names of the `add` function
('x', 'y')
Salin selepas log masuk

Kami tidak perlu memahami apa ini, cuma ingat bahawa setiap fungsi dalam Python adalah objek, dan mereka mempunyai pelbagai sifat dan kaedah. Anda juga boleh melihat kod sumber fungsi add() melalui modul inspect:

>>> from inspect import getsource
>>> print(getsource(add))
def add(x, y=10):
 return x + y
Salin selepas log masuk

Kini anda menggunakan fungsi penambahan dalam beberapa cara, contohnya anda menggunakan beberapa operasi untuk menguji fungsi:

# dec.py
from time import time
def add(x, y=10):
 return x + y
print('add(10)', add(10))
print('add(20, 30)', add(20, 30))
print('add("a", "b")', add("a", "b"))
Output: i
add(10) 20
add(20, 30) 50
add("a", "b") ab
Salin selepas log masuk

Jika anda ingin tahu masa setiap operasi, anda boleh menghubungi modul masa:

# dec.py
from time import time
def add(x, y=10):
 return x + y
before = time()
print('add(10)', add(10))
after = time()
print('time taken: ', after - before)
before = time()
print('add(20, 30)', add(20, 30))
after = time()
print('time taken: ', after - before)
before = time()
print('add("a", "b")', add("a", "b"))
after = time()
print('time taken: ', after - before)
Output:
add(10) 20
time taken:6.699562072753906e-05
add(20, 30) 50
time taken:6.9141387939453125e-06
add("a", "b") ab
time taken:6.9141387939453125e-06
Salin selepas log masuk

Sekarang, sebagai pengaturcara, adakah anda sedikit gatal? tidak suka menyalin dan menampal kod yang sama sepanjang masa. Kod semasa tidak begitu mudah dibaca Jika anda ingin menukar sesuatu, anda perlu mengubah suai semua di mana ia muncul.

Kita boleh menangkap masa berjalan terus dalam fungsi tambah seperti berikut:

# dec.py
from time import time
def add(x, y=10):
 before = time()
 rv = x + y
 after = time()
 print('time taken: ', after - before)
 return rv
print('add(10)', add(10))
print('add(20, 30)', add(20, 30))
print('add("a", "b")', add("a", "b"))
Salin selepas log masuk

Kaedah ini pastinya lebih baik daripada yang sebelumnya. Tetapi jika anda mempunyai fungsi lain, maka ini nampaknya menyusahkan. Apabila kita mempunyai berbilang fungsi:

# dec.py
from time import time
def add(x, y=10):
 before = time()
 rv = x + y
 after = time()
 print('time taken: ', after - before)
 return rv
def sub(x, y=10):
 return x - y
print('add(10)', add(10))
print('add(20, 30)', add(20, 30))
print('add("a", "b")', add("a", "b"))
print('sub(10)', sub(10))
print('sub(20, 30)', sub(20, 30))
Salin selepas log masuk

Oleh kerana tambah dan sub ialah kedua-dua fungsi, kita boleh memanfaatkannya untuk menulis fungsi pemasa. Kami mahu pemasa mengira masa operasi fungsi:

def timer(func, x, y=10):
 before = time()
 rv = func(x, y)
 after = time()
 print('time taken: ', after - before)
 return rv
Salin selepas log masuk

Ini bagus, tetapi kita mesti menggunakan fungsi pemasa untuk membalut fungsi yang berbeza, seperti berikut:

print('add(10)', timer(add,10)))
Salin selepas log masuk

Adakah nilai lalai masih 10 sekarang? tidak semestinya. Jadi bagaimana untuk melakukannya dengan lebih baik?

Berikut ialah idea: buat fungsi pemasa baharu, balut dengan fungsi lain dan kembalikan fungsi yang dibalut:

def timer(func):
 def f(x, y=10):
 before = time()
 rv = func(x, y)
 after = time()
 print('time taken: ', after - before)
 return rv
 return f
Salin selepas log masuk

Sekarang, anda hanya bungkusnya dengan pemasa Mari lihat pada fungsi tambah dan sub:

add = timer(add)
Salin selepas log masuk

Itu sahaja! Berikut ialah kod lengkap:

# dec.py
from time import time
def timer(func):
 def f(x, y=10):
 before = time()
 rv = func(x, y)
 after = time()
 print('time taken: ', after - before)
 return rv
 return f
def add(x, y=10):
 return x + y
add = timer(add)
def sub(x, y=10):
 return x - y
sub = timer(sub)
print('add(10)', add(10))
print('add(20, 30)', add(20, 30))
print('add("a", "b")', add("a", "b"))
print('sub(10)', sub(10))
print('sub(20, 30)', sub(20, 30))
Output:
time taken:0.0
add(10) 20
time taken:9.5367431640625e-07
add(20, 30) 50
time taken:0.0
add("a", "b") ab
time taken:9.5367431640625e-07
sub(10) 0
time taken:9.5367431640625e-07
sub(20, 30) -10
Salin selepas log masuk

Mari kita ringkaskan proses: kita mempunyai fungsi (seperti fungsi tambah) dan kemudian membalut fungsi dengan tindakan (seperti pemasaan). Hasil pembungkusan adalah fungsi baru yang boleh melaksanakan fungsi baru tertentu.

Sudah tentu, terdapat masalah dengan nilai lalai, tetapi kami akan membetulkannya kemudian.

Penghias

Kini, penyelesaian di atas sangat hampir dengan idea penghias, menggunakan tingkah laku biasa untuk membungkus fungsi tertentu Corak ini adalah hiasan peranti sedang melakukan. Kod selepas menggunakan penghias ialah:

def add(x, y=10):
 return x + y
add = timer(add)
You write:
@timer
def add(x, y=10):
 return x + y
Salin selepas log masuk

Ia mempunyai kesan yang sama. Ini adalah peranan penghias Python. Fungsi yang dilaksanakannya adalah serupa dengan add = timer(add), kecuali penghias meletakkan sintaks di atas fungsi, dan sintaksnya lebih mudah: @timer.

# dec.py
from time import time
def timer(func):
 def f(x, y=10):
 before = time()
 rv = func(x, y)
 after = time()
 print('time taken: ', after - before)
 return rv
 return f
@timer
def add(x, y=10):
 return x + y
@timer
def sub(x, y=10):
 return x - y
print('add(10)', add(10))
print('add(20, 30)', add(20, 30))
print('add("a", "b")', add("a", "b"))
print('sub(10)', sub(10))
print('sub(20, 30)', sub(20, 30))
Salin selepas log masuk

Parameter dan parameter kata kunci

Kini, masih ada masalah kecil yang belum selesai. Dalam fungsi pemasa, kami mengekod keras parameter x dan y, iaitu, menentukan nilai lalai y sebagai 10. Terdapat cara untuk menghantar argumen dan argumen kata kunci kepada fungsi, iaitu *args dan **kwargs. Parameter ialah parameter piawai bagi fungsi (dalam kes ini, x ialah parameter), dan parameter kata kunci ialah parameter yang sudah mempunyai nilai lalai (dalam kes ini, y=10). Kodnya adalah seperti berikut:

# dec.py
from time import time
def timer(func):
 def f(*args, **kwargs):
 before = time()
 rv = func(*args, **kwargs)
 after = time()
 print('time taken: ', after - before)
 return rv
 return f
@timer
def add(x, y=10):
 return x + y
@timer
def sub(x, y=10):
 return x - y
print('add(10)', add(10))
print('add(20, 30)', add(20, 30))
print('add("a", "b")', add("a", "b"))
print('sub(10)', sub(10))
print('sub(20, 30)', sub(20, 30))
Salin selepas log masuk

Kini, fungsi pemasa boleh mengendalikan sebarang fungsi, sebarang parameter dan sebarang tetapan nilai lalai, kerana ia hanya menghantar parameter ini ke dalam fungsi.

Penghias Tempahan Tinggi

Anda mungkin tertanya-tanya: jika kita boleh membungkus fungsi dengan fungsi lain untuk menambah gelagat berguna, bolehkah kita melangkah lebih jauh? Adakah kita membalut fungsi dengan fungsi lain dan dibalut oleh fungsi lain?

Ya! Malah, fungsinya boleh sedalam yang anda mahukan. Sebagai contoh, anda ingin menulis penghias yang melaksanakan fungsi n kali. Seperti yang ditunjukkan di bawah:

def ntimes(n):
 def inner(f):
 def wrapper(*args, **kwargs):
 for _ in range(n):
 rv = f(*args, **kwargs)
 return rv
 return wrapper
 return inner
Salin selepas log masuk

Kemudian anda boleh menggunakan fungsi di atas untuk membungkus fungsi lain, seperti fungsi tambah dalam artikel sebelumnya:

@ntimes(3)
def add(x, y):
 print(x + y)
 return x + y
Salin selepas log masuk

Pernyataan output menunjukkan bahawa kod memang dilaksanakan 3 Second-rate.

Atas ialah kandungan terperinci Fahami penghias Python dalam satu artikel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Hadidb: Pangkalan data yang ringan dan berskala mendatar di Python Hadidb: Pangkalan data yang ringan dan berskala mendatar di Python Apr 08, 2025 pm 06:12 PM

Hadidb: Pangkalan data Python yang ringan, tinggi, Hadidb (Hadidb) adalah pangkalan data ringan yang ditulis dalam Python, dengan tahap skalabilitas yang tinggi. Pasang HadIdb menggunakan pemasangan PIP: Pengurusan Pengguna PipInstallHadidB Buat Pengguna: CreateUser () Kaedah untuk membuat pengguna baru. Kaedah pengesahan () mengesahkan identiti pengguna. dariHadidb.OperationImportuserer_Obj = user ("admin", "admin") user_obj.

Kaedah Navicat untuk melihat kata laluan pangkalan data MongoDB Kaedah Navicat untuk melihat kata laluan pangkalan data MongoDB Apr 08, 2025 pm 09:39 PM

Tidak mustahil untuk melihat kata laluan MongoDB secara langsung melalui Navicat kerana ia disimpan sebagai nilai hash. Cara mendapatkan kata laluan yang hilang: 1. Tetapkan semula kata laluan; 2. Periksa fail konfigurasi (mungkin mengandungi nilai hash); 3. Semak Kod (boleh kata laluan Hardcode).

Rancangan Python 2 jam: Pendekatan yang realistik Rancangan Python 2 jam: Pendekatan yang realistik Apr 11, 2025 am 12:04 AM

Anda boleh mempelajari konsep pengaturcaraan asas dan kemahiran Python dalam masa 2 jam. 1. Belajar Pembolehubah dan Jenis Data, 2.

Bagaimana untuk mengoptimumkan prestasi MySQL untuk aplikasi beban tinggi? Bagaimana untuk mengoptimumkan prestasi MySQL untuk aplikasi beban tinggi? Apr 08, 2025 pm 06:03 PM

Panduan Pengoptimuman Prestasi Pangkalan Data MySQL Dalam aplikasi yang berintensifkan sumber, pangkalan data MySQL memainkan peranan penting dan bertanggungjawab untuk menguruskan urus niaga besar-besaran. Walau bagaimanapun, apabila skala aplikasi berkembang, kemunculan prestasi pangkalan data sering menjadi kekangan. Artikel ini akan meneroka satu siri strategi pengoptimuman prestasi MySQL yang berkesan untuk memastikan aplikasi anda tetap cekap dan responsif di bawah beban tinggi. Kami akan menggabungkan kes-kes sebenar untuk menerangkan teknologi utama yang mendalam seperti pengindeksan, pengoptimuman pertanyaan, reka bentuk pangkalan data dan caching. 1. Reka bentuk seni bina pangkalan data dan seni bina pangkalan data yang dioptimumkan adalah asas pengoptimuman prestasi MySQL. Berikut adalah beberapa prinsip teras: Memilih jenis data yang betul dan memilih jenis data terkecil yang memenuhi keperluan bukan sahaja dapat menjimatkan ruang penyimpanan, tetapi juga meningkatkan kelajuan pemprosesan data.

Python: meneroka aplikasi utamanya Python: meneroka aplikasi utamanya Apr 10, 2025 am 09:41 AM

Python digunakan secara meluas dalam bidang pembangunan web, sains data, pembelajaran mesin, automasi dan skrip. 1) Dalam pembangunan web, kerangka Django dan Flask memudahkan proses pembangunan. 2) Dalam bidang sains data dan pembelajaran mesin, numpy, panda, scikit-learn dan perpustakaan tensorflow memberikan sokongan yang kuat. 3) Dari segi automasi dan skrip, Python sesuai untuk tugas -tugas seperti ujian automatik dan pengurusan sistem.

Cara Menggunakan AWS Glue Crawler dengan Amazon Athena Cara Menggunakan AWS Glue Crawler dengan Amazon Athena Apr 09, 2025 pm 03:09 PM

Sebagai profesional data, anda perlu memproses sejumlah besar data dari pelbagai sumber. Ini boleh menimbulkan cabaran kepada pengurusan data dan analisis. Nasib baik, dua perkhidmatan AWS dapat membantu: AWS Glue dan Amazon Athena.

Bolehkah mysql menyambung ke pelayan SQL Bolehkah mysql menyambung ke pelayan SQL Apr 08, 2025 pm 05:54 PM

Tidak, MySQL tidak dapat menyambung terus ke SQL Server. Tetapi anda boleh menggunakan kaedah berikut untuk melaksanakan interaksi data: Gunakan middleware: data eksport dari MySQL ke format pertengahan, dan kemudian mengimportnya ke SQL Server melalui middleware. Menggunakan Pangkalan Data Pangkalan Data: Alat perniagaan menyediakan antara muka yang lebih mesra dan ciri -ciri canggih, pada dasarnya masih dilaksanakan melalui middleware.

Cara memulakan pelayan dengan redis Cara memulakan pelayan dengan redis Apr 10, 2025 pm 08:12 PM

Langkah -langkah untuk memulakan pelayan Redis termasuk: Pasang Redis mengikut sistem operasi. Mulakan perkhidmatan Redis melalui Redis-server (Linux/macOS) atau redis-server.exe (Windows). Gunakan redis-cli ping (linux/macOS) atau redis-cli.exe ping (windows) perintah untuk memeriksa status perkhidmatan. Gunakan klien Redis, seperti redis-cli, python, atau node.js untuk mengakses pelayan.

See all articles