python中学校(八)匿名関数lambdaの使い方
2293 ワード
匿名関数は、その名の通り名前のない関数であり、defで定義された関数との最大の違いは、匿名関数が作成された後に関数自体(すなわち、匿名関数はreturnを必要とせずに値を返す)を返すことであり、式自体の結果は戻り値であり、defが作成された後に変数名を付与し、Pythonではキーワードlambdaを利用して匿名関数を作成し、匿名関数lambda式の形式は次のとおりです.
lambda arg1,arg2,.....argn:expression
以下にlambdaの特徴を示します. lambdaは、文ではなく式です.つまり、式を使用できるシーンのようにlambdaを使用することができます. lambdaの主体も式であり、def定義の関数と同様にlambdaにも関数主体があるが、lambdaの主体は1つの式にすぎないため、その使用機能は大きく制限されている.
余談はさておき、本題に戻ると、やはり栗が来たほうがお得です.
匿名関数の使用:
テスト結果:
プロジェクト実戦:
最近、関数を実行中にエラーが発生しました.
t.timeout.connect(self.updateData())TypeError: argument 1 has unexpected type 'NoneType'
修正結果:
t.timeout.connect(lambda:self.updateData())
はい、原因は何ですか.
個人的には、connect接続は戻り値でありselfであるため、匿名関数を用いることができるのは、この2つが異なる関数であるためである.updateData()は関数の戻り値を返します.値がないので、このエラーが報告されます.
ここにはもう一つの解決策があります.このように書いてもいいです.
t.timeout.connect(self.updateData)
lambda arg1,arg2,.....argn:expression
以下にlambdaの特徴を示します.
余談はさておき、本題に戻ると、やはり栗が来たほうがお得です.
匿名関数の使用:
1 #python3
2
3 test1 = lambda :True
4 # ,
5 print(test1())
6
7 test2 = lambda x: x + 1
8 print(test2(2))
9
10 test3 = (lambda x, y: x + y)(3,4)
11 # ,
12 print(test3)
テスト結果:
True
3
7
プロジェクト実戦:
最近、関数を実行中にエラーが発生しました.
t.timeout.connect(self.updateData())TypeError: argument 1 has unexpected type 'NoneType'
修正結果:
t.timeout.connect(lambda:self.updateData())
はい、原因は何ですか.
個人的には、connect接続は戻り値でありselfであるため、匿名関数を用いることができるのは、この2つが異なる関数であるためである.updateData()は関数の戻り値を返します.値がないので、このエラーが報告されます.
ここにはもう一つの解決策があります.このように書いてもいいです.
t.timeout.connect(self.updateData)