better way than using if-else statement in python
Possible Duplicate:
Putting a simple if-then statement on one line
我正在处理一个python表达式,我希望该表达式比使用if else语句被压缩。
1 2 3 4 5
| s = [1, 2, 3, 4]
if len(s)>5:
print s.index(5)
else:
print 'cant print' |
有没有比使用if else语句更好的方法?
- 似乎有一个普遍的共识,即如果/否则的声明是最好的方式写它。
- 我只是在猜测,但看起来操作的目的是为了避免if/elif/case/switch的丑陋。哪一个最终的解决方案是基于类的解决方案,案例选择是通过多态性完成的。这会导致代码更加简洁。
- 在最新的编辑之后,似乎OP只想做范围检查…?
- 是的,实际上,如果该索引存在,那么只有我想找到该索引的元素
- 哈哈-所有的头痛都是白费力气;-)你从一开始就应该这么说。
- @唐:对不起,我试着用更简单的方式问。
你可以做到:
1 2
| s = [1, 2, 3, 4]
print 'y' if len(s) > 5 else 'n' |
然而,我认为这并不能使代码更可读(一目了然)。还请注意,if和else不创建循环,它们只是控制流的语句。循环是使用for和while编写的。
- 同意,这满足了OPS的要求,但不会产生更可读的代码。+1(不情愿地因为混淆)
- 您将如何在python 3中编写print语句?
简短,但非常模糊(不要这样做):
[编辑]您永远不应该这样做的原因是,它使用大多数人不知道的语言属性,即bool是int的一个子类。在大多数情况下,如果您发现自己编写了类似op的代码,通常最好创建一个标志变量
然后,您可以使用任何更合适的方法来书写打印,例如:
1
| print 'y' if s_is_long else 'n' |
或
1
| print {True: 'y', False: 'n'}[s_is_long] |
或者是最易读的…
1 2 3 4
| if s_is_long:
print 'y'
else:
print 'n' |
- 这是怎么回事?编制索引时,python是否将布尔值转换为整数?
- 虽然在技术上是正确的,但在我看来,这是一个糟糕的答案。对许多人来说,乍一看是很难理解的。考虑到这个问题的答案通常会被语言新手和/或编程新手阅读,我不认为建议这样的结构是一个好主意。
- python bools是int(在isinstance的意义上——bool是int的一个子类)。
- @列文:你甚至不需要int();True == 1。
- @布莱恩注意到我明确地说了"不要这样做",所以我不会称之为建议。
- 我真的很想推翻这个观点,因为知道这有点酷,但它确实很模糊(正如海报自己所指出的)和容易出错的代码,因此不会。一些阅读这篇文章的人可能最不适合使用它。
- @约旦:啊,好吧,布尔值是Python中的整数。那就有道理了。
- @乔恩:虽然"不要这样做"比什么都不做要好,但如果你花更多的精力解释为什么别人不应该这样做,你的回答会更好。记住:观众大多是不知道为什么这是个坏主意的人。这是你教育他们的机会。
- @布赖恩奥克利,我已经扩展了我的答案…
- @谢谢你抽出时间来做这件事。这是一个更好的答案。
在这种情况下,可以使用try/except块:
1 2 3 4
| try:
print s.index(5)
except ValueError:
print"5 not in list" |
- 我不想进去,除了
- 请问为什么?这是一个"Python"WY使用它!不要请求许可,而是请求宽恕!"-您的if子句请求许可,然后执行它要求的操作。尝试阶段只做它,如果失败,它处理原谅部分。
- 根据OP对这个问题本身的评论,他似乎实际上是指s[5],这将使其成为一个索引错误。但我同意,这显然是用Python式的方式检查拼写范围。
简明扼要:
1 2 3
| s = [1, 2, 3, 4]
output = {True: 'y',False: 'n'}
print output[len(s) > 5] |
- 不反对您的解决方案,但我认为在考虑可读性时,OP的原始代码是"简洁明了"的。
- 你是对的,但我决定把它作为避免其他情况的"正确方法"张贴出来,而不是指望一些无证的隐式演员,随着时间的推移可能会改变。
- Zenopy的解决方案简短、清晰且不失优雅;-)
- @Zenpoy这是一个很好的理由(当然,它比公认的聪明和酷更清晰,但模糊的代码依赖于真/假的值)
- @Zenpoy虽然bool是一个int的事实可能不太清楚,但它既不是一个隐式的演员表(它是一个子类型),也不是未记录的(参见整个pep 285的基本原理:python.org/dev/pep s/pep-0285)。但是,是的,它肯定是模糊的:—)
- @很高兴知道这件事!谢谢你的链接…
另一个变化:
1
| print len(s)>5 and 'y' or 'n' |
只是为了完成添加。别在家里试这个!;-)
- 我会给你点考古价值的分数,但否则,这种可怕的东西就是为什么我们会在语言中表达出来。
- @jorn等等,有没有没有if表达式的python版本?
- @在2.5中引入了marcin if表达式,在此之前我们只有if语句:—)