정의 단계에서는 구문만 감지하고 코드를 실행하지 않습니다.
호출 단계에서는 코드 실행이 시작됩니다.
함수에는 반환 값이 있습니다.
정의할 때 매개변수가 없고 호출할 때도 매개변수가 없습니다
정의할 때 매개변수가 있고 호출할 때 매개변수가 있어야 합니다
def c(a=[]): a.append(1) print(a) c() c() c()
결과:
[1]
[ 1, 1]
[1, 1, 1]
def c(a=[]): a.append(1) print(a) c([]) c([]) c([])
결과:
[1]
[1]
[1]
네임스페이스는 이름의 메모리 주소가 값에 바인딩되는 곳(메모리 공간)을 저장하는 데 사용됩니다.
값을 찾을 때는 이름을 사용해야 하며, 해당 값에 액세스해야 합니다. 이름, 네임스페이스를 찾아봐야 합니다
네임스페이스는 세 가지 범주로 구분됩니다
내장 네임스페이스: 저장 파이썬 인터프리터와 함께 제공되는 이름입니다
라이프 사이클: 인터프리터가 시작될 때 적용됩니다. 인터프리터가 닫히면 무효화됩니다
전역 네임스페이스: 파일 레벨의 이름을 저장합니다
라이프 사이클: 인터프리터에서 파이썬을 해석하고 실행합니다. 파일이 실행될 때 적용되고, 파일이 종료된 후에는 무효화됩니다. 로컬 네임스페이스: 함수 내에 정의된 이름입니다. 수명 주기: 함수가 호출될 때만 일시적으로 생성됩니다.
Loading orderBuilt-in-> ;Global->Local
이름 검색 순서
현재 위치를 기준으로 조회
현재 Local에 서 있다고 가정하면 검색 순서는 local->global-> ; 내장현재 글로벌 세계에 서 있다고 가정하면 검색 순서는 다음과 같습니다. 글로벌->내장
이름의 검색 순서는 함수 정의 단계에서 수정되었습니다(즉, 검색 이름의 순서는 구문 확인 시 정해져 있음), 함수 호출 위치와는 아무런 관련이 없습니다
즉, 어디에서 함수를 호출하든 함수가 호출된 곳으로 다시 돌아가야 한다는 뜻입니다. 원래 이름의 검색 관계를 결정하기 위해 정의되었습니다
범위: 범위는 함수의 범위를 나타냅니다.
전역 효과 도메인: 내장 네임스페이스와 전역 네임스페이스의 이름을 포함합니다.
특징: 전역적으로 유효하며 전역적으로 유효합니다. survivable
로컬 범위: 로컬 네임스페이스의 이름을 포함합니다.
기능: 로컬에서 유효하며 임시 생존 가능성
전역: 전역 불변 유형을 로컬에서 수정하는 데 사용할 수 있는 전역 범위에서 오는 이름을 로컬로 선언합니다.
nonlocal: 현재 레이어 외부 범위에서 가져오고 로컬에서 사용할 수 있는 이름을 선언합니다. 외부 함수의 불변 유형을 수정합니다
4. 클로저 함수
는 함수 내부에 정의되며 범위 이름에 대한 참조를 포함합니다. 클로저 함수를 전역 범위로 반환하여 사용하려면 함수 객체 개념을 결합해야 합니다. 따라서 함수의 계층적 제한을 깨뜨릴 수 있습니다.
클로저 함수는 함수에 값을 전달하는 솔루션을 제공합니다. body
def func(): name='egon' def inner(): print(name) return inner inner = func() inner()
5.1 정의 단계
위치 매개변수기본 형식 매개변수
이미 할당된 값 정의 단계에서 초기화하는 동안
키워드 매개변수
무료 테마
가변 길이 형식 매개변수 argsoverflow 위치 매개변수, 튜플로 포장되어 허용되고 args
라는 이름의 키워드에 할당됨 매개변수* 사이에 있는 매개변수는 키=값
변수 길이의 형식으로 전달되어야 합니다. 위치 형식 매개변수 kwargsoverflow 키워드 실제 매개변수는 사전에 압축되어 **에 의해 허용되고 변수에 할당됩니다. kwargs
형식 매개변수와 실제 매개변수의 관계: 함수를 호출하면 실제 매개변수의 값이 형식 매개변수의 변수 이름에 바인딩됩니다. 이 바인딩 관계는 일시적으로 유효하며 호출이 완료된 후에는 무효화됩니다.
5.2 호출 단계
위치 매개변수키워드 실제. 매개변수
호출 단계에서는 key=value 형식에 따라 형식 매개변수에 값이 전달됩니다. 실제 매개변수에 *가 있는 경우 값을 전달하기 전에 위치 매개변수로 나누어 할당됩니다.
실제 매개변수의 **는 값을 전달하기 전에 키워드 인수로 나누어 할당됩니다. 6. 데코레이터: 클로저 함수 애플리케이션
데코레이터는 데코레이팅된 객체에 새로운 기능을 추가하는 데 사용되는 도구입니다
* *참고:** 데코레이터 자체는 호출 가능한 객체일 수 있으며 데코레이팅된 객체도 호출 가능한 객체일 수 있습니다.
데코레이터를 사용하는 이유
6.1 데코레이터 구현은 두 가지 주요 원칙을 따라야 합니다
1. 데코레이팅된 객체의 소스 코드를 수정하지 마세요.`
2. 데코레이팅된 객체의 호출 방법을 수정하지 마세요
데코레이터의 목표: 원칙 1과 2를 따르면서 데코레이팅된 객체에 새로운 기능을 추가하려면
데코레이션된 후 객체 바로 위에 별도의 줄에 @Decorator 이름을 적습니다
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()
위 내용은 Python 함수를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!