鱼C论坛

 找回密码
 立即注册
查看: 2817|回复: 17

[已解决]这个函数看不懂啊!!

[复制链接]
发表于 2017-4-12 20:33:04 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 hikaru2015 于 2017-4-12 20:34 编辑

函数.jpg 这段这个函数看不懂啊, 为什么要用同一个名字acts = makeactions(),后面输出时act[0](2)这两个参数是什么意思?
最佳答案
2017-4-13 09:59:52
本帖最后由 AntiCode 于 2017-4-13 10:33 编辑

第一个问题:
acts=makeActions()#就是引用一个function赋给acts而已,跟函数里面的变量acts没有关系。也可以是其他的名字,act cat tac都一样。
第二个问题:后面输出时acts[0](2)这两个参数是什么意思?
acts返回的是一个长度是5的列表,列表的每一个元素是一个匿名函数表达式,即从0至4的x次幂,acts[0]指的是列表中的第一个元素,后面的(2)是为函数makeActions()中的匿名函数lambda x: i**x  中变量x传入的参数。

PS:
1.此题中的话就是lambda x: i**x嵌套在了一个for循环中,然后lambda函数引用了一个上层作用域的变量i,i在循环,所有在这个循环中产生的函数将会有相同的值(即最后一次循环中完成时被引用变量的值,i=4)。
所以,return acts返回了一个由五个4**x的值组成的list。

2.给lambda x: i**x  设置默认值  lambda x, i=i: i**x  使用默认值来保存其循环变量i的值到lambda创建的函数.

再PS:
      这道题想表达的意思就是想讲作用域、嵌套函数、和默认参数相关的东西,我可能表述的不大清楚,建议查询此类文档。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-12 21:08:10 | 显示全部楼层
第一个问题
就是给函数赋值
举个例子
f = int()
print(f('2'))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-12 21:42:20 | 显示全部楼层
新手·ing 发表于 2017-4-12 21:08
第一个问题
就是给函数赋值
举个例子

不是很明白,acts已经是一个空列表了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-12 23:22:41 | 显示全部楼层
新手表示不懂这种函数的玩法,只能表示有点666
但是感觉没什么乱用,如果楼主是个python高手,正在玩一些高级的函数,那我表示很钦佩,如果楼主也是新手,却在这里纠结这种看似高大上实际上去根本用不着的东西,我只能表示,楼主学python可能就是为了装个逼,那我建议你去知乎,毕竟那里大神多,装逼的技能到处是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-12 23:35:06 | 显示全部楼层
本帖最后由 hikaru2015 于 2017-4-12 23:40 编辑
gopythoner 发表于 2017-4-12 23:22
新手表示不懂这种函数的玩法,只能表示有点666
但是感觉没什么乱用,如果楼主是个python高手,正在玩一些 ...


看不懂代码上来求助很正常,如果你回帖是为了提问或者解答,很欢迎,但说些阴阳怪气的话,大可不必,知乎更适合你

点评

不,我坚决不同意楼主的看法!: 5.0
不,我坚决不同意楼主的看法!: 5
不要随意评论别人的看法  发表于 2017-4-13 16:51
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-12 23:40:45 From FishC Mobile | 显示全部楼层
这好像是闭包了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-13 08:40:36 | 显示全部楼层
hikaru2015 发表于 2017-4-12 23:35
看不懂代码上来求助很正常,如果你回帖是为了提问或者解答,很欢迎,但说些阴阳怪气的话,大可不必,知 ...

对 总觉得那小子 喜欢装逼

点评

不,我坚决不同意楼主的看法!: 5.0
不,我坚决不同意楼主的看法!: 5
不要随意评论别人的看法  发表于 2017-4-13 16:51

评分

参与人数 1荣誉 -5 鱼币 -5 收起 理由
新手·ing -5 -5 这样说话会倒霉的

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-4-13 09:06:19 | 显示全部楼层
hikaru2015 发表于 2017-4-12 21:42
不是很明白,acts已经是一个空列表了啊

