鱼C论坛

 找回密码
 立即注册
查看: 3144|回复: 11

[已解决]关于lambda的一个问题

[复制链接]
发表于 2017-5-14 09:35:43 | 显示全部楼层 |阅读模式

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

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

x
先说点题外话,想要发个帖子还经过了些波折,上传了头像绑定了qq才行。。。
好吧,说点正事
我在看官方文档的时候看到一个例子,不太明白,求各位给指点一二
>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> pairs.sort(key=lambda pair: pair[1])
>>> pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
现在我不懂的是其中的lambda表达式里pair的值是从哪来的,什么时候哪个语句给赋值的?key这个参数能接受什么类型的数据?
谢谢
最佳答案
2017-5-14 22:36:48
zxszx4 发表于 2017-5-14 20:05
我觉得我问错了,我现在想知道的重点是key接收那种数据类型?

key接收函数,准确的说是函数名,如绝对值函数写abs,而不是abs()
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-5-14 09:58:44 From FishC Mobile | 显示全部楼层
pair值就是pair中的每一个元素。如果你是想按数字排序,应该是pair[0]。pair〔1〕是按照字母顺序排。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-14 10:14:50 | 显示全部楼层
ooxx7788 发表于 2017-5-14 09:58
pair值就是pair中的每一个元素。如果你是想按数字排序,应该是pair[0]。pair〔1〕是按照字母顺序排。

pair是pairs的每个元素这个我能看出来,但是这个pair的值时啥时候给的,为啥能取到pairs里的每个值?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-14 12:59:37 | 显示全部楼层
本帖最后由 gopythoner 于 2017-5-14 13:01 编辑
zxszx4 发表于 2017-5-14 10:14
pair是pairs的每个元素这个我能看出来,但是这个pair的值时啥时候给的,为啥能取到pairs里的每个值?


pair只是lambda函数里面定义的一个参数而已,这个参数只要给个名称就行,随便换成a,b,c,d都行,说明你还没懂lambda匿名函数的用法
这个lambda:pair:pair[1]等同于:
  1. def fuc(pair):
  2.   return pair[1]
复制代码


只是定义了一个函数而已
看对比效果,是不是一样的
  1. >>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
  2. >>> pairs.sort(key=lambda pair: pair[1])
  3. >>> pairs
  4. [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
  5. >>> def fuc(a):
  6.         return a[0]

  7. >>> pairs.sort(key=fuc)
  8. >>> pairs
  9. [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
  10. >>>
复制代码

评分

参与人数 1鱼币 +5 收起 理由
SixPy + 5 支持楼主!

查看全部评分

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

使用道具 举报

 楼主| 发表于 2017-5-14 16:20:14 | 显示全部楼层
gopythoner 发表于 2017-5-14 12:59
pair只是lambda函数里面定义的一个参数而已,这个参数只要给个名称就行,随便换成a,b,c,d都行,说明你 ...

是不是因为这个key取值的时候就默认加了pairs这个参数了,所以我不需要有单独的赋值部分,key接收的参数就是函数?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-14 16:59:04 | 显示全部楼层
本帖最后由 yongxi 于 2017-5-14 17:11 编辑

首先:
key=lambda pair: pair[1]  这里表达的意思是排序规则为 lambda pair: pair[1]  及按照每个元祖的索引值为1的元素排序 。lambda pair: pair[1]  这里表达的是一个规则!这里表达的是一个规则!这里表达的是一个规则!pair是没有赋值的。 切记 key=lambda pair: pair[1]  这只是一个排序的规则! 他不需要赋值 也没有返回值
你可以这样理解。 lambda pair: pair[1]  表达的规则为”  取得一个元素pair 然后输出元素pair[1]   ” pair是函数形参,你可以改成lambda a: a[1]  也可以是lambda b: b[1]  可以改成任何  
其次:
key 可以是一个int  也可以是一个len   这些都是具体的参数  也可以是一个规则 即lambda XXXXX


抽象的概念 修改了多次也不好用文字表达。说多了容易晕。 楼主重看视频了解形参的定义
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-14 20:05:49 | 显示全部楼层
yongxi 发表于 2017-5-14 16:59
首先:
key=lambda pair: pair[1]  这里表达的意思是排序规则为 lambda pair: pair[1]  及按照每个元祖的 ...

我觉得我问错了,我现在想知道的重点是key接收那种数据类型?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-14 22:18:00 | 显示全部楼层
zxszx4 发表于 2017-5-14 20:05
我觉得我问错了,我现在想知道的重点是key接收那种数据类型?

已经回复你了。。  可以是一个具体数字。  int  也可以是一个len  即得到具体的数字的函数   。 也可以使一个规则  即  lambda。。      如果解答你的疑问, 希望给个最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-14 22:22:16 | 显示全部楼层
yongxi 发表于 2017-5-14 22:18
已经回复你了。。  可以是一个具体数字。  int  也可以是一个len  即得到具体的数字的函数   。 也可以使 ...

你给key赋值一个int或者str的试试?我怎么是报错呀?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-14 22:36:48 | 显示全部楼层    本楼为最佳答案   
zxszx4 发表于 2017-5-14 20:05
我觉得我问错了,我现在想知道的重点是key接收那种数据类型?

key接收函数,准确的说是函数名,如绝对值函数写abs,而不是abs()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-14 22:52:24 | 显示全部楼层
本帖最后由 yongxi 于 2017-5-14 22:59 编辑
zxszx4 发表于 2017-5-14 22:22
你给key赋值一个int或者str的试试?我怎么是报错呀?


你没有明白的是:
key = XXX  是一个规则。  !!!!!!!!!!!!!!!!!!!  规则的返回值可以是 int类型。 也可是没有返回值而仅仅是一个规则~

还是那句话   抽象的概念  如果不理解, 请百度 ,  或者重复看视频
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-15 08:57:07 | 显示全部楼层
本帖最后由 走着来走去 于 2017-5-15 09:21 编辑

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-27 12:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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