day 11-高次関数
6322 ワード
変数としての関数
1.関数呼び出し式
関数呼び出し式-関数を呼び出す文の一般値でできること関数呼び出し式
2.変数として関数
!!pythonで関数を宣言する本質は、functionのタイプの変数を宣言することであり、関数名は変数名である.
変数ができることは、関数でもできます.
1)1つの変数を別の変数にコピーできる
2)変数の再コピー
3)変数を容器の要素とする
4)変数は関数のパラメータとして1つの関数を別の関数の実パラメータとすることができ,1つの関数のパラメータも関数である場合,この関数を実パラメータ高次関数と呼ぶ.
実参高次関数:リスト.sort()、sorted()、max()、min()
sort()とsorted()の2つの関数は実パラメトリック高次関数であり、パラメータkeyがパラメータkeyパラメータを伝達する必要がある関数はソートルールを決定するために使用される:関数にはパラメータと戻り値が必要であり、彼のパラメータはソートする必要があるシーケンスの要素を表し、戻り値は比較対象**数値リストである.ソート・ルールが変更されました:数値の桁数に従って熊が大きくソートされます**
要素の桁数のサイズでソート
要素の最上位レベルのサイズでソート
練習:数字のリストを与えて、各桁数の和の大きさによって小さいから大きいまで並べ替えます
練習:
5)変数が関数の戻り値である関数の戻り値も関数である場合、この関数は戻り値の高次関数である
反復器
1.反復器(iter)とは
反復器はコンテナ型データ型(シーケンス)であり、可変(削除変更はサポートされていません)、秩序化(下付き操作はサポートされていません)して反復器に保存されている要素は、取得できるだけで、取り出した後は保存されず、反復器に要素を追加することもできません.
反復器には対応するフォーマットデータがなく、反復器は他のシーケンスを反復器に変換するか、ジェネレータに変換するしかありません.
2.反復器の要素の取得
どのような方法で反復器の要素を取得しても、1つを取得すると1が少なくなります.1つの要素を取得します.next(反復器)-反復器の上部の要素を取得します.
2)遍歴
ビルダー
1.ジェネレータとは
ジェネレータは反復器です-要素金を取得して反復器と同じように(1つずつ取ることができて、1つ少なく取ることができます)関数体にyieldキーワードがある関数を呼び出して、1つのジェネレータを得ることができます
2.yield
yieldは、関数体でyieldキーワードを呼び出す関数のみが表示され、関数体は実行されず、戻り値も取得されず、ジェネレータが得られます.
3.ジェネレータがどのようにデータを生成するか
1つのジェネレータがいくつかのデータを生成できるかを見て、ジェネレータの対応する関数を実行した後に何回yieldに遭遇するかを見ます.yieldの後ろの値はジェネレータが生成できるデータです
4.ジェネレータがデータを生成する原理
ジェネレータは、すべての要素を同時に保存するのではなく、データが必要なときに一時的にデータを生成します.ジェネレータ要素を取得すると、ジェネレータに対応する関数体が実行され、yieldに遭遇するまで後から実行され、yieldの後ろの値を結果とします.同時に終了位置を保存します.次に次の要素を取得すると、次のyieldに遭遇するまで、最後に終了した位置が後に実行されます.このように、関数の終了までyieldに遭遇しなかった場合、next関数はStopIterationエラーを報告します.
学号を生成するジェネレータを書く
せいせいしき
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式
モジュール
実際に開発する場合、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文に配置します.
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__':