day 11-高次関数

6322 ワード

変数としての関数
1.関数呼び出し式
関数呼び出し式-関数を呼び出す文の一般値でできること関数呼び出し式
2.変数として関数
!!pythonで関数を宣言する本質は、functionのタイプの変数を宣言することであり、関数名は変数名である.
変数ができることは、関数でもできます.
a = lambda x: x * 2
print(a(4))

1)1つの変数を別の変数にコピーできる
def func4(x):
    print('      ;', x)

c = func4
c(10)

2)変数の再コピー
def func4(x):
    print('      ;', x)

c = func4
c(10)

func4 = 444
print(func4)
c(10)

3)変数を容器の要素とする
a = 10
list1 = [a, 10]
print(list1[0] / 2)

def func4(x):
    print('      ;', x)
list1 = [func4, func4(20)]
print(list1[0](9))

4)変数は関数のパラメータとして1つの関数を別の関数の実パラメータとすることができ,1つの関数のパラメータも関数である場合,この関数を実パラメータ高次関数と呼ぶ.
def func6(x):
    print(x)

func6(func4)
listn = []
for x in range(5):
    listn.append(lambda i: i * x)
print(listn[0](2))  # listn[8, 8, 8, 8, 8]

実参高次関数:リスト.sort()、sorted()、max()、min()
sort()とsorted()の2つの関数は実パラメトリック高次関数であり、パラメータkeyがパラメータkeyパラメータを伝達する必要がある関数はソートルールを決定するために使用される:関数にはパラメータと戻り値が必要であり、彼のパラメータはソートする必要があるシーケンスの要素を表し、戻り値は比較対象**数値リストである.ソート・ルールが変更されました:数値の桁数に従って熊が大きくソートされます**
nums = [1, 78, 9, 79, 67, 100]

nums.sort(key=lambda item: item)
print(nums)

要素の桁数のサイズでソート
nums = [21, 1, 378, 69, 9, 79, 67, 100]
def func1(item):
    return item % 10
nums.sort(key=func1)
print(nums)

要素の最上位レベルのサイズでソート
nums = [21, 1, 8, 378, 69, 9, 79, 67, 100]
def func1(item):
    return int(str(item)[0])
nums.sort(key=func1)
print(nums)

練習:数字のリストを与えて、各桁数の和の大きさによって小さいから大きいまで並べ替えます
nums = [12, 67, 18, 90, 890, 123, 99]
def func2(item):
    sum1 = 0
    for ch in str(item):
        sum1 += int(ch)
    return sum1
nums.sort(key=func2)
print(nums)

練習:
all_students = [
    {'name': '  1', 'age': 23, 'score': 50, 'id': 'stu001'},
    {'name': '  2', 'age': 20, 'score': 87, 'id': 'stu041'},
    {'name': '  3', 'age': 19, 'score': 74, 'id': 'stu061'},
    {'name': '  4', 'age': 78, 'score': 90, 'id': 'stu023'}
]
#          
def func4(item):
    return item['score']
all_students.sort(key=func4)
print(all_students)

#     
print(max(all_students, key=lambda item:item['score']))

nums = [12, 39, 56]
print(max(nums, key=lambda item: item%10))

5)変数が関数の戻り値である関数の戻り値も関数である場合、この関数は戻り値の高次関数である
def func1():
    def func11():
        return 10

return func11

print(func1()())

反復器
1.反復器(iter)とは
反復器はコンテナ型データ型(シーケンス)であり、可変(削除変更はサポートされていません)、秩序化(下付き操作はサポートされていません)して反復器に保存されている要素は、取得できるだけで、取り出した後は保存されず、反復器に要素を追加することもできません.
反復器には対応するフォーマットデータがなく、反復器は他のシーケンスを反復器に変換するか、ジェネレータに変換するしかありません.
iter1 = iter([10, 20, 30])
print(iter1)

iter2 = iter('abc')
print(iter2)

2.反復器の要素の取得
どのような方法で反復器の要素を取得しても、1つを取得すると1が少なくなります.1つの要素を取得します.next(反復器)-反復器の上部の要素を取得します.
iter2 = iter('abc')
print(next(iter2))
print(next(iter2))
print(next(iter2))

