Python関数の使い方

WBOY
WBOY転載
2023-05-08 12:07:171001ブラウズ

    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. ネームスペースとスコープ

    ネームスペースとは、使用される場所(メモリ空間)のことです。名前と値の間のバインディング関係を保存するためのメモリ アドレス

    任意の検索値は名前を介して指定する必要があります。名前にアクセスするには、名前空間を検索する必要があります。

    名前空間は 3 つのカテゴリに分類されます

    組み込み名前空間: Python インタープリターに格納されます名前

    ライフサイクル: インタープリターの開始時に有効になり、無効になりますインタプリタが閉じているとき

    グローバル名前空間: ファイルレベルの名前を保存します

    ライフサイクル: インタプリタが Python ファイルを解釈して実行するときに有効になり、ファイルの実行後は無効になります.

    ローカル名前空間: 関数内で定義された名前

    ライフサイクル: 関数が呼び出されたときにのみ一時的に生成されます。関数のローカル名前空間。関数の呼び出し後は無効になります。

    #読み込み順序

    組み込み->グローバル->ローカル

    名前の検索順序

    現在位置に基づいて上方向に検索します

    現在ローカル エリアに立っていると仮定すると、検索順序はローカル->グローバル->組み込みです

    あなたが現在グローバルな世界にいると仮定すると、検索順序は次のとおりです。 グローバル -> 組み込み

    名の検索順序は、関数定義段階で固定されています (つまり、名前の検索順序は構文チェック時に決定されます) 関数の呼び出し位置とは関係ありません

    つまり、関数がどこで呼び出されても、必ず戻る必要があります。名前の検索関係を決定するために関数が最初に定義された場所

    スコープ: スコープが参照するアクションのスコープです

    グローバル スコープ: 組み込みの名前が含まれます名前空間とグローバル名前空間

    機能: グローバルに有効、グローバルに存続

    ローカル スコープ: ローカル名前空間内の名前が含まれます

    機能: ローカルに有効、一時的に存続

    global: ローカルでの名前の宣言はグローバル スコープから取得され、グローバルをローカルで変更するために使用できます。不変型

    nonlocal: 現在のレイヤーの外側のレイヤーのスコープから名前を宣言します。これは、外部関数の不変型をローカルに変更するために使用できます

    4. クロージャ関数

    は関数内で定義されており、外部関数のスコープ名への参照が含まれています。クロージャ関数をグローバル スコープに返して使用できるようにするには、関数オブジェクトの概念を組み合わせる必要があります。これにより、関数の階層制限が破られます。

    クロージャ関数は、関数本体に値を渡すためのソリューションを提供します。

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

    5. 関数のパラメータ

    5.1 定義段階

    位置形状パラメータ

    左から順に定義される仮パラメータ定義フェーズで右へ

    #デフォルトの仮パラメータ

    が定義フェーズで定義されました。その初期化割り当て

    キーワード パラメータ

    無料テーマ

    可変長の仮パラメータ args

    オーバーフローした位置パラメータ。タプルにパックされ、受け入れられるように指定され、args の変数名に割り当てられます。

    名前付きキーワード パラメータ

    * との間に配置されたパラメータは key=value の後に続く必要があります。形式値の転送

    可変長の位置パラメータ kwargs

    オーバーフロー キーワード引数は辞書にパックされ、** によって受け入れられ、変数 kwargs

    Form に割り当てられます。 パラメーターと実際のパラメーターの関係: 関数を呼び出すとき、実際のパラメーターの値は変数名にバインドされます。このバインディング関係は一時的に有効であり、呼び出しが完了すると無効になります。

    5.2 呼び出しフェーズ

    位置パラメータ

    呼び出しフェーズでは、左から右に渡される値が仮パラメータに 1 対 1 で対応します。

    キーワード実パラメータ

    呼び出しではフェーズでは、値は key=value 形式に従って仮パラメータに渡されます。

    実パラメータに * がある場合、値が渡されます。値を渡す前に、まず値を分割します。位置実パラメータを指定し、値

    を割り当てます。実パラメータの ** は、値を渡す前に、キーワード実パラメータに分割して、値

    ## を割り当てます。 #6. デコレータ:クロージャ関数の適用

    デコレータは、装飾されたオブジェクトに新しい関数を追加するために使用されるツールです。

    **注意:**デコレータ自体は、呼び出し可能なオブジェクトであれば何でも構いません。装飾されたオブジェクトは、任意の呼び出し可能なオブジェクトです。

    デコレータを使用する理由

    **オープンとクローズの原則:**クローズとは、変更に対してクローズされ、拡張に対してクローズされることを指します。 Open

    6.1 の実装デコレータは 2 つの主要な原則に従う必要があります。

    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 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。