day12学習のまとめ

閉鎖機能

閉鎖は、(内部関数function)を含むパッケージ(内部関数ではなく、グローバルスコープの変数外側範囲への参照)を閉じました。

外部基準ではなく、グローバルスコープのスコープの内部機能の機能:閉鎖を指します。

包接機能の閉鎖:次いで、パッケージとの両方の機能を有する缶閉鎖機能+変数内部閉鎖機能の内部には、戻り値アウトフォームから返さ。

閉鎖機能を備えています:関数が関数に関わらず優先外層はその範囲を包んだ場合の呼び出しを行い、また層に包まれたスコープ機能、外、オブジェクトだけでなく、関数オブジェクトを返します。

def f1(url):
    def f2():
        print(url)
        
    return f2

res = f1()  # res = f2
res()  # res() == f2()

デコレーター

デコレータ:装飾的な関数オブジェクトを追加するために使用される種類は、追加の機能である機能

特徴:

  1. コードの本来の機能を変更しません
  2. これは、元の関数が呼び出された変更されません。
import time

def index():
    print('hello world')
    time.sleep(1)

def f2():
    print('f2')
    time.sleep(2)


start = time.time()
index()
end = time.time()
print(f'run time is {end-start}')


start = time.time()
f2()
end = time.time()
print(f'run time is {end-start}')

あなたがそれらを使用するための関数を定義することができ、コードを簡単にする方法を見つけるためにそれらを呼び出すことができるようにインデックスと同じ機能のF2、およびその用途に見つけることができますが、同じです。

第一の方法:方法の呼び出しを変更します

import time

def index():
    print('hello world')
    time.sleep(1)


def time_count(func):
    start =  time.time()
    func()
    end = time.time()
    print(f'{func} run time is {end-start}')
    
time_count(index)

そうする方法を見つけるし、得られた結果は上記と同じですが、インデックスのアプローチは同じではありません使用して見つけることができますすることができます。

第二の方法:パケット関数 - アウトソーシング

import time

def index():
    print('hello world')
    time.sleep(1)

def time_count(func):
    def wrapper():
        start = time.time()
        func()
        end = time.time()
        print(f'{func} run time is {end-start}')
    return wrapper

# f = time_count(index)
# f()  # 这里的f其实就是在调用index函数,但如果命名为f,用户就不知道你在调用index

index = time_count(index)
index()  # 新变量也命名为index,对用户来说,就是在调用之前的index,只不过功能更新了

ソースコードを変更していないインデックスは、time_countウェイ指数関数呼び出し、変更されていない機能はデコレータです。

私たちは、インデックス機能は、実際にラッパー関数を呼び出していること最後の呼び出しを見つけたので、私たちは、インデックスが値を返す場合、そのラッパー関数は、ラッパーとしての指数関数の戻り値を受け取る変数、および関数でなければならない、と思いました戻って返します。

私たちは、以下の調整を行いました。

import time

def index():
    print('hello world')
    time.sleep(1)

    return 123

def time_count(func):
    def wrapper():
        start = time.time()
        res = func()
        end = time.time()
        print(f'{func} run time is {end-start}')
        return res
    return wrapper


index = time_count(index)
res = index()
print(f'res:{res}')

最後に、関数は戻り値123のインデックスを返すことができます。

元のインデックス()メソッドは、質量参加を必要とする場合、我々の以前の方法は=インデックスを()wrapper_に起因して、達成することができないので、パラメータを渡すためのラッパー()関数を与えます。

import time

def home(name):
    print(f'welcome {name} to home page')
    time.sleep(1)

    return name


def time_count(func):
    def wrapper(*args,**kwargs):
        start = time.time()
        res = func(*args,**kwargs)
        end = time.time()
        print(f'{func} time is {end - start}')

        return res
    return wrapper

home = time_count(home)  # 前一个home = wrapper , 括号里的home = home函数

res =  home('egon')  # == wrapper('egon')
print(f'res:{res}')

デコレータのシンタックスシュガー

装飾的な機能ですぐ上、および別の行に書かれています@装饰器名

import time

def time_count(func):
    def wrapper(*args,**kwargs):
        start = time.time()
        res = func(*args,**kwargs)
        end = time.time()
        print(f'{func} run time is {end-start}')

        return res
    return  wrapper

@time_count
def home(name):
    print(f'welcome {name} to home page')
    time.sleep(1)

    return name

res = home('egon')
print(f'res:{res}')

効果と上記のような方法

装飾的なテンプレート

def deco(func):
    def wrapper(*args,**kwargs):
        res = func(*args,**kwargs)
        return res
    return wrapper

ライン上のテンプレートに従って書かれました

三のデコレータ

デコレータ3セット

username_list = []


def sanceng(role):
    def login_deco(func):
        def wrapper(*args,**kwargs):

            if username_list:
                print('请勿重复登录')
                res = func(*args,**kwargs)
                return res

            username_lnp = input('请输入用户名:')
            pwd_inp = input('请输入密码:')

            with open(f'{role}_info.txt','r',encoding='utf8') as fr:
                for user_info in fr:
                    username,pwd = user_info.strip().split(':')
                    if username_lnp == username and pwd_inp== pwd:
                        print('登录成功')
                        username_list.append(username)

                        res = func(*args,**kwargs)
                        return res

                else:
                    print('登陆失败')

        return wrapper

    return login_deco


@sanceng('user')
def index(x,y):
    print('index')
    print('x,y',x,y)

    return  123

res = index(10,20)

イテレータ導入

反復可能オブジェクト

__iter__メソッドを含有する反復可能オブジェクトと呼ばれています

イテレータ

イテレータと呼ば__iter__と__next__方法を含みます

ジェネレータ

yieldキーワードを含む関数は、発電機と呼ばれています

おすすめ

転載: www.cnblogs.com/bowendown/p/11574947.html