2)遍歴
iter2 = iter('abc')
print(next(iter2))
for x in iter2:
    print('===', x)

ビルダー
1.ジェネレータとは
ジェネレータは反復器です-要素金を取得して反復器と同じように(1つずつ取ることができて、1つ少なく取ることができます)関数体にyieldキーワードがある関数を呼び出して、1つのジェネレータを得ることができます
2.yield
yieldは、関数体でyieldキーワードを呼び出す関数のみが表示され、関数体は実行されず、戻り値も取得されず、ジェネレータが得られます.
3.ジェネレータがどのようにデータを生成するか
1つのジェネレータがいくつかのデータを生成できるかを見て、ジェネレータの対応する関数を実行した後に何回yieldに遭遇するかを見ます.yieldの後ろの値はジェネレータが生成できるデータです
def func2():
    yield 100
    yield 'abc'
    for x in range(5):
        yield x

gen1 = func2()
print(gen1)
print(next(gen1))
print(next(gen1))
print(next(gen1))
for x in gen1:
    print('====', x)

4.ジェネレータがデータを生成する原理
ジェネレータは、すべての要素を同時に保存するのではなく、データが必要なときに一時的にデータを生成します.ジェネレータ要素を取得すると、ジェネレータに対応する関数体が実行され、yieldに遭遇するまで後から実行され、yieldの後ろの値を結果とします.同時に終了位置を保存します.次に次の要素を取得すると、次のyieldに遭遇するまで、最後に終了した位置が後に実行されます.このように、関数の終了までyieldに遭遇しなかった場合、next関数はStopIterationエラーを報告します.
def func3():
    print('=====     ======')
    yield 1
    print('======     =====')
    yield 2
    print('=====     ======')
    yield 3
    print('end')

gen2 = func3()
print(next(gen2))

学号を生成するジェネレータを書く
def creat_id():
    num = 1
    while True:
        yield 'stu' + str(num)
        num += 1

nums = creat_id()
print(next(nums))
print(next(nums))
for _ in range(10):
    print('=====:', next(nums))

せいせいしき
1.生成式とは
生成式の本質はジェネレータです
1)構文1(式for変数inシーケンス)-ジェネレータを作成してジェネレータに展開:def func 1():for変数inシーケンス:yield式
[式for変数inシーケンス]-生成式に対応するジェネレータをリストに変換
2)構文2(式for変数inシーケンスif条件文)-ジェネレータを作成
展開ジェネレータ:def func 1():for変数inシーケンス:if条件文:yield式
gen1 = (x*2 for x in range(10))
​```
def func():
    for x in range(10):
    yield x*2
gen1 = func()
​```
print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))

list1 = list(gen1)
print(list1)
 print(next(gen1))     #StopIteration

list2 = [x*x for x in range(1, 10)]
print(list2)
list3 = list(x*x for x in range(1, 10))
print(list3)
dict1 = dict((x, x*2) for x in range(5))
print(dict1)

list4 = ['stu' + str(x) for x in range(10) if x%2]
print(list4)

list5 = ['%d*2=%d' % (x, x*2) for x in range(5)]
print(list5)

モジュール
実際に開発する場合、1つのプロジェクトは複数のモジュール1に分けられる.モジュールとは何ですか:pyファイルがモジュールです
2.マルチモジュールの連携
1)importモジュール名-現在のモジュールに指定モジュールをインポートし、インポート後、指定モジュールのすべてのグローバル変数を使用して'モジュール名を使用できます.変数'の方式はfromモジュール名importグローバル変数1,グローバル変数2,...
               -                  ;                  

3)importモジュール名as新モジュール名fromモジュール名import変数1 as新変数1,変数2 as新変数2,...
                -        ,          

4)ワイルドカード**fromモジュール名import***-モジュール内のすべてのグローバル変数をインポートし、グローバル変数を直接使用します.
3.モジュール導入の原理
インポートモジュールのコードを実行すると、実質的にインポートされたモジュールに対応するpyファイルが実行される
他の人に実行されたくないコードモジュールを次のif文に配置します.
if __name__ == '__main__':