鱼C论坛

 找回密码
 立即注册
查看: 1127|回复: 10

Lambda匿名函数疑惑

[复制链接]
发表于 2018-4-7 22:22:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. fun = [(lambda n : i + n) for i in range(10)]  
  2. print(fun[3](2))
复制代码


这个表达式里面其实就是 :fun [i ] [n]
此处的i为什么是个定值9?

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-4-7 22:34:28 From FishC Mobile | 显示全部楼层
这里的fun是一个列表,里面的每一个原始都是一个函数,比如fun[3]对应的就是i为3,fun[3](2)表示n为2

怎么说i为定值?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-7 22:38:12 | 显示全部楼层
BngThea 发表于 2018-4-7 22:34
这里的fun是一个列表,里面的每一个原始都是一个函数,比如fun[3]对应的就是i为3,fun[3](2)表示n为2

怎 ...

fun[x](n) 得到的是9+n,i已经到列表尾了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-7 22:38:13 | 显示全部楼层
BngThea 发表于 2018-4-7 22:34
这里的fun是一个列表,里面的每一个原始都是一个函数,比如fun[3]对应的就是i为3,fun[3](2)表示n为2

怎 ...

我试过 print(fun[i] [n])
n取1,这里的 i 取 0-9的时候,结果都是10,说明i是固定的一个值。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-7 22:38:57 | 显示全部楼层
塔利班 发表于 2018-4-7 22:38
fun[x](n) 得到的是9+n,i已经到列表尾了

- -为啥取列表尾的9?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-7 22:44:36 | 显示全部楼层
zhuoyue65 发表于 2018-4-7 22:38
- -为啥取列表尾的9?

我也布吉岛,看结果像是直接定义时候i就取到了9
并没有像想象的让函数不一样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-7 22:56:07 | 显示全部楼层
塔利班 发表于 2018-4-7 22:44
我也布吉岛,看结果像是直接定义时候i就取到了9
并没有像想象的让函数不一样

估计模式是把每个表达式赋予lambda n:n+i用range(10)生成十个
最后需要找i的声明,此时i已经是9了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-8 00:34:51 | 显示全部楼层
python函数闭包的知识点,解决方案是:
  1. fun = [(lambda n, i=i: i + n) for i in range(10)]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-8 08:49:45 | 显示全部楼层
因为
>>> def func1():
...     for i in range(10):
...             print(i)
...
>>> func1()
输出的最后一个9,列表为[9,9,9,9,9,9,9,9,9,9]。并不是想象的[0,1,2,3,4,5,6,7,8,9]。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-8 10:11:59 | 显示全部楼层
本帖最后由 tsembrace 于 2018-4-8 10:32 编辑

i是在函数fun定义期间的变量,fun定义结束后i已经变成9了.再调用fun时i就固定为9了。
类似于:
  1. def f(n):
  2.     l=[]
  3.     for i in range(10):
  4.         def fi():
  5.             return i+n
  6.         l.append(fi)
  7.     return l

  8. print(f(2)[0]())
  9. print(f(2)[1]())
  10. print(f(2)[2]())
  11. print(f(2)[9]())
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-8 11:26:46 | 显示全部楼层
tsembrace 发表于 2018-4-8 10:11
i是在函数fun定义期间的变量,fun定义结束后i已经变成9了.再调用fun时i就固定为9了。
类似于:

还原成闭包的function:

def func1():
        list1=[]
        for i in range(10):
                def func2(n):
                        return n+i
                list1.append(func2)
        return list1;
       
fun=func1()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-29 05:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表