Maison  >  Questions et réponses  >  le corps du texte

Python, for-else, while-else是否造成了语义歧义 ( 增加心智负担 )?

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

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

(但是 try - except -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中文网2741 Il y a quelques jours686

répondre à tous(4)je répondrai

  • 巴扎黑

    巴扎黑2017-04-18 10:30:27

    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.

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:30:27

    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 ;-)

    répondre
    0
  • 怪我咯

    怪我咯2017-04-18 10:30:27

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

    répondre
    0
  • PHPz

    PHPz2017-04-18 10:30:27

    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.

    répondre
    0
  • Annulerrépondre