鱼C论坛

 找回密码
 立即注册
查看: 2464|回复: 4

[已解决]关于python入门第21讲课后题的几个问题

[复制链接]
发表于 2017-1-25 21:02:34 | 显示全部楼层 |阅读模式
2鱼币
  1. [ i for i in range(1, 100) if not(i%3)]
复制代码

这个列表推导式看的不是很明白,请详细讲解一下

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

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

为什么两个print函数里的double后面的参数可以传给s呢?

  1. lambda x : x if x % 2 else None
复制代码

不写else部分,函数判if为false后能返回none么?
最佳答案
2017-1-25 21:02:35
第一个问题,你可以把 if not(i%3)去掉后,再观察一下可能比较好理解not(i%3)的意思,rang(1,100)指得是1-99这个数字范围,最开头的i只是语法需要,可以理解成定义一个参数i。如果去掉的话会报错,百度翻译过来就是:查询语法无效。

第二个问题,double = make_repeat(2) 这里实际上是你上课没有认真听,这样操作后,double实际上已经成为了一个函数,你可以产生打印一下。函数double(s)传递的当然是参数s,这个make_repeat()()也是同样的道理。

第三个问题, lambda  是匿名函数 而后面的 x if x%2 else None 是一个类似于三元表达式的固定语法格式,是不能 去掉else 去掉就报错了 这跟 b = x if 2>3 else y 一个道理。

最佳答案

查看完整内容

第一个问题,你可以把 if not(i%3)去掉后,再观察一下可能比较好理解not(i%3)的意思,rang(1,100)指得是1-99这个数字范围,最开头的i只是语法需要,可以理解成定义一个参数i。如果去掉的话会报错,百度翻译过来就是:查询语法无效。 第二个问题,double = make_repeat(2) 这里实际上是你上课没有认真听,这样操作后,double实际上已经成为了一个函数,你可以产生打印一下。函数double(s)传递的当然是参数s,这个make_repeat()() ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-1-25 21:02:35 | 显示全部楼层    本楼为最佳答案   
第一个问题,你可以把 if not(i%3)去掉后,再观察一下可能比较好理解not(i%3)的意思,rang(1,100)指得是1-99这个数字范围,最开头的i只是语法需要,可以理解成定义一个参数i。如果去掉的话会报错,百度翻译过来就是:查询语法无效。

第二个问题,double = make_repeat(2) 这里实际上是你上课没有认真听,这样操作后,double实际上已经成为了一个函数,你可以产生打印一下。函数double(s)传递的当然是参数s,这个make_repeat()()也是同样的道理。

第三个问题, lambda  是匿名函数 而后面的 x if x%2 else None 是一个类似于三元表达式的固定语法格式,是不能 去掉else 去掉就报错了 这跟 b = x if 2>3 else y 一个道理。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-1-25 22:03:50 | 显示全部楼层
窥基的直 发表于 2017-1-25 21:44
第一个问题,你可以把 if not(i%3)去掉后,再观察一下可能比较好理解not(i%3)的意思,rang(1,100)指得是1-9 ...

[i for i in range(1,100) if not(i%3)]逻辑上我都明白了,就是语法上还是没太搞清楚我在IDLE上尝试了
for i in range(1,100) if not(i%3)   和
i for i in range(1,100) if not(i%3)
我知道第一个明显是错的,第二个也报了语法错误,再看回[i for i in range(1,100) if not(i%3)]这个列表,不明白为什么这个列表里可以这样写,i后面直接跟for i in range(1,100) if not(i%3)的条件。列表可以这样用么?

double=make_repeat(2)
把double变成了函数这个我知道,其实我没表述清楚,我想问为什么double=make_repeat(2)之后,double这个函数的参数默认可以传给s,就像是double(s)的一样。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-1-25 22:29:15 | 显示全部楼层
pyth最求简单嘛。只要在逻辑跟语法上懂了,就没问题了,都是些固定语法跟简便方法的问题。double() 等价于 make_repeat(2)(),这样 表述的话你就应该能理解了吧 因为整个函数需要用到俩个未知变量,而第一次只给了一个变量,所以还要再给一次,因为pyth是面向对象的,也没必要去了解实现的过程。过程无非就是一大堆的代码,而那些代码实现了这么一个简便的函数方法,所以才说pyth强大。就是这么乱来还能这么逻辑还不复杂
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-1-25 22:29:54 | 显示全部楼层
satsuki 发表于 2017-1-25 22:03
逻辑上我都明白了,就是语法上还是没太搞清楚我在IDLE上尝试了
for i in range(1,100) if not(i%3)   和 ...

pyth最求简单嘛。只要在逻辑跟语法上懂了,就没问题了,都是些固定语法跟简便方法的问题。double() 等价于 make_repeat(2)(),这样 表述的话你就应该能理解了吧 因为整个函数需要用到俩个未知变量,而第一次只给了一个变量,所以还要再给一次,因为pyth是面向对象的,也没必要去了解实现的过程。过程无非就是一大堆的代码,而那些代码实现了这么一个简便的函数方法,所以才说pyth强大。就是这么乱来还能这么逻辑还不复杂
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-25 03:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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