鱼C论坛

 找回密码
 立即注册
查看: 3193|回复: 9

[已解决]关于以下代码 疑问

[复制链接]
发表于 2015-11-27 11:32:47 | 显示全部楼层 |阅读模式
5鱼币
def make_repeat(n):
        return lambda s : s * n

double = make_repeat(2)
print(double(8))
print(double('FishC'))





lambda s : s * n被无视了????



没看懂,求详解
最佳答案
2015-11-27 11:32:48
  1. idle中键入
  2. make_repeat
  3. 显示<function make_repeat at 0x000000000379FB70>,说明是个函数。
  4. 键入 make_repeat('FishC')
  5. 显示<function make_repeat.<locals>.<lambda> at 0x00000000037BF0D0>则又是对匿名函数的调用
  6. 键入make_repeat('FishC')(2)
  7. 显示最终结果:'FishCFishC'
复制代码


因此可知第一个参数是make_repeat使用的,第二个参数再传递给匿名函数。
这样的用法也是第一次看到。

最佳答案

查看完整内容

因此可知第一个参数是make_repeat使用的,第二个参数再传递给匿名函数。 这样的用法也是第一次看到。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-27 11:32:48 | 显示全部楼层    本楼为最佳答案   
  1. idle中键入
  2. make_repeat
  3. 显示<function make_repeat at 0x000000000379FB70>,说明是个函数。
  4. 键入 make_repeat('FishC')
  5. 显示<function make_repeat.<locals>.<lambda> at 0x00000000037BF0D0>则又是对匿名函数的调用
  6. 键入make_repeat('FishC')(2)
  7. 显示最终结果:'FishCFishC'
复制代码


因此可知第一个参数是make_repeat使用的,第二个参数再传递给匿名函数。
这样的用法也是第一次看到。

评分

参与人数 2荣誉 +3 鱼币 +7 收起 理由
birlyjer + 2
~风介~ + 3 + 5 支持楼主!不错嘛!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-11-27 11:37:19 | 显示全部楼层
print(double(8))  8传给s 了???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-27 17:46:19 | 显示全部楼层
楼主,是要穿两个参数进去,一个给s,另一个给n吧~
If so!

  1. def make_repeat(s,n):
  2.         return lambda s : s * n

  3. print(make_repeat(8,2))
  4. print(make_repeat('FishC',2))

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-27 18:10:17 | 显示全部楼层
本帖最后由 冬雪雪冬 于 2015-11-27 18:12 编辑

此函数相当于这样调用:

  1. make_repeat(n)(s)
复制代码


比如:
  1. print(make_repeat('FishC')(2))'
复制代码

则显示:FishCFishC

评分

参与人数 1荣誉 +3 鱼币 +5 收起 理由
~风介~ + 3 + 5 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-27 21:05:00 | 显示全部楼层
冬雪雪冬 发表于 2015-11-27 18:10
此函数相当于这样调用:
  1. def make_repeat(n):
  2.         return lambda s : s * n

  3. double1 = make_repeat(2)
  4. print(double1(8))
  5. print(double1('FishC'))
复制代码

---
  1. >>>
  2. 16
  3. FishCFishC
  4. >>>
复制代码


还真行!不过参数传递的顺序有什么规则吗?比如说为什么是把2传给n而不是s呢?

评分

参与人数 1鱼币 +2 收起 理由
birlyjer + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-11-30 14:12:05 | 显示全部楼层
@~风介~,@冬雪雪冬
感谢两位的回复:能不能这样理解:
double = make_repeat(2) 所以double = 2s;print(double(8))就是8传到s里就是2*8,print(double('FishC'))同理

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-8 00:11:25 | 显示全部楼层
这是python中闭包的使用啊。不过结合lambda表达式时,用的很巧妙。

def make_repeat(n):
        def func(s):
               return s*n
        return  func

这样下面的东东就好理解了:
double = make_repeat(2)
其实double是 func  此时func里面的内容是 return 2*s
所以这两句;print(double1(8))
print(double1('FishC'))
相当于
print(2*8)
print(2*"FishC")
所以输出结果为:
16
FishCFishC
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-8 12:13:39 | 显示全部楼层
学习了,:ton:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-7 13:43:44 | 显示全部楼层
还能这样用,学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-26 10:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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