lambda表達式+reduce


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,是逆序執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM