Définissez-la d'abord puis appelez-la La phase de définition détecte uniquement la syntaxe et n'exécute pas le code
La phase d'appel commence à exécuter le code
Les fonctions ont des valeurs de retour.
Il n'y a pas de paramètres lors de la définition et lors de l'appel. Il est également sans paramètre
Il y a des paramètres lors de la définition, et il doit y avoir des paramètres lors de l'appel
def c(a=[]): a.append(1) print(a) c() c() c()
Résultat :
[1]
[ 1, 1]
[1, 1, 1]
def c(a=[]): a.append(1) print(a) c([]) c([]) c([])
Résultat :
[1]
[1]
[1]
L'espace de noms est utilisé pour stocker L'endroit où l'adresse mémoire du nom est liée à la valeur (espace mémoire)
Lors de la recherche d'une valeur, vous devez utiliser le nom et pour accéder au nom, vous devez rechercher l'espace de noms
Les espaces de noms sont divisés en trois catégories
Espaces de noms intégrés : Stocké C'est le nom qui accompagne l'interpréteur python
Cycle de vie : Il prend effet au démarrage de l'interpréteur, et il devient invalide lorsque l'interpréteur est fermé
Espace de noms global : il stocke le nom au niveau du fichier
Cycle de vie : interprète et exécute python dans l'interpréteur Il prend effet lorsque le fichier est exécuté et devient invalide une fois le fichier exécuté. exécuté. Espace de noms local : le nom défini dans la fonction. Cycle de vie : l'espace de noms local de la fonction n'est généré que temporairement lorsque la fonction est appelée. Il devient invalide après l'appel de la fonction
Built-in->. ;Global->LocalL'ordre dans lequel les noms sont recherchés
Recherchez en fonction de l'emplacement actuelEn supposant que vous vous trouvez actuellement en local, l'ordre de recherche est : local->global-> ; IntégréEn supposant que vous vous trouvez actuellement dans le monde global, l'ordre de recherche est : global-> L'ordre de recherche des noms intégrés
a été corrigé lors de l'étape de définition de la fonction (c'est-à-dire la recherche l'ordre des noms a été déterminé lors de la vérification de la syntaxe), cela n'a rien à voir avec la position d'appel de la fonctionC'est-à-dire que peu importe où vous appelez la fonction, vous devez retourner à l'endroit où la fonction a été initialement défini pour déterminer la relation de recherche du nomPortée : la portée fait référence à la portée de la fonctionEffet global Domaine : contient les noms dans l'espace de noms intégré et l'espace de noms globalCaractéristiques : valable globalement, globalement survivablePortée locale : contient les noms dans l'espace de noms localCaractéristiques : Survivabilité temporaire et valide localement global : déclare localement un nom provenant de la portée globale, qui peut être utilisé pour modifier localement le type immuable global nonlocal : déclare un nom qui provient d'une portée en dehors de la couche actuelle et peut être utilisé localement. Modifie le type immuable de la fonction externe4. La fonction de fermeture est définie à l'intérieur de la fonction et contient une référence au nom de la portée. de la fonction externe.Il doit être combiné avec le concept d'objets fonction pour renvoyer la fonction de fermeture dans la portée globale d'utilisation, brisant ainsi les restrictions hiérarchiques des fonctionsLa fonction de fermeture fournit une solution pour transmettre des valeurs à. le corps de la fonctiondef func(): name='egon' def inner(): print(name) return inner inner = func() inner()
Paramètres de position
Dans la phase de définition, des paramètres formels définis dans l'ordre de gauche à droiteParamètres formels par défaut
Déjà initialisé et attribué dans la phase de définitionParamètres de mots-clés
Thème gratuitParamètre formel de longueur variable argsoverflow Paramètres de position, regroupés dans des tuples, acceptés, attribués au nom de variable d'args
paramètres de mot-clé nommés
les paramètres placés entre * et doivent être transmis sous la forme clé=valeurlongueur variable Le paramètre formel positionnel kwargsles paramètres réels du mot-clé overflow sont regroupés dans un dictionnaire, acceptés par **, et attribués à la variable kwargs
Relation entre les paramètres formels et les paramètres réels : lors de l'appel de la fonction, la valeur du paramètre réel sera liée au nom de la variable du paramètre formel. Cette relation de liaison est temporairement effective et deviendra invalide une fois l'appel terminé . 5.2 Phase d'appelParamètres de position
La phase d'appel est basée sur les valeurs entrantes transmises de gauche à droite et correspondra un à un aux paramètres formelsParamètres réels du mot clé.
Dans la phase d'appel, les valeurs sont transmises aux paramètres formels selon le format clé=valeur Pour ceux avec * dans les paramètres réels, avant de transmettre la valeur Sera décomposée en paramètres positionnels, puis attribuée . Le ** dans le paramètre réel sera divisé en arguments de mot-clé avant de transmettre la valeur, puis attribué6 Décorateur : fonction de fermeture Application
Decorator est un outil utilisé pour ajouter de nouvelles fonctions à l'objet décoré**Remarque. :** Le décorateur lui-même peut être n'importe quel objet appelable, et l'objet décoré peut également être n'importe quel objet appelable Pourquoi utiliser des décorateurs**Principe ouvert et fermé : **Fermé signifie être fermé aux modifications et ouvert aux extensionspython解释器一旦运行到@装饰器的名字,就会调用装饰器,然后将被装饰函数的内存地址当作参数传给装饰器,最后将装饰器调用的结果赋值给原函数名 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()
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!