untuk mentakrifkannya dahulu dan kemudian memanggilnya Dalam fasa definisi, hanya sintaks yang dikesan dan kod tidak dilaksanakan.
Dalam fasa panggilan, mulakan Kod pelaksanaan
Semua fungsi mempunyai nilai pulangan
Tiada parameter semasa mentakrifkan dan tiada parameter semasa memanggil
Terdapat parameter semasa mentakrifkan dan mesti ada parameter semasa memanggil
def c(a=[]): a.append(1) print(a) c() c() c()
Keputusan:
[1]
[ 1, 1]
[1, 1, 1]
def c(a=[]): a.append(1) print(a) c([]) c([]) c([])
Keputusan:
[1]
[1]
[1]
Ruang nama ialah tempat perhubungan yang mengikat antara nama dan alamat memori nilai disimpan (ruang memori)
Sebarang carian Nilai mesti melepasi nama Untuk mengakses nama, anda mesti mencari ruang nama
ruang nama dibahagikan kepada tiga kategori:
Ruang nama terbina dalam: Ruang nama yang disertakan dengan penterjemah python disimpan Nama
Kitaran hayat: berkuat kuasa apabila penterjemah dimulakan, dan menjadi tidak sah apabila jurubahasa ditutup
Ruang nama global: menyimpan nama peringkat fail
kitaran hayat: Ia berkuat kuasa apabila jurubahasa mentafsir dan melaksanakan fail ular sawa, dan menjadi tidak sah selepas fail dilaksanakan.
Ruang nama setempat: Nama yang ditakrifkan dalam fungsi
Kitaran hayat: Ini hanya dijana buat sementara apabila fungsi itu dipanggil, yang akan menjadi tidak sah selepas fungsi dipanggil
Memuatkan pesanan
Terbina dalam>Global->Tempatan
Susunan carian nama
Cari ke atas berdasarkan lokasi semasa
Dengan mengandaikan anda sedang berada di kawasan setempat, susunan carian ialah: global-> 🎜>
Dengan mengandaikan bahawa anda kini berada di dunia global, susunan carian ialah: global -> Urutan carian bagi nama terbina dalam telah ditetapkan semasa peringkat definisi fungsi (iaitu , susunan carian nama telah ditentukan apabila menyemak sintaks). kembali ke tempat di mana fungsi asalnya ditakrifkan untuk menentukan hubungan carian namaSkop: Skop merujuk kepada Ia adalah skop tindakan Skop global: Mengandungi nama dalam binaan -dalam ruang nama dan ruang nama global Ciri: Kemandirian global yang sah secara globalSkop setempat: Mengandungi nama dalam ruang nama tempatan Ciri: Kemandirian sementara yang sah di peringkat tempatanglobal: Mengisytiharkan nama secara tempatan berasal daripada skop global dan boleh digunakan untuk mengubah suai jenis global setempat Tidak boleh ubah bukan tempatan: mengisytiharkan nama daripada skop lapisan luar lapisan semasa, yang boleh digunakan untuk mengubah suai secara tempatan jenis tidak boleh ubah bagi fungsi luar 4. Penutupan Fungsi ditakrifkan di dalam fungsi dan mengandungi rujukan kepada nama skop fungsi luaran Ia adalah perlu untuk menggabungkan konsep objek fungsi untuk mengembalikan fungsi penutupan kepada skop global untuk digunakan, dengan itu memecahkan sekatan hierarki fungsi
def func(): name='egon' def inner(): print(name) return inner inner = func() inner()
Parameter formal yang ditakrifkan mengikut urutan dari kiri ke betul-betul dalam fasa definisi
Parameter formal lalai
sudah dalam fasa definisi Tugasan permulaannya
Parameter kata kunci
Tema percuma
Args parameter formal panjang boleh ubahParameter kedudukan yang melimpah, Pek ke dalam tupel, terima dan tetapkan nama pembolehubah kepada argsParameter kata kunci bernama
Parameter diletakkan di antara * dan mesti mengikut key=value Nilai yang dilalui dalam bentuk
parameter kedudukan pembolehubah panjang kwargs parameter sebenar kata kunci limpahan, dibungkus ke dalam kamus, diterima oleh **, diperuntukkan kepada bentuk kwargs pembolehubah Hubungan antara parameter dan parameter sebenar: Apabila memanggil fungsi, nilai parameter sebenar akan terikat pada nama pembolehubah formal parameter. Hubungan mengikat ini berkuat kuasa buat sementara waktu dan akan menjadi tidak sah selepas panggilan selesai 5.2 Fasa PanggilanNilai-nilai dihantar dari kiri ke kanan semasa fasa panggilan akan sepadan dengan parameter rasmi satu-ke-satu
Parameter sebenar kata kunci
Dalam fasa panggilan, lulus nilai kepada parameter formal mengikut format key=value
Jika terdapat * dalam parameter sebenar, kemudian hantar nilai Sebelum menghantar nilai, pecahkan dahulu ke dalam parameter sebenar kedudukan, dan kemudian tetapkan nilai <. 🎜>dengan ** dalam parameter sebenar Sebelum menghantar nilai, pecahkannya kepada parameter sebenar kata kunci, dan kemudian tetapkan nilai
6 >Penghias ialah alat yang digunakan untuk menambah fungsi baharu pada objek yang dihias
**Nota:** Penghias itu sendiri boleh menjadi apa sahaja Objek boleh dipanggil, objek yang dihias juga boleh menjadi objek boleh dipanggil
**Prinsip terbuka dan tertutup: **Tertutup merujuk kepada ditutup kepada pengubahsuaian dan ditutup kepada sambungan Terbuka
6.1 Pelaksanaan penghias mesti mengikut dua prinsip utama
1. Jangan ubah suai kod sumber objek yang dihias`
2. Jangan ubah suai panggilan objek yang dihias Kaedah
6.2 Gula sintaks penghias
selepas dihias Tulis nama @penghias pada baris berasingan betul-betul di atas objek
python解释器一旦运行到@装饰器的名字,就会调用装饰器,然后将被装饰函数的内存地址当作参数传给装饰器,最后将装饰器调用的结果赋值给原函数名 foo=auth(foo) 此时的foo是闭包函数wrapper
import time def timmer(func): def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print('run time is %s' %(stop_time-start_time)) return res return wrapper @timmer def foo(): time.sleep(3) print('from foo') foo()
def auth(driver='file'): def auth3(func): def wrapper(*args,**kwargs): name=input("user: ") pwd=input("pwd: ") if driver == 'file': if name == 'egon' and pwd == '123': print('login successful') res=func(*args,**kwargs) return res elif driver == 'ldap': print('ldap') return wrapper return auth3 @auth(driver='file') def foo(name): print(name) foo('egon')
#题目一: db='db.txt' login_status={'user':None,'status':False} def auth(auth_type='file'): def auth3(func): def wrapper(*args,**kwargs): if login_status['user'] and login_status['status']: return func(*args,**kwargs) if auth_type == 'file': with open(db,encoding='utf-8') as f: dic=eval(f.read()) name=input('username: ').strip() password=input('password: ').strip() if name in dic and password == dic[name]: login_status['user']=name login_status['status']=True res=func(*args,**kwargs) return res else: print('username or password error') elif auth_type == 'sql': pass else: pass return wrapper return auth3 @auth() def index(): print('index') @auth(auth_type='file') def home(name): print('welcome %s to home' %name) # index() # home('egon') #题目二 import time,random user={'user':None,'login_time':None,'timeout':0.000003,} def timmer(func): def wrapper(*args,**kwargs): s1=time.time() res=func(*args,**kwargs) s2=time.time() print('%s' %(s2-s1)) return res return wrapper def auth(func): def wrapper(*args,**kwargs): if user['user']: timeout=time.time()-user['login_time'] if timeout < user['timeout']: return func(*args,**kwargs) name=input('name>>: ').strip() password=input('password>>: ').strip() if name == 'egon' and password == '123': user['user']=name user['login_time']=time.time() res=func(*args,**kwargs) return res return wrapper @auth def index(): time.sleep(random.randrange(3)) print('welcome to index') @auth def home(name): time.sleep(random.randrange(3)) print('welcome %s to home ' %name) index() home('egon') #题目三:简单版本 import requests import os cache_file='cache.txt' def make_cache(func): def wrapper(*args,**kwargs): if not os.path.exists(cache_file): with open(cache_file,'w'):pass if os.path.getsize(cache_file): with open(cache_file,'r',encoding='utf-8') as f: res=f.read() else: res=func(*args,**kwargs) with open(cache_file,'w',encoding='utf-8') as f: f.write(res) return res return wrapper @make_cache def get(url): return requests.get(url).text # res=get('https://www.python.org') # print(res) #题目四:扩展版本 import requests,os,hashlib engine_settings={ 'file':{'dirname':'./db'}, 'mysql':{ 'host':'127.0.0.1', 'port':3306, 'user':'root', 'password':'123'}, 'redis':{ 'host':'127.0.0.1', 'port':6379, 'user':'root', 'password':'123'}, } def make_cache(engine='file'): if engine not in engine_settings: raise TypeError('egine not valid') def deco(func): def wrapper(url): if engine == 'file': m=hashlib.md5(url.encode('utf-8')) cache_filename=m.hexdigest() cache_filepath=r'%s/%s' %(engine_settings['file']['dirname'],cache_filename) if os.path.exists(cache_filepath) and os.path.getsize(cache_filepath): return open(cache_filepath,encoding='utf-8').read() res=func(url) with open(cache_filepath,'w',encoding='utf-8') as f: f.write(res) return res elif engine == 'mysql': pass elif engine == 'redis': pass else: pass return wrapper return deco @make_cache(engine='file') def get(url): return requests.get(url).text # print(get('https://www.python.org')) print(get('https://www.baidu.com')) #题目五 route_dic={} def make_route(name): def deco(func): route_dic[name]=func return deco @make_route('select') def func1(): print('select') @make_route('insert') def func2(): print('insert') @make_route('update') def func3(): print('update') @make_route('delete') def func4(): print('delete') print(route_dic) #题目六 import time import os def logger(logfile): def deco(func): if not os.path.exists(logfile): with open(logfile,'w'):pass def wrapper(*args,**kwargs): res=func(*args,**kwargs) with open(logfile,'a',encoding='utf-8') as f: f.write('%s %s run\n' %(time.strftime('%Y-%m-%d %X'),func.__name__)) return res return wrapper return deco @logger(logfile='aaaaaaaaaaaaaaaaaaaaa.log') def index(): print('index') index()
Atas ialah kandungan terperinci Cara menggunakan fungsi Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!