一、先来看下lambda表达式

1、lambda表达式其实很简单,他是简单的函数的变种,只有三部分组成,之前老师没有讲清楚,今天看书,终于明白了,写个博客记录下

lambda关键字+参数+返回值,参数之间用逗号隔开,参数和返回值之间用冒号隔开,表达式结尾最好用分号隔开;

我们看下下面的例子

f = lambda x,y,z:x * y * z

print(f(2,3,4))

  

lambda关键字,x,y,z是三个参数,表达式 x * y * z就是在函数中的returen中的表达式,我们可以通过f来调用这个lambda表达式,通过传递指定参数,然后拿到表达式的结果

结果如下

2、表达式其实主要使用的场景是在列表或者字典中,看下下面的例子

l = [
lambda x:x ** 2,
lambda x:x ** 3,
lambda x:x ** 4, ]
for f in l:
print(f(100)) print(l[0](100))

  

结果如下

3、lambda也可以传递默认参数,我们看下下面的例子

f = lambda x,y=2,z=3:x + y + z

print(f(1,4,5))

print(f(2,4))

print(f(2))

  

结果如下

4、lambda还可以实现简单的if-else语句

f = lambda x,y:"aaa" if x > y else "bb";

print(f(2,4))

#如果x大于y,则返回“aaa”,如果x不大于y,则返回“bbb”

  

结果如下

5、还可以在一个函数中定义一个lambda,这个lambda还可以运用函数中的局部变量

import sys
def test(x):
sys.stdout.write("hahh" + "\n")
#sys.stdout.write( == print return lambda y:x * y f = test(2) # 这里这个f是lambda表达式的地址 sys.stdout.write(str(f(3)))
#这个lambda可以直接使用函数中的局部变量x

  

结果如下

二、在来介绍一下map这个内置函数

map这个内置的作用就是:对一个或者多个可迭代的对象,比如列表,元组,遍历每一个元素,然后将每个元素作为参数传递到map的第一个参数中,这个参数一定是一个函数的地址,然后返回一个可迭代的对象,这个对象必须要用list才能打印出来,我们看下面的例子

f = lambda x:x + 100

print(map(f,[1,2,3,4,5,6,7,8,9]))

# 这里是返回这个对象的地址

print(list(map(f,[1,2,3,4,5,6,7,8,9])))
#通过list方法才能拿到这个可迭代对象的内容

  

结果如下

map内置函数不仅仅可以传递一个可迭代的对象,还可以传递多个可迭代的对象,他首先从第一个对象中取第一个值,然后从第二个对象中取第一个值,依次类推

f = lambda x,y: x + y + 100;

print(list(map(f,[1,2,3,4,5,6,7,8,9],[1,2,3,4,5,6,7,8,9])))

  

结果如下

三、最后在来介绍下filter函数

filter函数的作用将可迭代对象中的每个元素传递到filter的第一个参数中,这个参数一定是一个函数,然后将执行结果为true的返回到可迭代的对象中,执行结果为false的直接丢失,也就是被过滤掉了

f = lambda x:True if x > 5 else False;

print(list(filter(f,[1,2,3,4,5,6,7,8,9])))

  

结果如下

上面的例子还可以简写成这样

f = lambda x:x > 5;

print(list(filter(f,[1,2,3,4,5,6,7,8,9])))

  

结果如下

最后一点版面在稍微复习一下生成器

def gen(x):
for i in range(x):
temp = yield i ** 3
print(temp) g = gen(5)
a = next(g)
print(a) a = next(g)
print(a)

  

a、执行g = gen(5),生成了一个生成器

b、然后在a = next(g),这里这个a是什么呢?因为next方法执行yield就终止了,不继续往下执行,而yield后面的表达式的值就相当于普通函数的return,所以a的值就相当于yield后面表达式的值,这里也就是“0”,执行到这里后,就从函数中跳出来,因为遇到yield了,所以就需要跳出函数,执行外面的语句

c、第三步就开始执行print(a)语句,因为a 就相当于函数的返回值,也就是yield后面表达式返回的值,所以这里是0

d、执行完print(a)语句后,我们的第四步就是再次使用next方法进入生成器,这个时候,生成器函数是从上次跳出函数的位置开始执行,也就是print(temp),而这个temp是什么呢?temp不是yield后面返回的,temp的值只能通过外部生成器对象调用send方法进行传递,这里我们没有在外部通过生成器对象调用send方法传递,所以这里的值默认情况下是none

我们在看下面这个例子,这里就有外部调用生成器对象是一共send方法

def gen(x):
for i in range(x):
temp = yield i ** 3
print(temp) g = gen(5)
a = next(g)
print(a) g.send("xxxx") a = next(g)
print(a)

  

a、执行g = gen(5)语句,生成一个生成器对象,这个对象就是g

b、然后在a = next(g),这里这个a是什么呢?因为next方法执行yield就终止了,不继续往下执行,而yield后面的表达式的值就相当于普通函数的return,所以a的值就相当于yield后面表达式的值,这里也就是“0”,执行到这里后,就从函数中跳出来,因为遇到yield了,所以就需要跳出函数,执行外面的语句

c、第三步就开始执行print(a)语句,因为a 就相当于函数的返回值,也就是yield后面表达式返回的值,所以这里是0

