Python, for-else, while-else是否造成了语义歧义 ( 增加心智负担 )?
PHP中文网
PHP中文网 2017-04-18 10:28:27
0
4
720

看到用了 for-else/while-else的代码, 往往不能马上搞懂 else 处代码的意思

因为, 脑袋不能马上反应, else 到底表示了什么样的语义( 还需要转几个弯 )

(但是 try - except -else 没有带来语义上的歧义)

相关代码

  • 能否一眼辨别出, 什么时候, 什么条件下 else处代码会执行?

for i in range(5):
...     print(i)
... else:
...     print('Iterated over everything :)')


for i in range(5):
...     if i == 2:
...         break
...     print(i)
... else:
...     print('Iterated over everything :)')


for i in []:
...     print(i)
... else:
...     print('Still iterated over everything (i.e. nothing)')



> i = 0
>>> while i <= 5:
...     i += 1
...     print i
... else:
...     print 'Yep'



for x in data:
    if meets_condition(x):
        break
else:
    # raise error or do additional processing 
PHP中文网
PHP中文网

认证0级讲师

全員に返信(4)
巴扎黑

質問者は、意味論が不明瞭であるのは当然だと信じています。結局のところ、他の言語の else は if にのみ使用できます。言うまでもなく、ここでの else は自然な意味論に準拠していません。

自然意味論では、else は「その他」の意味を持ちますが、for, while, try type else の場合、この節を説明するために「上記のプログラムで考慮される状況を除き」を使用するのは合理的ではありません。 「メインブロックが正常に終了した後の状況」と理解する方が正しいと思います。いわゆるメインブロックはループ本体またはelseに接続されたtry句であり、いわゆる正常とは制御フローが終了していないことを意味します。特別な手段(例外またはループ)による中断、ブレーク)。

このように理解するとわかりやすいかもしれません。

いいねを押す +0
伊谢尔伦

この例が好きです:

リーリー

他にない場合は、for ループの後に bool 変数と if/else を追加する必要があります。 for/else を使用する方がはるかに簡単です。徐々に慣れてくるでしょう;-)

いいねを押す +0
刘奇

曖昧さはありません、ただ慣れていないだけです。

いいねを押す +0
PHPzhong

Fluent Python の作成者によると、if を除くすべての場合において、else はキーワードとして非常に不適切な選択だと思います。これは、「このループを実行し、それ以外の場合はあれを実行する」のような除外代替を意味しますが、ループ内の else のセマンティクスは逆であり、「このループを実行してからあれを実行します」です。これは、より良いキーワードとして提案されます。これは、try コンテキストでも意味を成します。「これを試してから、あれを実行してください」。ただし、新しいキーワードの追加は言語に対する破壊的な変更であるため、Guido はそれを疫病のように避けています。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート