鱼C论坛

 找回密码
 立即注册
查看: 1910|回复: 10

[已解决]关于【列表推导式】的疑问

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

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

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

x
在【练习21】出现了这样一条函数:
     lambda x: x if x%2 else None
后面又有一条练习是关于列表推导式的:
[x for x in range(1,100) if not(x % 3)]

为了扩展运用,我试图将else放在列表推导式里面,但是显示报错:SyntaxError: invalid syntax。
语句为:[x for x in range(1,100) if not(x % 3) else 0]

请问,这是因为else不能在[]中出现吗?还是说上述语句漏了括号之类的。
对于列表推导式的语法还是不太熟悉,希望能回答一下。

上述功能倒是琢磨了一个等价表达式出来:
for x in range(0,100):
        print([x if not(x % 3) else 0],end='')
最佳答案
2017-11-13 11:00:19
本帖最后由 SixPy 于 2017-11-13 11:02 编辑
BngThea 发表于 2017-11-13 10:26
@SixPy  这只是我的猜测,如果不对我删除就行了


x if exp else y
这里的 if else 是个 三元运算符,相当于 c语言里的
exp ? x  :  y

推导式里后面的 if ,是元素过滤语法,没必要有else,不符合条件的元素就丢掉了

if exp :

else:
这种带:冒号的,是语句
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-11-13 09:45:51 | 显示全部楼层
刚才自己又试验了一下,else应该是可以放在[]里面的。
x=6
[x if not(x % 3) else 0]
#结果为6

[x for x in range(1,100) if not(x % 3) else 0]
但是上述语句怎么样还是只用一行语句表达出来,没想明白。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-13 09:55:09 | 显示全部楼层
把if写在前面:
  1. >>> [x if not(x % 3) else 0 for x in range(1,100)]
  2. [0, 0, 3, 0, 0, 6, 0, 0, 9, 0, 0, 12, 0, 0, 15, 0, 0, 18, 0, 0, 21, 0, 0, 24, 0, 0, 27, 0, 0, 30, 0, 0, 33, 0, 0, 36, 0, 0, 39, 0, 0, 42, 0, 0, 45, 0, 0, 48, 0, 0, 51, 0, 0, 54, 0, 0, 57, 0, 0, 60, 0, 0, 63, 0, 0, 66, 0, 0, 69, 0, 0, 72, 0, 0, 75, 0, 0, 78, 0, 0, 81, 0, 0, 84, 0, 0, 87, 0, 0, 90, 0, 0, 93, 0, 0, 96, 0, 0, 99]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-13 09:55:22 | 显示全部楼层
哈哈, 自己又努力了一下,竟然弄出来了,想不到换一下位置就行了。
[x if not(x % 3) else 0 for x in range(1,100)]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-13 09:59:24 | 显示全部楼层
本帖最后由 BngThea 于 2017-11-13 10:21 编辑

请把if else放到前面
为什么else必须放在前面?我猜测因为在python中else是可以和while,for进行搭配使用的
在列表表达式中又没有缩进可以检查,如果放到后面,编译器遇到else时不知道和哪个进行匹配,所以报错

点评

虾扯蛋  发表于 2017-11-13 10:12
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-13 10:26:02 | 显示全部楼层
@SixPy  这只是我的猜测,如果不对我删除就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-13 11:00:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 SixPy 于 2017-11-13 11:02 编辑
BngThea 发表于 2017-11-13 10:26
@SixPy  这只是我的猜测,如果不对我删除就行了


x if exp else y
这里的 if else 是个 三元运算符,相当于 c语言里的
exp ? x  :  y

推导式里后面的 if ,是元素过滤语法,没必要有else,不符合条件的元素就丢掉了

if exp :

else:
这种带:冒号的,是语句
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-13 11:21:16 | 显示全部楼层
SixPy 发表于 2017-11-13 11:00
x if exp else y
这里的 if else 是个 三元运算符,相当于 c语言里的
exp ? x  :  y

我感觉我们说的不是同一件事,您仔细看了我对lz的回复了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-13 11:50:06 | 显示全部楼层
BngThea 发表于 2017-11-13 11:21
我感觉我们说的不是同一件事,您仔细看了我对lz的回复了吗

再说一次:推导式的过滤语法不能有else部分。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-13 12:50:13 | 显示全部楼层
感谢感谢,虽然还不是理解得很好,先记着。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 18:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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