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

原文地址:https://www.cnblogs.com/liuxuanhe/p/9256536.html

时间: 2024-10-25 07:39:04

lambda表达式+reduce的相关文章

java1.8中Lambda表达式reduce聚合测试例子

public class LambdaTest { public static void main(String[] args) { // 相当于foreach遍历操作结果值 Integer out = Stream.of(10, 5, 3, 2, 1, 0).reduce((result, item) -> { if (item >= 3) { result = result + item; } return result; }).get(); System.out.println(out)

三元运算式、lambda表达式、内置函数map、reduce、filter以及yield生成器

一.三元运算(式) 对于一般简单的if else条件判断句可以用三元运算来表示 具体模式为: if condition:   expr1 else:   expr2 等价于: expr1 if condition else expr2 解释:如果if condition条件成立就执行expr1表达式,否则就执行else expr2表达式 示例① >>> if 2 == 2: ...    name = 'cool' ... else: ...    name ='hot' ...  &g

python高阶函数,map,filter,reduce,ord,以及lambda表达式

为什么我突然扯出这么几个函数,是因为我今天在看流畅的python这本书的时候,里面有一部分内容看的有点懵逼. >>> symbols = '$¢£¥€¤' >>> beyond_ascii = [ord(s) for s in symbols if ord(s) > 127] >>> beyond_ascii [162, 163, 165, 8364, 164] >>> beyond_ascii = list(filter(la

python lambda表达式简单用法

转自:http://www.cnblogs.com/guigujun/p/6134828.html 习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即: 1 2 3 4 5 6 7 8 # 普通条件语句 if 1 == 1:     name = 'wupeiqi' else:     name = 'alex'   # 三元运算 name = 'wupeiqi' if 1 == 1 else 'alex' 对于简单的函数,也存在一种简便的表示方式,即:lambda表达式

Java8 Lambda表达式入门

Lambda表达式的实质就是一个匿名函数.C#3.0引入了Lambda表达式,Java8也不甘示弱.Java8发布很久了,今天安装了JDK体验了Java8中的Lambda表达式. 首先看一个不适用Lambda表达式的例子. 比如我们要对一组字符串进行排序. public class Hello { public static void main(String[] args) { List<String> names = Arrays.asList("Tan", "

Python学习心得(四) yield和三元运算以及lambda表达式

1.yield 英文意思生产.生成的意思,在Python中带有yield的函数被称为生成器(Generator) ''' for i in range(10000) #生成10000个元素的List 值越大,运行中占用的内存就会越大 for j in xrange(10000) #xrange返回的不是List,而是一个iterable的对象 每次迭代返回下一个数值,占用很小的内存空间 ''' def readFileByYield(xpath): with open(xpath,'rb') a

Java8 新特性----函数式接口,以及和Lambda表达式的关系

这里来讲解一下Java8 新特性中的函数式接口, 以及和Lambda 表达式的关系.看到过很多不少介绍Java8特性的文章,都会介绍到函数式接口和lambda表达式,但是都是分别介绍,没有将两者的关系说明清楚,在这里,把自己的理解整理如下: 一.函数式接口: 函数式接口其实本质上还是一个接口,但是它是一种特殊的接口:SAM类型的接口(Single Abstract Method).定义了这种类型的接口,使得以其为参数的方法,可以在调用时,使用一个lambda表达式作为参数.从另一个方面说,一旦我

Lambda表达式的五个练习

Lambda表达式的五练习 语法: Lambda函数,是一个匿名函数,创建语法: lambda parameters:express parameters:可选,如果提供,通常是逗号分隔的变量表达式形式,即位置参数. expression:不能包含分支或循环(但允许条件表达式),也不能包含return(或yield)函数.如果为元组,则应用圆括号将其包含起来. 调用lambda函数,返回的结果是对表达式计算产生的结果. 1.题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,

JAVA8 Lambda表达式完全解析

JAVA8 新特性 在学习JAVA8 Lambda之前,必须先了解一下JAVA8中与Lambda相关的新特性,不然对于一些概念会感到比较陌生. 1. 接口的默认方法和静态方法 Java 8允许我们给接口添加一个默认方法,用default修饰即可.默认方法可以重写,也可以不用重写.这就是和抽象方法的区别,在用法上,没有其他区别. public interface IMyInterface { void onMethond(String str);//这是一个抽象方法 default String