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

看到用了 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级讲师

répondre à tous(4)
巴扎黑

Le sujet estime qu'il est compréhensible que la sémantique ne soit pas claire. Après tout, else dans d'autres langues ne va qu'avec if, sans compter que else ici n'est pas conforme à la sémantique naturelle.

En sémantique naturelle, else signifie "autre", mais pour, while, essayez de taper else, il est déraisonnable d'utiliser "sauf dans les circonstances considérées par le programme ci-dessus" pour expliquer cette clause. Je pense qu'il est plus correct de le comprendre comme "la situation après la fin normale du bloc principal" - le soi-disant bloc principal est le corps de la boucle ou la clause try attachée à else, ce qu'on appelle normal signifie que le flux de contrôle n'est pas ; interrompu par des moyens particuliers (exceptions ou boucles).

Il est peut-être plus clair de le comprendre de cette façon.

伊谢尔伦

J'aime cet exemple :

n = 17
for d in range(2,n):
    if n % d == 0:
        print(n, '是合数')
        break
else:
    print(n, '是素数')

S'il n'y a rien d'autre, nous devrions ajouter une variable booléenne et un if/else après la boucle for. C'est beaucoup plus simple à utiliser for/else. Vous vous y habituerez petit à petit ;-)

刘奇

Il n’y a aucune ambiguïté, vous n’y êtes tout simplement pas habitué.

PHPzhong

Fluent Python的作者认为是会增加的,他这样说到:Je pense que else est un très mauvais choix pour le mot-clé dans tous les cas, sauf if. Cela implique une alternative d'exclusion, comme « Exécutez cette boucle, sinon faites cela », mais la sémantique de else dans les boucles est l'opposé : « Exécutez cette boucle, puis faites cela ». Cela suggère alors un meilleur mot-clé – qui aurait également du sens dans le contexte try : « Essayez ceci, puis faites cela ». Cependant, l'ajout d'un nouveau mot-clé constitue un changement radical dans la langue, et Guido l'évite comme la peste.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal