鱼C论坛

 找回密码
 立即注册
查看: 1216|回复: 8

[已解决]函数和匿名函数中有点不理解,兄die 在哪里?

[复制链接]
发表于 2018-4-25 15:05:55 | 显示全部楼层 |阅读模式

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

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

x
QQ浏览器截图20180425150504.png
为什么会这样打印,看不懂
最佳答案
2018-4-25 16:38:05
这是函数内嵌套了lambda表达式,lambda表达式其实也是从函数转变过来的,但是,lambda毕竟是表达式,和函数也是不一样的。如果里面的是函数,需要用nonlocal关键字,设定变量,这样就一样了。其实这是个闭包。

转变成闭包:
  1. def make_repeat(n):
  2.     def multiply(s):
  3.         nonlocal n
  4.         return s * n
  5.     return multiply
  6. double = make_repeat(2)
  7. print(double(8))
  8. print(double('FishC'))
复制代码


你试一下,和你那个结果是一样的。你看看,这样会不会好理解呢。不理解也没事,再给你分解一下:

n * s = 2* 8 = 16  (两个整数的乘积)
n * 'FishC 2' = 2 *  'FishC 2'   (字符串可以和整数乘,然后得到他的倍数)

print(make_repeat(n = 2)(s = 8))-------这不是都给变量赋值了吗,
print(make_repeat(n = 2)(s = 'FishC'))------这不是都给变量赋值了吗,

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

使用道具 举报

发表于 2018-4-25 15:19:30 | 显示全部楼层
make_repeat(..)方法接受一个参数,这里为2。
内部内联一个lambda函数,分别传入参数8和FishC。
1.2*8=16,小学算术;2.根据Pytho字符串的乘法(str类型重载了*运算符),将会打印重复2次的字符串即FishCFishC
就是一个多态+内联函数的简单应用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-25 16:32:55 | 显示全部楼层
hi

楼主可能对 lambda表达式不太清晰,我把上面的代码按普通函数形式重写下,你再看一下 #还原的不是太好,意思差不多,建议再学习下 lambda表达式
  1. def make_repeat(n):
  2.     def tmp(s):
  3.         print(s*n)
  4.     return tmp
复制代码

>>> double = make_repeat(2)
>>> double(8)
16
>>> double('FishC')
FishCFishC
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-25 16:38:05 | 显示全部楼层    本楼为最佳答案   
这是函数内嵌套了lambda表达式,lambda表达式其实也是从函数转变过来的,但是,lambda毕竟是表达式,和函数也是不一样的。如果里面的是函数,需要用nonlocal关键字,设定变量,这样就一样了。其实这是个闭包。

转变成闭包:
  1. def make_repeat(n):
  2.     def multiply(s):
  3.         nonlocal n
  4.         return s * n
  5.     return multiply
  6. double = make_repeat(2)
  7. print(double(8))
  8. print(double('FishC'))
复制代码


你试一下,和你那个结果是一样的。你看看,这样会不会好理解呢。不理解也没事,再给你分解一下:

n * s = 2* 8 = 16  (两个整数的乘积)
n * 'FishC 2' = 2 *  'FishC 2'   (字符串可以和整数乘,然后得到他的倍数)

print(make_repeat(n = 2)(s = 8))-------这不是都给变量赋值了吗,
print(make_repeat(n = 2)(s = 'FishC'))------这不是都给变量赋值了吗,

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

使用道具 举报

 楼主| 发表于 2018-4-25 21:09:03 | 显示全部楼层
ABC23 发表于 2018-4-25 15:19
make_repeat(..)方法接受一个参数,这里为2。
内部内联一个lambda函数,分别传入参数8和FishC。
1.2*8=16 ...

谢谢兄die的回答,懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-25 21:09:43 | 显示全部楼层
thexiosi 发表于 2018-4-25 16:32
hi

楼主可能对 lambda表达式不太清晰,我把上面的代码按普通函数形式重写下,你再看一下 #还原的不是太 ...

谢谢,鱼c真的有很多乐于帮助的人 ,再次谢谢!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-25 21:10:17 | 显示全部楼层
金刚 发表于 2018-4-25 16:38
这是函数内嵌套了lambda表达式,lambda表达式其实也是从函数转变过来的,但是,lambda毕竟是表达式,和函数 ...

鱼C是个神奇的地方,这么快就有这么多人回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-25 21:26:11 | 显示全部楼层
1519189222 发表于 2018-4-25 21:09
谢谢,鱼c真的有很多乐于帮助的人 ,再次谢谢!!

没事,不用谢 :)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-25 21:41:13 | 显示全部楼层
1519189222 发表于 2018-4-25 21:10
鱼C是个神奇的地方,这么快就有这么多人回答

没事,当中我也在稳固自己的学习的内容,继续努力,坚持就行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 15:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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