Fun*_*ayu 12 python if-statement try-catch
让我们举个简单的例子吧.
my_list = [
{"name": "toto", "value": 3},
{"name": "foo", "value": 42},
{"name": "bar", "value": 56}
]
def foo(name):
try:
value = next(e["value"] for e in my_list if e["name"] == name)
except StopIteration:
print "Uuuh not found."
else:
if value % 2:
print "Odd !"
else:
print "Even !"
Run Code Online (Sandbox Code Playgroud)
如您所见,上面的代码有效:
>>> foo("toto")
Odd !
>>> foo("foo")
Even !
>>> foo("kappa")
Uuuh not found.
Run Code Online (Sandbox Code Playgroud)
我只是想知道为什么我们不能在这样的elif语句中使用语句有一个特殊的原因try:
try:
value = next(e["value"] for e in my_list if e["name"] == name)
except StopIteration:
print "Uuuh not found."
elif value % 2:
print "Odd !"
else:
print "Even !"
Run Code Online (Sandbox Code Playgroud)
当然,这不起作用,因为它在try语句文档中elif定义,语句未定义.但为什么 ?是否有特殊原因(如绑定/未绑定变量)?这有什么消息来源吗?
(旁注:没有elif-statement标签?)
如果你问为什么那么这是python开发者的问题,语法在你链接的文档中明确定义.
除此之外,您尝试做的事情显然都可以在try/except中完成.如果你使用else属于try,就像你使用带有for循环的else一样,我认为只使用else而不允许它是完全elif合理的,elif的行为就像switch/case其他语言中的语句一样.
从游丝线程上的旧线程为什么没有'elif'在try/except?:
因为没有意义?
except子句用于处理异常,else子句用于处理一切正常的情况.
混合两者是没有意义的.在except子句中,没有结果可以测试; 在else子句中,有.当有异常或没有异常时,是否应该执行elif?如果它只是else子句的扩展,那么我认为它不会伤害任何东西,但它增加了语言定义的复杂性.在我生命中的这一点上,我倾向于同意爱因斯坦 - 让一切变得尽可能简单,但并不简单.最后一个地方(或者最后一个地方中的至少一个)我想要额外的复杂性是在异常处理中.
你总是需要至少一个如果使用elif,它只是无效的语法没有.唯一可能最终没有被定义的是value,你应该在try /中移动逻辑除了使用if/else:
try:
value = next(e["value"] for e in my_list if e["name"] == name)
if value % 2:
print("Odd !")
else:
print("Even !")
except StopIteration:
print("Uuuh not found.")
Run Code Online (Sandbox Code Playgroud)
如果value = next... 你的错误 print("Uuuh not found.")将被执行,如果不是你的那么你的if/else会.
您可以拥有多个elif,但必须以if开头:
if something:
...
elif something_else:
....
elif .....
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用默认值next然后使用if/elif/else,如果我们没有得到匹配的名称,则返回None所以我们检查if value is not None,如果是我们打印"Uuuh not found."或者我们得到匹配的名称,所以我们去elif/else:
value = next((e["value"] for e in my_list if e["name"] == name), None)
if value is None:
print("Uuuh not found.")
elif value % 2:
print("Odd !")
else:
print("Even !")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7327 次 |
| 最近记录: |