d、第四步很关键,我们这里使用生成器对象g调用send方法g.send("xxxx"),这个方法就会传递“xxxx”这个字符串给yield前面的变量,也就是temp这个变量会被赋值为“xxxx”,因为生成器上次是print(temp)语句退出的,通过send方法也可以进行生成器内部,所以第四步这里首先会执行print(temp)语句,这里就会打印"xxxx"

e、打印完xxx后就会继续执行a = next(g)语句,这里就和上一个例子的效果是一样的

lambda表达式&map&filter&yield的更多相关文章

  1. python lambda表达式&map/filter/reduce

    习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即: 1 2 3 4 5 6 7 8 # 普通条件语句 if 1 == 1:     name = 'wupeiqi' else ...

  2. lambda表达式,filter,map,reduce,curry,打包与解包和

    当然是函数式那一套黑魔法啦,且听我细细道来. lambda表达式 也就是匿名函数. 用法:lambda 参数列表 : 返回值 例: +1函数 f=lambda x:x+1 max函数(条件语句的写法如 ...

  3. Python的lambda表达式、filter、map、reduce等函数的用法

    lambda是表达式,用于创建匿名函数,可以和filter.map.reduce配合使用.本文环境Python3.7. 一.lambda表达式 lambda 只包含一个语句,用于创建匿名函数. 语法: ...

  4. python语法学习第五天--lambda表达式、filter()、map()

    lambda表达式 python使用lamda表达式来创建匿名函数 lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数 语法: lambda [arg1 [,arg ...

  5. map内置函数、lambda表达式、快捷生成想要的列表、filter内置函数

      map函数                             语法 map(function, iterable, ...) 参数 function -- 函数,有两个参数 iterable ...

  6. Java8新特性之forEach+Lambda 表达式遍历Map和List

    这是Java8系列的第二篇,今天来说一下Java8中forEach的简单使用.我们使用对比的方式来看应该会看得更加清楚,更能理解: 一.遍历Map ============Java8之前的方式==== ...

  7. Lambda表达式看这篇基本就够用了

    本文讯] 2020.05.08  polo  写博不易,尊重知识! Lambda  是java8 引入的一个新特性,闭包,又叫函数式接口,下面介绍下,常用的lambda表达式方式: 所谓的将函数作为一 ...

  8. python第l六天,lambda表达式学习,涉及filter及Map。

    在python中lambda表达式可以作为匿名函数来使用,举一个简单的栗子: 以前我们写两个数相加的函数需要 #以前我们写两个数相加的函数,需要这样写 >>> def sum(x,y ...

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

    为什么我突然扯出这么几个函数,是因为我今天在看流畅的python这本书的时候,里面有一部分内容看的有点懵逼. >>> symbols = '$¢£¥€¤' >>> ...

随机推荐

  1. 转载CopyOnWriteArrayList

    转载原文 http://www.cnblogs.com/dolphin0520/p/3938914.html Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开 ...

  2. jquery的相关应用

    1.jQuery获取鼠标事件源(万能) 1 //任意位置 2 3 $(document).ready(function(){ 4 5 $(document).click(function(){ 6 $ ...

  3. Unreal Engine 4(虚幻UE4)GameplayAbilities 插件入门教程(六)GameplayEffect的级别设置

    本节的内容不难,权当是复习.如果没有完成前面的教程,请前往学习. 第一步:用一个csv文件表示级别数据,下图中的Hurt随级别1~7表示其损伤值在1~7级别时分别是-7,-14,-20等.写好之后关闭 ...

  4. Hive基础之Hive环境搭建

    Hive默认元数据信息存储在Derby里,Derby内置的关系型数据库.单Session的(只支持单客户端连接,两个客户端连接过去会报错): Hive支持将元数据存储在关系型数据库中,比如:Mysql ...

  5. python学习之----urllib与urllib2的区分

    urllib 还是urllib2 ? 如果你用过Python 2.x 里的urllib2 库,可能会发现urllib2 与urllib 有些不同. 在Python 3.x 里,urllib2 改名为u ...

  6. 《opencv学习》 之 OTSU算法实现二值化

    主要讲解OTSU算法实现图像二值化:    1.统计灰度级图像中每个像素值的个数. 2.计算第一步个数占整个图像的比例. 3.计算每个阈值[0-255]条件下,背景和前景所包含像素值总个数和总概率(就 ...

  7. c++官方文档

    来自官方文档...感谢老王指出需要c++11,一下代码全在c++11下编译,编译参数加入  -std=c++11 #include<stdio.h> #include<iostrea ...

  8. java web 读取文件,文件路劲不对的问题

    都知道,一般java项目,编译后的文件是在classes文件夹下面: 而java web项目,则是在WEB-INF/classes文件夹下面.new File(fileName)须先获取tomcat中 ...

  9. Jenkins + testNg + maven 项目持续集成

    搞了一整天,梳理下关键点: 1.项目的pom.xml要配置插件,同时指定testng.xml文件的位置.就被这个卡了好久 <properties> <maven-surefire-p ...

  10. jsp 调用其他jsp页面 跳转

    response.sendRedirect("test2.jsp"); window.location.reload("test2.jsp"); locatio ...