吐槽一下python的行内 if 表达式

2013-04-04 11:10:43 +08:00
 love
感觉二个分支结果的重要性是不对等的,比如

port = 8080 if settings.DEBUG else 80

8080靠=符,视觉上是正常的情况,而80在最后,似乎是非正常情况,但很多时候二个分支是平等的。
11766 次点击
所在节点    Python
23 条回复
Js
2013-04-04 12:15:33 +08:00
port = [80, 8080][settings.DEBUG]
这样就对等了.....
binux
2013-04-04 12:19:01 +08:00
port = settings.DEBUG ? 8080 : 80
你就开心了?
TankyWoo
2013-04-04 13:15:09 +08:00
要想80感觉正常,8080感觉非正常,就
port = 80 if not settings.DEBUG else 8080
reorx
2013-04-04 13:41:31 +08:00
有个一般不用的做法,不过可能楼主会喜欢: port = settings.DEBUG and 8080 or 80

注意 and 后面的值的布尔值不能为 False,否则它的结果就和 ? : 不完全一样了。
archsocks
2013-04-04 18:15:28 +08:00
@TankyWoo 要反写条件感觉不爽,且要多打一个not

实在想不通python把其中一个值放到条件之前是出于什么目的啊!人为地制造不平等。

我觉得这样就很好:
port = if (settings.DEBUG) 8080 else 80
GTim
2013-04-04 18:18:52 +08:00
@Js 这个方法不错
Hualin
2013-04-04 19:11:27 +08:00
英语国家的人就是那么说话的,你看到的数学书证明部分 if else 也是布置的。正经事不干瞎操心啥 =.=
wenbinwu
2013-04-04 19:51:41 +08:00
settings.DEBUG and 8080 or 80
jimrok
2013-04-05 22:16:15 +08:00
ruby port = if settings.DEBUG
8080
else
80
end
Parallel
2013-04-05 22:21:20 +08:00
我想吐槽一下那个列表推导式,就是那个轻量级的循环。。全部挤在一行,个人觉得一点也不美观。。
reusFork
2013-04-05 22:34:43 +08:00
@Parallel 可以写成几行的
rephaslife
2013-04-05 22:40:57 +08:00
反正我觉得挺正常的,Python目的是“像写英语一样写代码”。

@Parallel 其实这样挺好的,简洁,就是必须在[]里使用有些蛋疼。。比如下面的代码就会出错:
{a for a in list: a}
就算这样也会报错:
{a for a in list}
Parallel
2013-04-06 10:43:23 +08:00
@reusFork 你是说在[]里写成几行那样?
@rephaslife 我觉得在里面写可读性不强,就比如《可爱的python》里那个计算闰年的程序result2 = [ p for p in range(2, N) if 0 not in [ p% d for d in range(2, int(sqrt(p))+1)] ]。
reusFork
2013-04-06 11:13:51 +08:00
@Parallel 是的,像这样
Parallel
2013-04-06 12:11:01 +08:00
@reusFork 这样也行吗,学习了~
hexor
2013-04-06 12:31:00 +08:00
条件语句请不要写成一行啊... 混蛋
swulling
2013-04-06 12:33:39 +08:00
@archsocks port = 80 if settings.DISABLE_DEBUG else 8080

条件哪有正写反写之分。。
swulling
2013-04-06 12:37:45 +08:00
@Parallel 实际用起来超好用的,如果你非常讨厌这种写法,会变的有点丑。
result2 = [ p for p in range(2, N) if 0 not in [ p% d for d in range(2, int(sqrt(p))+1)] ]

---
result2 = []
for p in range(2,N):
____tmp = []
____for d in range(2,int(sqrt(p))+1)):
________tmp.append(p%d)
____if 0 not in tmp:
________result2.append(p)
holsety
2013-04-06 12:46:44 +08:00
还有一种写法是:

port = settings.DEBUG and 8080 or 80

当然,8080不能为False,None等非True值,要不然上面这个不成立.
Parallel
2013-04-06 12:51:42 +08:00
@swulling 事实上只需要这样就可以了:
result1 = []
for num in range(2, N):
__for snu in range(2, int(sqrt(num))+1):
____if num % snu == 0:
______break
__else:
____result1.append(num)
可能是我不大习惯那样子吧,也许以后习惯了就好。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/64909

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX