python学习日记(匿名函数)
匿名函数
简介
匿名函数:为了解决那些功能很简单的需求而设计的一句话函数。
python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
lambda 只是一个表达式,函数体比 def 简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率
匿名函数
#定义一个函数实现加法运算
def add(x,y):
return x+y
print(add(1,2))
#匿名函数实现
a = lambda x,y:x+y# lamba 参数:返回值
print(a(1,2))

由上面可以看出,匿名函数是可以有函数名的。不过它也真的可以匿名,在和其他功能函数合作的时候。
求字典dic={'k1':10,'k2':100,'k3':30}中value最大的key。
实现:
dic={'k1':10,'k2':100,'k3':30}
def func(k):
return dic[k]
print(max(dic,key=func))
转换成匿名函数:
dic={'k1':10,'k2':100,'k3':30}
print(max(dic,key=lambda k:dic[k]))

求列表l = [1,2,3,4,5,6]的平方。
实现:
l = [1,2,3,4,5,6]
def func(x):
return x**2
f = map(func,l)
for i in f:
print(i,end=' ')

匿名函数实现:
f1 = map(lambda x:x**2,[1,2,3,4,5,6])
for i in f1:
print(i,end=' ')

筛选出列表中大于10的数字
实现:
l = [5,8,11,9,15]
def func(x):
return x > 10
s = filter(func,l)
for i in s:
print(i,end=' ')

匿名函数实现:
s1 = filter(lambda x:x > 10,[5,8,11,9,15])
for i in s1:
print(i,end=' ')

面试题
一、
现有两个元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]
实现:
t1 = (('a'),('b'))
t2 = (('c'),('d'))
r1 = zip(t1,t2)
def func(t):
return {t[0]:t[1]}
r2 = map(func,r1)
print(list(r2))#要求生成列表

匿名函数实现:
r2 = map(lambda t:{t[0]:t[1]},zip((('a'),('b')),(('c'),('d'))))
print(list(r2))

提示:看到要求使用匿名函数实现的,就要立刻联想到能和匿名函数一起使用的功能函数。
min max filter map sorted <——> lambda
还能够这样写:
t1 = (('a'),('b'))
t2 = (('c'),('d'))
r = lambda t1,t2:[{i:j} for i,j in zip(t1,t2)]
print(r(t1,t2))
r1 = [{i:j} for i,j in zip(t1,t2)]
print(r1)

二、
1.下面程序的输出结果是:
d = lambda p:p*2
t = lambda p:p*3
x = 2
x = d(x)
x = t(x)
x = d(x)
print x

很容易看出来,不再赘述。
三、
3.以下代码的输出是什么?请给出答案并解释。
def multipliers():
return [lambda x:i*x for i in range(4)]
print([m(2) for m in multipliers()])
请修改multipliers的定义来产生期望的结果。
输出结果:

解析:1、先定义一个函数 multipliers,未调用。
2、在print语句里面调用函数 multipliers,得到的返回值是一个列表推导式
3、在 i 分别等于0,1,2,3的时候,都生成一个 lamba x:i*x,即返回值是4个 lamba x:i*x
4、四个 lamba x:i*x都是名为 m 的函数,此时调用m,即m(2)
5、调用m函数的时候,x=2,i=3,因为在生成第四个lamba x:i*x的时候,i=3,最终赋值,前面i=0、1、2的时候函数m都未调用
6、即输出[3*2,3*2,3*2,3*2,]——>[6,6,6,6]
如题又说修改函数multipliers的定义来产生期望的结果:
既是想要使i=0、1、2、3的时候分别调用函数m,使输出为[0,2,4,6]
实现:将列表推导式改成生成器表达式就行了。由于惰性,每次调用函数的时候,生成器才执行一次,取出一个值,一个一个取,即满足需求。
def multipliers():
return (lambda x:i*x for i in range(4))
print([m(2) for m in multipliers()])

