匿名函数和推导式共用

匿名函数和推导式共用

https://www.cnblogs.com/yangzhizong/p/10348158.html
Python-有名匿名函数、列表推导式
介绍:

匿名函数: 匿名函数用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤,节省开辟空间。

列表推导式:

有名函数

#1.有名函数(初始)
def square(x):
    return x**2
res=map(square,[1,2,3,4,5])
print(res) #<map object at 0x007193B0> 是一个生成器对象,a.__next__()取值
print(list(res)) #[1, 4, 9, 16, 25]

匿名函数

#2.匿名函数(匿名函数改进)
# res=map(lambda x:x**2,[1,2,3,4,5])
# print(res) #<map object at 0x020936B0>
# print(list(res)) #[1, 4, 9, 16, 25]

列表推导式

#3.实际工作中,建议使用——列表生成式改进

l=[]
def square(x):
    l.append(x**2)
for i in [1,2,3,4,5,6]:
    square(i)
print(l) #[1, 4, 9, 16, 25, 36]

注意点:lamdba+列表推导式的坑

#主意:lambda+列表推导式的坑
res=[lambda x:i**2 for i in range(3)]
# res=[lambda x:i**2 for i in range(3)]

print(res[0](0)) # 结果4,[<function <listcomp>.<lambda> at 0x08757540>, <function <listcomp>.<lambda> at 0x087574F8>, <function <listcomp>.<lambda> at 0x087575D0>, <function <listcomp>.<lambda> at 0x08757660>, <function <listcomp>.<lambda> at 0x087576A8>]
# print(res[0](10)) #结果4,(10)相当于是为lambda函数值传参  

看下面代码回答输出的结果是什么?为什么?

result = [lambda x: x + i for i in range(10)]
print(result[0](10))

这是一个结合了变量作用域、列表推导式和匿名函数的题目,较为复杂,比较考验Python基础知识掌握程度。有同学可能会回答10,其实答案是19,并且result0~9的结果都是19。
这是因为函数具有调用时才查找变量的特性。在你没调用它之前,它不会保存也不关心它内部变量的具体值。只有等到你调用它的时候,它才逐一去找这些变量的具体值。这里的result[0]被调用的时候,变量i已经循环完毕,变成9了,而不是想象中的动态0-9值。
那如果不想要这样的结果,想要i是循环的值怎么办?不要直接引用上层变量,把变量直接传进来。

result = [lambda x, i=i: x + i for i in range(10)]
print(result[0](10))

# result = [lambda x: x + i for i in range(6)]
# print(result[1](9))

result是一个列表,[]其代表的是列表索引,()传值给x 该语句中 for循环中的i
并没有任何一个语句去接收他每次循环变化的值, 故每一次的i都为最后循环后的结果 也就是5 所有 无论[]为任何值 其result
都为14

result = [lambda x, r=i: x + r    for i in range(1,6)]
print(result[0](9))
print(result[1](9))

在这段语句中 多了一个r=i 也就是r会去接收每一循环变化的值 所以在列表result中的每次的数字都会因为i的变化而变化

面试题:

print(list(map(lambda x: x * x, [y for y in range(3)])))的输出?
  1. [0, 1, 4]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值