一个是函数内部成员变量,一个是调用函数。分清楚两个是不同的概念,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-13 09:59:52 | 显示全部楼层    本楼为最佳答案   
本帖最后由 AntiCode 于 2017-4-13 10:33 编辑

第一个问题:
acts=makeActions()#就是引用一个function赋给acts而已,跟函数里面的变量acts没有关系。也可以是其他的名字,act cat tac都一样。
第二个问题:后面输出时acts[0](2)这两个参数是什么意思?
acts返回的是一个长度是5的列表,列表的每一个元素是一个匿名函数表达式,即从0至4的x次幂,acts[0]指的是列表中的第一个元素,后面的(2)是为函数makeActions()中的匿名函数lambda x: i**x  中变量x传入的参数。

PS:
1.此题中的话就是lambda x: i**x嵌套在了一个for循环中,然后lambda函数引用了一个上层作用域的变量i,i在循环,所有在这个循环中产生的函数将会有相同的值(即最后一次循环中完成时被引用变量的值,i=4)。
所以,return acts返回了一个由五个4**x的值组成的list。

2.给lambda x: i**x  设置默认值  lambda x, i=i: i**x  使用默认值来保存其循环变量i的值到lambda创建的函数.

再PS:
      这道题想表达的意思就是想讲作用域、嵌套函数、和默认参数相关的东西,我可能表述的不大清楚,建议查询此类文档。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-13 10:18:09 | 显示全部楼层
本帖最后由 zlj19931010 于 2017-4-13 10:21 编辑

为什么要用同一个名字acts = makeactions(),后面输出时act[0](2)这两个参数是什么意思?
1、acts = makeactions()因为函数内的acts是局部变量,外部接受的随你取名称呀,取什么都可以呀
2、act[0](2)调用lambda 函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-13 14:22:51 | 显示全部楼层
本帖最后由 lumber2388779 于 2017-4-13 14:24 编辑

都用acts这个变量名只是因为编写者是个人爱好,makeActions实际是返回一个列表,列表中每个元素都是指向一个lambda函数,只是函数中的i值会不一样,act[0]其实就是lambda x:0**x,act[1]就是lambda x:1**x,以此类推,这个你看下makeActions函数就能知道
所以act[0](2)应该会是 lambda x: 0**2 答案应该是0,但是答案并非0,那是由于在每次循环中 lambda都未绑定i的值,所以直到循环结束,i的值为4,并将lambda中所用到的i值定为4,所以acts列表中其实每一个元素都是lambda x:4**x,当你括号中的值为2时,那么结果都是一样的
你可以先去理解下lambda这个关键词使用先,这个只是为了方便一些简单重复调用某个公式,但又不想去写一个函数时使用

9楼说的很明确,我这个你看不懂就忽略了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-14 11:01:08 | 显示全部楼层
lovesword 发表于 2017-4-13 08:40
对 总觉得那小子 喜欢装逼

说自己的看法也不行?
这还有没有网法了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-14 13:34:22 | 显示全部楼层
AntiCode 发表于 2017-4-13 09:59
第一个问题:
acts=makeActions()#就是引用一个function赋给acts而已,跟函数里面的变量acts没有关系。也 ...

>>> def c():
        acts = []
        for i in range(5):
                acts.append(lambda x:i ** x)
        return acts

>>> d = c()
>>> d[0](2)
16
>>> c[0](2)
Traceback (most recent call last):
  File "<pyshell#37>", line 1, in <module>
    c[0](2)
TypeError: 'function' object is not subscriptable

您好,请教一个问题,为何既然  d = c()     为什么  c 不能像 d 一样输入2个值 ?
未命名图片.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-14 15:44:22 | 显示全部楼层
Himmery 发表于 2017-4-14 13:34
>>> def c():
        acts = []
        for i in range(5):

c 是个function
应该这么写 c()[0](2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-15 08:53:51 | 显示全部楼层
AntiCode 发表于 2017-4-14 15:44
c 是个function
应该这么写 c()[0](2)

明白了,谢谢~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-19 19:17:54 | 显示全部楼层
列表里有函数的调用,lambda表达式可以去看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-4 20:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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