pass
python学习日记(匿名函数)的更多相关文章
- python学习之---匿名函数,返回函数,偏函数
1. 返回函数: 所谓的返回函数,指的是函数作为返回值.高阶函数除了可以接受函数作为参数外,同样可以接受函数作为结果返回.以下是一个可变参数的求和例子,一般求和函数是如此这般定义的: >> ...
- Python学习 之 匿名函数
1.匿名函数(lambda函数):lambda函数是一种快速定义单行的最小函数,是从Lisp借用来的,可以用在任何需要函数的地方. 普通函数定义如下: def f(x,y): return x*yf( ...
- python学习交流 - 匿名函数
匿名函数 匿名函数是一个很有特色的定义函数的功能.在实际使用的过程,用户有时不得不为一些一行代码即可实现的功能来定义一个函数,例如像map, max, filter等内置函数的key参数只能接收可调用 ...
- python学习:匿名函数
Python 函数 lambda 匿名函数 -lambda 函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方. def fun(x,y): return x*y fu ...
- python学习-27 匿名函数
匿名函数 1. 语法: lanbda x:x+1 def a(x): return x+1 res = a(10) print(res) 运行结果: 11 Process finished wit ...
- python学习第六天--匿名函数、过滤、映射
匿名函数 lambda表达式 过滤器 filter(判断函数,可迭代对象) 会根据提供的函数对指定序列做过滤 映射 map(判断函数,可迭代对象) 会根据提供的函数对指定序列做映射
- python学习日记(函数--装饰器)
楔子 前提,我有一段代码(一个函数). import time def run_time(): time.sleep(0.1) print('我曾踏足山巅') 需求1:现在,我想计算这段代码的运行时间 ...
- python学习日记(函数进阶)
命名空间 内置命名空间 存放了python解释器为我们提供的名字:print,input...等等,他们都是我们熟悉的,拿过来就可以用的方法. 内置的名字在启动解释器(程序运行前)的时候被加载在内存里 ...
- Python学习日记(八) 函数
函数的结构: 函数的返回值: 1.当函数执行时运到return关键字将不再往下执行 def func(): print("hello world!") print("he ...
随机推荐
- iptables的增删改查
iptables是linux系统自带的防火墙,功能强大,学习起来需要一段时间,下面是一些习iptables的时候的记录.如果iptables不熟悉的话可以用apf,是一款基于iptables的防火墙, ...
- MySQL慢查询日志配置方式 slow_query_log
MySQL慢查询(一) - 开启慢查询 - 鲁玉成 - 博客园 https://www.cnblogs.com/luyucheng/p/6265594.html mysql开启慢查询方法 - lava ...
- js-cookie和session
###1.cookie 含义: 存储在访问者的计算机中的变量,即存储在客户端 创建一个cookie /* getCookie方法判断document.cookie对象中是否存有cookie,若有则判断 ...
- js 正则进阶regexp
一.匹配中文,英文字母和数字及_: const reg = /^[\u4e00-\u9fa5\w]+$/; const str1 = 'shangyy'; const str2 = '尚悦悦ww123 ...
- Day 5-5 绑定方法与非绑定方法
绑定方法与非绑定方法: 在类内部定义的绑定方法,分两大类: classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入 ...
- 剑指offer(15)
题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 书中的思路: 按照这个思路我们很容易写出以下代码: import java.util.S ...
- vue中的适配:px2rem
这应该是vue项目在适配移动端时候,最简单的方法之一下面是基本步骤(使用cnpm)1.下载并引入lib-flexible cnpm install --save lib-flexible 在main. ...
- mac 中登陆mysql忘记密码解决办法
1.打开终端,输入命令:cd /usr/local/mysql/bin 2.mysql -uroot -p,用这条命令登陆时报错信息: 报错:Enter password: ERROR 1045 (2 ...
- Python基础知识1-基础语法
pyenv--版本管理工具(后续再补)可参见https://www.jianshu.com/p/8aaf2525fa80 冯诺依曼体系架构 编程基础 语言分类 低级语言到高级语言 高级语言 程序Pr ...
- python爬虫之git的使用(github的使用)
上面博文中我们简单的了解了一下基本的git操作,但是我们都是将代码放到了本地的仓库里面,但是如果我们是一个团队开发的话,肯定不会放到每个人的本地,必须得有个统一的地方存放代码,国外的大家都在使用git ...