Die Aufrufphase beginnt mit der Ausführung des Codes.
Funktionen haben Rückgabewerte
Beim Definieren und Aufrufen gibt es keine Parameter. Es gibt auch keine Parameter. Beim Definieren gibt es Parameter. Beim Aufruf müssen Parameter vorhanden sein Typen sind nicht betroffen
3. Namespace und Geltungsbereich
Namespace wird zum Speichern verwendet. Der Ort, an dem die Speicheradresse des Namens an den Wert gebunden ist (Speicherplatz)
Eingebaute Namespaces: Gespeichert Dies ist der Name, der mit dem Python-Interpreter geliefert wirdGlobaler Namensraum: Es speichert den Namen auf Dateiebene
Lebenszyklus: Wird wirksam, wenn der Interpreter gestartet wird. und es wird ungültig, wenn der Interpreter geschlossen wird
Lebenszyklus: Python im Interpreter interpretieren und ausführen Es wird wirksam, wenn die Datei ausgeführt wird, und wird ungültig, nachdem die Datei ausgeführt wurde ausgeführt. Lokaler Namespace: Der innerhalb der Funktion definierte Name wird nur vorübergehend generiert, wenn die Funktion aufgerufen wird ;Global->Lokal
Die Reihenfolge, in der nach Namen gesucht wird
Suchen Sie anhand des aktuellen Standorts nach
Angenommen, Sie befinden sich derzeit in der globalen Welt, lautet die Suchreihenfolge: global-> Die Suchreihenfolge der integrierten
Namen wurde während der Funktionsdefinitionsphase (d. h. der Suche) festgelegt Die Reihenfolge der Namen wurde bei der Überprüfung der Syntax festgelegt. Sie hat nichts mit der Aufrufposition der Funktion zu tun
Das heißt, egal wo Sie die Funktion aufrufen, Sie müssen zu der Stelle zurückkehren, an der sich die Funktion befindet wurde ursprünglich definiert, um die Suchbeziehung des Namens zu bestimmenBereich: Bereich bezieht sich auf den Bereich der Funktion
Globale Wirkung Domäne: Enthält die Namen im integrierten Namespace und im globalen Namespace
Funktionen: Global gültig, global survivable
Lokaler Geltungsbereich: Enthält die Namen im lokalen Namespace
Features: Lokal gültige, temporäre Überlebensfähigkeit
Global: Deklarieren Sie lokal einen Namen, der aus dem globalen Geltungsbereich stammt, der zum lokalen Ändern des globalen unveränderlichen Typs verwendet werden kann
Nicht lokal: Deklarieren Sie einen Namen, der aus einem Bereich außerhalb der aktuellen Ebene stammt und lokal verwendet werden kann. Ändern Sie den unveränderlichen Typ der äußeren Funktion
4. Die Abschlussfunktion wird innerhalb der Funktion definiert und enthält einen Verweis auf den Bereichsnamen Sie müssen das Konzept von Funktionsobjekten kombinieren, um die Abschlussfunktion zur Verwendung in den globalen Bereich zurückzugeben und so die hierarchischen Einschränkungen von Funktionen aufzuheben. Die Abschlussfunktion bietet eine Lösung für die Übergabe von Werten an die Funktion Körper
def c(a=[]): a.append(1) print(a) c() c() c()
5. Parameter der Funktion
5.1 Definitionsphase
PositionsparameterIn der Definitionsphase werden von Formalparametern in der Reihenfolge von links nach rechts definiert
StandardformalparameterBereits zugewiesene Werte während ihrer Initialisierung während der Definitionsphase
SchlüsselwortparameterKostenlose Themen
Formale Parameter mit variabler Länge args
Überlauf Positionsparameter, in Tupel gepackt, akzeptiert, dem Variablennamen von args zugewiesen
benanntes Schlüsselwort ParameterVariablenlänge Die tatsächlichen Parameter des Positionsformparameters kwargs
Überlaufschlüsselwort werden in ein Wörterbuch gepackt, von ** akzeptiert und der Variablen zugewiesen kwargs
Positionsparameter
Die Aufrufphase folgt den eingehenden Werten, die von links nach rechts übergeben werden, und entspricht eins zu eins den formalen Parametern. Schlüsselwort-Aktualparameter In der Aufrufphase werden die Werte gemäß dem Schlüssel=Wert-Format an die formalen Parameter übergeben. Bei denen mit * in den tatsächlichen Parametern wird der Wert vor der Übergabe in Positionsparameter zerlegt und dann zugewiesen
Der *. * im tatsächlichen Parameter wird vor der Übergabe des Werts in Schlüsselwortargumente zerlegt und dann zugewiesen 6 Decorator: Abschlussfunktionsanwendung
Decorator ist ein Tool zum Hinzufügen neuer Funktionen zum dekorierten Objekt
**Hinweis:* * Der Dekorator selbst kann ein beliebiges aufrufbares Objekt sein, und das dekorierte Objekt kann auch ein beliebiges aufrufbares Objekt sein. Warum Dekoratoren verwenden? Die Implementierung von Dekoratoren muss zwei Hauptprinzipien folgen
1. Ändern Sie nicht den Quellcode des dekorierten Objekts.
2 Ändern Sie nicht die Aufrufmethode des dekorierten Objekts. Das Ziel des Dekorators: neue Funktionen hinzuzufügen zum dekorierten Objekt hinzufügen und dabei die Prinzipien 1 und 2 befolgen
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()
Das obige ist der detaillierte Inhalt vonSo verwenden Sie Python-Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!