func=lambda x:x+1 func(1) Out[3]: 2
func=lambda x,y,z:x+1 func(1,2,3) Out[5]: 2
lambda可以輸入任意多個變量。
func=lambda x,y:lambda z:z+1 func(1) Traceback (most recent call last): File "E:\python\lib\site-packages\IPython\core\interactiveshell.py", line 2963, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-8-9ed089a72395>", line 1, in <module> func(1) TypeError: <lambda>() missing 1 required positional argument: 'y' func(1,2) Out[9]: <function __main__.<lambda>.<locals>.<lambda>(z)> func(1,2)(1) Out[10]: 2 func(2,3)(1) Out[11]: 2
由錯誤可知,第一個括號對應最外層lambda,第一個括號寫入兩個,只是傳參,實例化了一個lambda對象,第二次才會調用函數,並計算值。
from functools import reduce print(reduce(lambda a,b: a+b ,[1,2,3,4])) 10
可以正常計算值,將傳入的序列合並
from functools import reduce print(reduce(lambda a: a+1 ,[1,2,3,4])) Traceback (most recent call last): File "E:\python\lib\site-packages\IPython\core\interactiveshell.py", line 2963, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-16-246742737994>", line 1, in <module> print(reduce(lambda a: a+1 ,[1,2,3,4])) TypeError: <lambda>() takes 1 positional argument but 2 were given print(reduce(lambda a,b,c: a+b+c ,[1,2,3,4])) Traceback (most recent call last): File "E:\python\lib\site-packages\IPython\core\interactiveshell.py", line 2963, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-17-1dfc623ed0ba>", line 1, in <module> print(reduce(lambda a,b,c: a+b+c ,[1,2,3,4])) TypeError: <lambda>() missing 1 required positional argument: 'c'
reduce與lambda合用的那一層,只能傳入兩個參數,會合並傳入的序列,所以傳入兩個值就夠了
from functools import reduce def add(x): x = x+1 return x def mut(x): x = 2 ** x return x print(reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)),[add,mut,add,mut])(1)) print(reduce(lambda f, g: lambda *a, **kw: f(g(*a, **kw)),[add,mut,add,mut])(1)) 32 9
*a, **kw:表示傳入的參數,個數,類型都任意,一種通配的表示方法
第一種是按傳入的序列執行順序操作,先加再冪再加再冪。
第二種是按傳入的序列執行逆序操作,先冪再加再冪再加。
from functools import reduce def test1(x,y,z): a=str(x) return a def test2(x): a = x.split(' ') return a def test3(x): b = [] print(type(x[0])) for i in x: print(type(i)) b.append(list(i)) print(i) return b print(reduce(lambda f, g: lambda x: (g(f(x))),[test1,test2,test3])([1,2,3],[234],1111)) Traceback (most recent call last): File "E:/1_python_code/code/python_1/test.py", line 220, in <module> print(reduce(lambda f, g: lambda x: (g(f(x))),[test1,test2,test3])([1,2,3],[234],1111)) TypeError: <lambda>() takes 1 positional argument but 3 were given from functools import reduce def test1(x,y,z): a=str(x) return a def test2(x): a = x.split(' ') return a def test3(x): b = [] print(type(x[0])) for i in x: print(type(i)) b.append(list(i)) print(i) return b print(reduce(lambda f, g: lambda x,y,z: (g(f(x,y,z))),[test1,test2,test3])([1,2,3],[234],11111)) <class 'str'> <class 'str'> [1, <class 'str'> 2, <class 'str'> 3] [['[', '1', ','], ['2', ','], ['3', ']']]
內層lambda傳入的參數,與test1匹配
from functools import reduce def test1(x,y,z): print('test1') a=str(x) return a def test2(x): print('test2') a = x.split(' ') return a def test3(x): b = [] print('test3') print(type(x[0])) for i in x: print(type(i)) b.append(list(i)) print(i) return b print(reduce(lambda f, g: lambda x,y,z: (f(g(x,y,z))),[test1,test2,test3])([1,2,3],[234],11111)) Traceback (most recent call last): File "E:/1_python_code/code/python_1/test.py", line 223, in <module> print(reduce(lambda f, g: lambda x,y,z: (f(g(x,y,z))),[test1,test2,test3])([1,2,3],[234],11111)) File "E:/1_python_code/code/python_1/test.py", line 223, in <lambda> print(reduce(lambda f, g: lambda x,y,z: (f(g(x,y,z))),[test1,test2,test3])([1,2,3],[234],11111)) TypeError: test3() takes 1 positional argument but 3 were given Process finished with exit code 1 from functools import reduce def test1(x,y,z): print('test1') a=str(x) return a def test2(x): print('test2') a = x.split(' ') return a def test3(x): b = [] print('test3') print(type(x[0])) for i in x: print(type(i)) b.append(list(i)) print(i) return b print(reduce(lambda f, g: lambda x: (f(g(x))),[test1,test2,test3])([1,2,3])) test3 Traceback (most recent call last): <class 'int'> File "E:/1_python_code/code/python_1/test.py", line 223, in <module> <class 'int'> print(reduce(lambda f, g: lambda x: (f(g(x))),[test1,test2,test3])([1,2,3])) File "E:/1_python_code/code/python_1/test.py", line 223, in <lambda> print(reduce(lambda f, g: lambda x: (f(g(x))),[test1,test2,test3])([1,2,3])) File "E:/1_python_code/code/python_1/test.py", line 219, in test3 b.append(list(i)) TypeError: 'int' object is not iterable Process finished with exit code 1
由兩次的錯誤信息,及第二次錯誤的定位,更加肯定將函數內的f和g更換位置后,先執行了test3,是逆序執行。