>  기사  >  백엔드 개발  >  Python 함수를 사용하는 방법

Python 함수를 사용하는 방법

WBOY
WBOY앞으로
2023-05-08 12:07:17997검색

    1. 함수 사용 방법

    정의 단계에서는 구문만 감지하고 코드를 실행하지 않습니다.

    호출 단계에서는 코드 실행이 시작됩니다.

    함수에는 반환 값이 있습니다. ​​

    정의할 때 매개변수가 없고 호출할 때도 매개변수가 없습니다

    정의할 때 매개변수가 있고 호출할 때 매개변수가 있어야 합니다

    2. 기본 매개변수 트랩

    2.1은 가변 데이터형, 불변 데이터용입니다. 유형은 영향을 받지 않습니다

    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]

    3. 네임스페이스와 범위

    네임스페이스는 이름의 메모리 주소가 값에 바인딩되는 곳(메모리 공간)을 저장하는 데 사용됩니다.

    값을 찾을 때는 이름을 사용해야 하며, 해당 값에 액세스해야 합니다. 이름, 네임스페이스를 찾아봐야 합니다

    네임스페이스는 세 가지 범주로 구분됩니다

    내장 네임스페이스: 저장 파이썬 인터프리터와 함께 제공되는 이름입니다

    라이프 사이클: 인터프리터가 시작될 때 적용됩니다. 인터프리터가 닫히면 무효화됩니다

    전역 네임스페이스: 파일 레벨의 이름을 저장합니다

    라이프 사이클: 인터프리터에서 파이썬을 해석하고 실행합니다. 파일이 실행될 때 적용되고, 파일이 종료된 후에는 무효화됩니다. 로컬 네임스페이스: 함수 내에 정의된 이름입니다. 수명 주기: 함수가 호출될 때만 일시적으로 생성됩니다.

    Loading order

    Built-in-> ;Global->Local

    이름 검색 순서

    현재 위치를 기준으로 조회

    현재 Local에 서 있다고 가정하면 검색 순서는 local->global-> ; 내장현재 글로벌 세계에 서 있다고 가정하면 검색 순서는 다음과 같습니다. 글로벌->내장

    이름의 검색 순서는 함수 정의 단계에서 수정되었습니다(즉, 검색 이름의 순서는 구문 확인 시 정해져 있음), 함수 호출 위치와는 아무런 관련이 없습니다

    즉, 어디에서 함수를 호출하든 함수가 호출된 곳으로 다시 돌아가야 한다는 뜻입니다. 원래 이름의 검색 관계를 결정하기 위해 정의되었습니다

    범위: 범위는 함수의 범위를 나타냅니다.

    전역 효과 도메인: 내장 네임스페이스와 전역 네임스페이스의 이름을 포함합니다.

    특징: 전역적으로 유효하며 전역적으로 유효합니다. survivable

    로컬 범위: 로컬 네임스페이스의 이름을 포함합니다.

    기능: 로컬에서 유효하며 임시 생존 가능성

    전역: 전역 불변 유형을 로컬에서 수정하는 데 사용할 수 있는 전역 범위에서 오는 이름을 로컬로 선언합니다.

    nonlocal: 현재 레이어 외부 범위에서 가져오고 로컬에서 사용할 수 있는 이름을 선언합니다. 외부 함수의 불변 유형을 수정합니다

    4. 클로저 함수

    는 함수 내부에 정의되며 범위 이름에 대한 참조를 포함합니다. 클로저 함수를 전역 범위로 반환하여 사용하려면 함수 객체 개념을 결합해야 합니다. 따라서 함수의 계층적 제한을 깨뜨릴 수 있습니다.

    클로저 함수는 함수에 값을 전달하는 솔루션을 제공합니다. body

    def func():
        name='egon'
        def inner():
            print(name)
        return inner
    inner = func()
    inner()

    5. 함수의 매개변수

    5.1 정의 단계

    위치 매개변수

    정의 단계에서 왼쪽에서 오른쪽으로 정의된 형식 매개변수

    기본 형식 매개변수

    이미 할당된 값 ​​정의 단계에서 초기화하는 동안

    키워드 매개변수

    무료 테마

    가변 길이 형식 매개변수 argsoverflow 위치 매개변수, 튜플로 포장되어 허용되고 args

    라는 이름의 키워드에 할당됨 매개변수

    * 사이에 있는 매개변수는 키=값

    변수 길이의 형식으로 전달되어야 합니다. 위치 형식 매개변수 kwargsoverflow 키워드 실제 매개변수는 사전에 압축되어 **에 의해 허용되고 변수에 할당됩니다. kwargs

    형식 매개변수와 실제 매개변수의 관계: 함수를 호출하면 실제 매개변수의 값이 형식 매개변수의 변수 이름에 바인딩됩니다. 이 바인딩 관계는 일시적으로 유효하며 호출이 완료된 후에는 무효화됩니다.

    5.2 호출 단계

    위치 매개변수

    호출 단계는 왼쪽에서 오른쪽으로 전달되는 수신 값을 기반으로 하며 형식 매개변수와 일대일로 대응됩니다.

    키워드 실제. 매개변수

    호출 단계에서는 key=value 형식에 따라 형식 매개변수에 값이 전달됩니다. 실제 매개변수에 *가 있는 경우 값을 전달하기 전에 위치 매개변수로 나누어 할당됩니다.

    실제 매개변수의 **는 값을 전달하기 전에 키워드 인수로 나누어 할당됩니다. 6. 데코레이터: 클로저 함수 애플리케이션

    데코레이터는 데코레이팅된 객체에 새로운 기능을 추가하는 데 사용되는 도구입니다

    * *참고:** 데코레이터 자체는 호출 가능한 객체일 수 있으며 데코레이팅된 객체도 호출 가능한 객체일 수 있습니다.

    데코레이터를 사용하는 이유

    **개방 및 폐쇄 원칙: **폐쇄는 수정에 폐쇄되고 수정에 개방되는 것을 의미합니다. Extensions

    6.1 데코레이터 구현은 두 가지 주요 원칙을 따라야 합니다

    1. 데코레이팅된 객체의 소스 코드를 수정하지 마세요.`

    2. 데코레이팅된 객체의 호출 방법을 수정하지 마세요

    데코레이터의 목표: 원칙 1과 2를 따르면서 데코레이팅된 객체에 새로운 기능을 추가하려면

    6.2 데코레이터 구문 설탕

    데코레이션된 후 객체 바로 위에 별도의 줄에 @Decorator 이름을 적습니다

    python解释器一旦运行到@装饰器的名字,就会调用装饰器,然后将被装饰函数的内存地址当作参数传给装饰器,最后将装饰器调用的结果赋值给原函数名 foo=auth(foo) 此时的foo是闭包函数wrapper

    6.3无参装饰器

    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()

    6.4有参装饰器

    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')

    7.题目

    #题目一:
    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[&#39;timeout&#39;]:
                    return func(*args,**kwargs)
            name=input(&#39;name>>: &#39;).strip()
            password=input(&#39;password>>: &#39;).strip()
            if name == &#39;egon&#39; and password == &#39;123&#39;:
                user[&#39;user&#39;]=name
                user[&#39;login_time&#39;]=time.time()
                res=func(*args,**kwargs)
                return res
        return wrapper
    
    @auth
    def index():
        time.sleep(random.randrange(3))
        print(&#39;welcome to index&#39;)
    
    @auth
    def home(name):
        time.sleep(random.randrange(3))
        print(&#39;welcome %s to home &#39; %name)
    
    index()
    home(&#39;egon&#39;)
    
    #题目三:简单版本
    import requests
    import os
    cache_file=&#39;cache.txt&#39;
    def make_cache(func):
        def wrapper(*args,**kwargs):
            if not os.path.exists(cache_file):
                with open(cache_file,&#39;w&#39;):pass
    
            if os.path.getsize(cache_file):
                with open(cache_file,&#39;r&#39;,encoding=&#39;utf-8&#39;) as f:
                    res=f.read()
            else:
                res=func(*args,**kwargs)
                with open(cache_file,&#39;w&#39;,encoding=&#39;utf-8&#39;) as f:
                    f.write(res)
            return res
        return wrapper
    
    @make_cache
    def get(url):
        return requests.get(url).text
    
    
    # res=get(&#39;https://www.python.org&#39;)
    
    # print(res)
    
    #题目四:扩展版本
    import requests,os,hashlib
    engine_settings={
        &#39;file&#39;:{&#39;dirname&#39;:&#39;./db&#39;},
        &#39;mysql&#39;:{
            &#39;host&#39;:&#39;127.0.0.1&#39;,
            &#39;port&#39;:3306,
            &#39;user&#39;:&#39;root&#39;,
            &#39;password&#39;:&#39;123&#39;},
        &#39;redis&#39;:{
            &#39;host&#39;:&#39;127.0.0.1&#39;,
            &#39;port&#39;:6379,
            &#39;user&#39;:&#39;root&#39;,
            &#39;password&#39;:&#39;123&#39;},
    }
    
    def make_cache(engine=&#39;file&#39;):
        if engine not in engine_settings:
            raise TypeError(&#39;egine not valid&#39;)
        def deco(func):
            def wrapper(url):
                if engine == &#39;file&#39;:
                    m=hashlib.md5(url.encode(&#39;utf-8&#39;))
                    cache_filename=m.hexdigest()
                    cache_filepath=r&#39;%s/%s&#39; %(engine_settings[&#39;file&#39;][&#39;dirname&#39;],cache_filename)
    
                    if os.path.exists(cache_filepath) and os.path.getsize(cache_filepath):
                        return open(cache_filepath,encoding=&#39;utf-8&#39;).read()
    
                    res=func(url)
                    with open(cache_filepath,&#39;w&#39;,encoding=&#39;utf-8&#39;) as f:
                        f.write(res)
                    return res
                elif engine == &#39;mysql&#39;:
                    pass
                elif engine == &#39;redis&#39;:
                    pass
                else:
                    pass
    
            return wrapper
        return deco
    
    @make_cache(engine=&#39;file&#39;)
    def get(url):
        return requests.get(url).text
    
    # print(get(&#39;https://www.python.org&#39;))
    print(get(&#39;https://www.baidu.com&#39;))
    
    
    #题目五
    route_dic={}
    
    def make_route(name):
        def deco(func):
            route_dic[name]=func
        return deco
    @make_route(&#39;select&#39;)
    def func1():
        print(&#39;select&#39;)
    
    @make_route(&#39;insert&#39;)
    def func2():
        print(&#39;insert&#39;)
    
    @make_route(&#39;update&#39;)
    def func3():
        print(&#39;update&#39;)
    
    @make_route(&#39;delete&#39;)
    def func4():
        print(&#39;delete&#39;)
    
    print(route_dic)
    
    
    #题目六
    import time
    import os
    
    def logger(logfile):
        def deco(func):
            if not os.path.exists(logfile):
                with open(logfile,&#39;w&#39;):pass
    
            def wrapper(*args,**kwargs):
                res=func(*args,**kwargs)
                with open(logfile,&#39;a&#39;,encoding=&#39;utf-8&#39;) as f:
                    f.write(&#39;%s %s run\n&#39; %(time.strftime(&#39;%Y-%m-%d %X&#39;),func.__name__))
                return res
            return wrapper
        return deco
    
    @logger(logfile=&#39;aaaaaaaaaaaaaaaaaaaaa.log&#39;)
    def index():
        print(&#39;index&#39;)
    
    index()

    위 내용은 Python 함수를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제