Niyə python "lo" da və loops zamanı "başqa" istifadə edir?

Bu quruluşun necə işlədiyini başa düşürəm:

02 апр. Şəhər Boogaart tərəfindən təyin 02 Aprel. 2012-04-02 19:18 '12 saat 19:18 'da 2012-04-02 19:18
@ 1 cavab

Bu təcrübəli Python proqramçıları üçün belə qəribə bir quruluşdur. Döngülerle birlikdə istifadə edildikdə, bu, əsasən, "təkrarlanan elementdə bir element tapmaq, əksinə, heç bir şey tapılmadıqda ..." deməkdir. Həmçinin:

 found_obj = None for obj in objects: if obj.key == search_key: found_obj = obj break else: print('No object found.') 

Ancaq bu quruluşu gördüyünüz zaman, ən yaxşı alternativ, funksiyanı birləşdirməkdir:

 def find_obj(search_key): for obj in objects: if obj.key == search_key: return obj 

Və ya siyahı anlayışını istifadə edin:

 matching_objs = [o for o in objects if o.key == search_key] if matching_objs: print('Found {}'.format(matching_objs[0])) else: print('No object found.') 

Bu semantik olaraq digər iki versiyaya bərabər deyil, lakin bütün siyahıdan sıralanma olub olmadığını nəzərə almamaqla, qeyri-kritik kodda olduqca yaxşı işləyir. Digərləri razı ola bilərlər, amma mən şəxsən istehsal kodunda-else və ya while-else blokları üçün istifadə etməyəcəyəm.

Daha ətraflı məlumat üçün [Python-fikirlər] Xülasə də baxın

183
02 апр. Björn Lindqvist tərəfindən verilmiş cavab 02 Apr 2012-04-02 19:30 '12 saat 19:30 'da 2012-04-02 19:30

Ümumi bir dizayn, bir şey tapılıncaya qədər bir döngə başlamaq və döngədən çıxmaqdır. Məsələ ondan ibarətdir ki, loop və ya loop loop həyata çıxmaq, mən baş verdiyini müəyyən etmək lazımdır. Bir yolu, bir bayraq yaratmaq və ya döngənin necə çıxdığını görmək üçün ikinci bir test keçirmək üçün imkan verəcək bir dəyişən saxlamaqdır.

Məsələn, siyahıdan axtarış etmək və hər bir maddənin bayraq maddələri tapılıncaya qədər işləməliyik və daha sonra işləməyim lazım olduğunu varsayalım. Bayraq elementi eksiksə, bir istisna yaradılmalıdır.

Python istifadə edərək ... else quruluşa sahibsiniz

 for i in mylist: if i == theflag: break process(i) else: raise ValueError("List argument missing terminal flag.") 
border=0

Bunu bu sintaktik şəkərdən istifadə etməyən bir üsulla müqayisə edin:

 flagfound = False for i in mylist: if i == theflag: flagfound = True break process(i) if not flagfound: raise ValueError("List argument missing terminal flag.") 

Birinci halda, raise onunla işləyən forma ilə sıx bağlıdır. İkinci halda, bağlama çox güclü deyil və saxlama zamanı səhvlər tətbiq oluna bilər.

367
02 апр. Lance Helsten tərəfindən verilmiş cavab 02 Apr 2012-04-02 20:13 '12 at 8:13 pm 2012-04-02 20:13

Raymond Hetinqerin qüsursuz təqdimatı , gözəl idiomik Python-a çevrilmişdir , burada o, for ... else tikintisi for ... else hekayəni qısaca təsvir edir. Müvafiq bölmə "15: 50- dən başlayaraq təxminən üç dəqiqə davam edən bir dövründə bir neçə çıxış nöqtəsini ayırmaqdır". İşdə əsas məqamlar:

  • Bunun for ... else GOTO'nun bəzi istifadəçiləri üçün əvəz olaraq Donald Knut tərəfindən hazırlanmışdır;
  • else sözlə təkrar istifadə etmədi, çünki "Knut istifadə etdilər və insanlar bunu bilirdi ki, həmin dövrdə hər kəs [ifadələr for ] və GOTO qurmuşdular və else GOTO ";
  • Geri baxarkən, "bir ara vermədən" (və ya bəlkə də "nobect") adlandırılmalıdır və sonra bu səhv olmaz. *

Belə ki, əgər sual: "Niyə bu sözü dəyişmirlər?" Cat Plus Plus yəqin ki, ən doğru cavabı verdi - mövcud kodun praktik olması üçün hazırda çox dağıdıcı olardı. Ancaq həqiqətən xahiş etdiyimiz sualın ilk növbədə niyə istifadə edildiyinə baxmayaraq, əlbəttə ki, bu zaman yaxşı bir fikir kimi görünürdü.

Şəxsən, xəttin # no break şərh edən kompromisə bənzəyirəm ki, else bir nöqtədə bir loopa aid olduğu kimi yanlış ola bilər. Bu olduqca başa düşüləndir və qısadır. Bu seçim , Bjornun cavabının sonunda bağladığı xülasədə qısa bir söz verir:

Tamlığı üçün, sintaksis dəyişikliyi ilə bu sözdizimə ehtiyacı olan proqramçılar hazırda ola bilər:

 for item in sequence: process(item) else: # no break suite 

Videonun bu hissəsindən alınan bonus quote: "Lambda funksiyasını çağırdığımız kimi heç kim:" Lambda nə edir? ""

117
20 мая '14 в 1:30 2014-05-20 01:30 cavab 20 may 2014-cü il saat 14: 00-da Hava ilə verilmişdir 2014-05-20 01:30

Çünki dil üçün yeni bir söz açmaq istəmirdilər. Hər biri bir identifikatoru oğurlayır və geri uyğunluq problemlərinə səbəb olur, buna görə də adətən son çarədir.

28
02 апр. Cavab Cat Plus Plus 02 Apr tərəfindən verilir. 2012-04-02 19:20 '12 at 19:20 2012-04-02 19:20

Mən / else üçün nə etdiyimi "asanlıqla" tapdım və daha da vacib olaraq, onu istifadə edərkən, fasilə bəyanatının olduğu yerə diqqət etmək idi. For / else konstruksiyası bir blokdur. Bu boşluq blokdan çıxır və buna görə də başqa bənddən atılır. Əgər bir başqa bəndin məzmunu bənddə nəzərdə tutulursa, heç vaxt atlanmayacaq və buna görə bərabər bir mantığa qoyulmaqla təmin edilməlidir. Bu əvvəllər dedilər, ancaq bu sözlərlə deyil, başqasına kömək edə bilər. Aşağıdakı kod parçasını işləməyə cəhd edin. Mən açıqca aydınlıq üçün "bir ara vermədən" şərhini səmimiyyətlə dəstəkləyirəm.

 for a in range(3): print(a) if a==4: # change value to force break or not break else: #no break +10 for whoever thought of this decoration print('for completed OK') print('statement after for loop') 
13
05 февр. Cavab verilir Neil_UK 05 fevral. 2015-02-05 15:54 '15 'da 15:54' de 2015-02-05 15:54

Kimi bir şey oxudum:

Döngəni başlamağa hələ də şərait varsa, başqa bir şey edin.

12
02 апр. cavab pcalcao verilir 02 Apr 2012-04-02 19:20 '12 at 19:20 2012-04-02 19:20

Hesab edirəm ki, sənədlər böyük bir izahat verir, davam edir

[...] döngünün siyahısı tükənməsindən və ya vəziyyətin yalançı olduğundan (halbuki ilə) bağlı olduqda, lakin loop bir break ifadəsi ilə sona çatdıqda deyil, icra edilir. ""

Mənbə: Python 2 Sənədlər: Flow Management Guide

10
13 мая '14 в 11:28 2014-05-13 11:28 cavab 13 may 2014-cü il saat 11 : 33-da Ayan tərəfindən verilir

Sadələşdirmək üçün bu kimi düşünə bilərsiniz;

  • Bir forma loopunda bir break əmri qarşılansa, else hissəsi çağrılmayacaqdır.
  • Bu for loop for break uyğun deyilsə, else hissəsi çağırılacaq.

Başqa sözlə, əgər loop üçün yineleme ara ilə "kəsilməmişdirsə", else hissəsi çağırılacaq.

Bu qədər sadədir.

7
27 окт. Cavab 27 oktyabr 2013-cü il tarixində Ad Infinitum tərəfindən verilir . 2017-10-27 14:03 '17 saat 02:03 'da 2017-10-27 14:03

Texniki hissə əsasən razı olduğundan, mənim şərhim yalnız bu reworked açar sözlərin çıxarılmasının qarışıqlığı ilə bağlıdır.

Python olmağınız çox yaxşı bir proqramlaşdırma dilidir, söz-söhbət daha yaxşı bilinir. else sözlə, qərar ağacının axınının bir hissəsini mükəmməl şəkildə təsvir edir: "Əgər bunu edə bilmirsinizsə (başqa) bunu et." Bu, öz dilimizdə nəzərdə tutulur.

Bunun əvəzinə, bu sözü while və operatorlarla istifadə edərək qarışıqlıq yaradır. Bunun səbəbi bizim proqramlaşdırma karyeramızın else operatorun qərar ağacında olduğunu öyrəndikləri; onun mantıksal domenini , qələmini, şərti olaraq növbəti yolunu qaytarır. Bu arada, dövr təlimatları bir şeyə nail olmaq üçün məcazi aydın bir məqsədi var. Məqsədi prosesin davamlı təkrarlanmasından sonra əldə edilir.

if / else növbəti yol göstərir. Döngüler "qol" tamamlanana qədər yola davam edir.

Problem else bir else ki, dövlətdə son parametr müəyyənləşdirilir. söz semantikləri Python və Human >

Sonda, söz Python'da qalacaq. Aydındır ki, bu, hər bir proqramçı bir növ mnemonic cihaz kimi istifadə başa düşmək üçün bir hekayə icad etməyə cəhd zaman aydındır. Sözsüz sözünü seçsələr, mən bunu sevirəm. Hesab edirəm ki, bu açar söz bu təkrarlanan axın, dövründən sonra qazanmaq üçün idealdır.

Bu, bir oyuncaq yığmağın hər bir addımından sonra bir uşaq olduğunda vəziyyətə bənzəyir: Və sonra , baba nədir?

6
12 янв. 3rdWorldCitizen tərəfindən verilmiş cavab yanvar 12 2016-01-12 21:12 '16 'da 21:12' də 2016-01-12 21:12 'də

Mən oxudum ki, " iterable tükəndi zaman və həyata keçirilməsi başa çatdıqdan sonra növbəti bəyanat getmək üçün, başqa bəndin icra olunacaq." Beləliklə, iterativ bir break , bu icra edilməyəcəkdir.

5
07 июля '14 в 7:32 2014-07-07 07:32 Cavab 0xc0de 07 İyul 07:14 'də verilir 7:32 2014-07-07 07:32

Digər forma bloğundaki kodlar for loop pozulmadıqda yerinə yetirilir.

 for x in xrange(1,5): if x == 5: print 'find 5' break else: print 'can not find 5!' #can not find 5! 

Sənədlərdən: fasilə və davam Davranış, eləcə də Loops üzrə cədvəllər

Döngə operatorları başqa şərt ola bilər; döngə siyahısı tükənməsiylə bitdikdə və ya şərait yalanaşdıqda (bir şou ilə) bitdikdə, lakin dövrü bir break ifadəsi ilə bitdikdə yerinə yetirilir. Bu, prinsipləri araşdıran aşağıdakı dövrü əks etdirir:

 >>> for n in range(2, 10): ... for x in range(2, n): ... if n % x == 0: ... print(n, 'equals', x, '*', n//x) ... break ... else: ... # loop fell through without finding a factor ... print(n, 'is a prime number') ... 2 is a prime number 3 is a prime number 4 equals 2 * 2 5 is a prime number 6 equals 2 * 3 7 is a prime number 8 equals 2 * 4 9 equals 3 * 3 

(Bəli, bu düzgün koddur. Diqqətlə baxın: başqa bənddə for ifadəsi deyil, if deyimi deyil.)

Bir döngə ilə istifadə edildikdə, else bənddə if ifadələrindən başqa bənddə başqa ifadələr ilə də əlaqədardır: if istək ifadəsi bəyanatı bəndində bir istisna meydana gəlmədikdə yerinə yetirilir və başqa bir loop bəndində bir ara meydana gəlmədikdə icra edilir. İcra və istisnalar haqqında daha ətraflı məlumat üçün, İstisna Tətbiqinə baxın.

Davamlı açıqlama, həmçinin C-dən borclanılan, növbəti dövrünü davam etdirir:

 >>> for num in range(2, 10): ... if num % 2 == 0: ... print("Found an even number", num) ... continue ... print("Found a number", num) Found an even number 2 Found a number 3 Found an even number 4 Found a number 5 Found an even number 6 Found a number 7 Found an even number 8 Found a number 9 
3
26 авг. Cavab GoingMyWay 26 avqustda verilir . 2016-08-26 07:42 '16 saat 07:42 'də 2016-08-26 07:42

else söz burada yanıltıcı ola bilər və bir çox adamın qeyd etdiyinə görə, nobreak , notbreak daha uyğun olur.

for ... else ... məntiqi başa düşmək for ... else ... try...except...else , try...except...else if...else... ən çox python programcıları aşağıdakı kodla tanış olur:

 try: do_something() except: print("Error happened.") # The try block threw an exception else: print("Everything is find.") # The try block does things just find. 

Eynilə, xüsusi bir Exception növü olaraq break düşünün:

 for x in iterable: do_something(x) except break: pass # Implied by Python loop semantics else: print('no break encountered') # No break statement was encountered 

python fərqi except break və onu yaza bilmirsiniz, belə olur:

 for x in iterable: do_something(x) else: print('no break encountered') # No break statement was encountered 

Bəli, bilirəm ki, bu müqayisə çətin və yorucu ola bilər, amma bu qarışıqlığı aydınlaşdırır.

3
27 апр. cizixs tərəfindən verilmiş cavab 27 aprel 2017-04-27 06:36 '17 'də 6:36' da 2017-04-27 06:36

Mən razıyam, elif deyil [pozulma şərtləri].

Mən bilirəm ki, bu köhnə bir axındır, amma indi eyni məsələni nəzərdən keçirirəm və əminəm ki, kiminsə bu sualları anladığım üçün cavablandırdı.

Mənim üçün, else üçün "oxumaq" üçün üç yol var For... else və ya While... else , hamısı bərabərdir:

  • else == if the loop completes normally (without a break or error)
  • else == if the loop does not encounter a break
  • else == else not (condition raising break) (ehtimal ki, belə bir vəziyyət var və ya bir dövrü olmaz)

Beləliklə, bir döngədə "başqa" həqiqətən "elif" dir, burada "..." (1) heç bir boşluq yoxdur, bu da (2) QEYD [boşluq artırma şərtləri].

Hesab edirəm ki, əsas else ki, "ara vermədən" mənasızdır, buna görə də for...else bir for...else daxildir:

 for: do stuff conditional break # implied by else else not break: do more stuff 

Beləliklə, for...else loop for...else əsas elementlər aşağıdakılardır və onları daha aydın İngilis dilində oxuyursunuz:

 for: do stuff condition: break else: # read as "else not break" or "else not condition" do more stuff 

Digər plakatlar söyləyirdilər ki, dövrünün aradığını tapa bilərsiniz, məsələn, boşluq adətən yüksəlir else: "hədəf obyekti olmadıqda nə etmək lazımdır".

Misal

Siz istisna işləmə, fasilələr və bütün dövrlər üçün də istifadə edə bilərsiniz.

 for x in range(0,3): print("x: {}".format(x)) if x == 2: try: raise AssertionError("ASSERTION ERROR: x is {}".format(x)) except: print(AssertionError("ASSERTION ERROR: x is {}".format(x))) break else: print("X loop complete without error") 

Nəticə

 x: 0 x: 1 x: 2 ASSERTION ERROR: x is 2 ---------- # loop not completed (hit break), so else didn't run 

Misal

Tətil breaku ilə sadə bir nümunə.

 for y in range(0,3): print("y: {}".format(y)) if y == 2: # will be executed print("BREAK: y is {}\n----------".format(y)) break else: # not executed because break is hit print("y_loop completed without break----------\n") 

Nəticə

 y: 0 y: 1 y: 2 BREAK: y is 2 ---------- # loop not completed (hit break), so else didn't run 

Misal

Sadə bir nümunə, boşluq olmadığında, boşluğu qaldıran heç bir şərt yoxdur və heç bir səhv baş vermir.

 for z in range(0,3): print("z: {}".format(z)) if z == 4: # will not be executed print("BREAK: z is {}\n".format(y)) break if z == 4: # will not be executed raise AssertionError("ASSERTION ERROR: x is {}".format(x)) else: print("z_loop complete without break or error\n----------\n") 

Nəticə

 z: 0 z: 1 z: 2 z_loop complete without break or error ---------- 
3
06 янв. Cavab NotAnAmbiTurner Jan 06 tərəfindən verilir 2016-01-06 20:40 '16 saat 20:40 'da 2016-01-06 20:40

Bununla əlaqədar düşünürsünüz, else materialın qalan hissəsində və ya dövründə yerinə yetirilməmiş digər materialda.

2
02 апр. cavab cavylak tərəfindən verilir 02 Apr 2012-04-02 19:25 '12 at 7:25 pm 2012-04-02 19:25

Axtarışda yanaşı başqa bir iddiasız istifadə vəziyyətdir. Məsələn, məsələn, uzaq bir serverdakı bir portun açılması, eləcə də bir qədər gözləmə müddəti gözləmək istəmisiniz. Daha sonra belə while...else inşa while...else istifadə edə bilərsiniz:

 import socket import time sock = socket.socket() timeout = time.time() + 15 while time.time() < timeout: if sock.connect_ex(('127.0.0.1', 80)) is 0: print('Port is open now!') break print('Still waiting...') else: raise TimeoutError() 
1
02 марта '18 в 17:48 2018-03-02 17:48 Cavab Sudicode tərəfindən martın 02-dən 18-dək 17:48 2018-03-02 17:48 tarixində verilir

Gəlin bir funksiyaya sahibik

 def broken(x) : return False if x==5 else True 

Bu, yalnız 5-i pozulmadığı anlamına gəlir. İndi bir qəza vəziyyətində, 5-dən heç bir zaman qiymətləndirilmir: -

 for x in range(4): if not broken(x) : break else: print("Everything broken... doom is upon us") 

Xülasə verəcəkdir: -

 Everything broken... doom is upon us 

Harada sınıq 5-dən təxmin edilir: -

 for x in range(6): if not broken(x) : break else: print("Everything broken... doom is upon us") 

Bir şey yazmayacaq. Beləliklə, bilavasitə olaraq, ən az bir şey pozulmayan bir şey var.

Ancaq siz tapdığınız bir şeyi aldatmaq və atmaq istəsəniz, qırıldı. Yəni 5 dövrünü kəsdiyiniz kimi tapsanız da, dövrü davam etdirin, else ifadəsi hələ də çap olunacaq. Yəni: -

 for x in range(6): if not broken(x) : continue else: print("Everything broken... doom is upon us") 

Çap edəcək

 Everything broken... doom is upon us 

Ümid edirəm ki, bu, qarışıqlıqları aradan qaldıracaq, lakin yeni bir şey yarada bilməz :-)

0
23 марта '18 в 13:54 2018-03-23 13:54 cavab satyakam shashwat verilir 23 mart, '18 saat 13:54 'da 2018-03-23 ​​13:54

Burada düşünmək üçün bir yoldur, mən yuxarıda göstərilən hər kəsin görmədim:

Birincisi, loops üçün döngələr isə ətrafında sintaktik şəkərdir. Məsələn, dövrü

 for item in sequence: do_something(item) 

(təxminən) yenidən yaza bilərsiniz

 item = None while sequence.hasnext(): item = sequence.next() do_something(item) 

İkincisi, döngələr yalnız bloklar olduqda təkrar edərkən unutmayın! Həmişə bir müddət loop oxumaq bilər "bu şərait doğru, orqanı həyata keçir, sonra geri və yenidən yoxlamaq."

Beləliklə, / başqa mənada isə: bu / else, eyni vəziyyətdə bir dəfə yoxlanılması yerinə vəziyyətin yalan olduğunu göstərən loop funksionallığı ilə bərabər eyni quruluşdur.

Və sonra da / başqa üçün də əhəmiyyətlidir: hər şey loops üçün döngələr zamanı yalnız sintaktik şəkər olduğundan, yalnız loop əsası olan örtülü vəziyyətin nə olduğunu anlamaq lazımdır və sonra qalan dövlət yalançı olduğuna uyğun gəlir.

0
11 дек. Cavab Aaron Gable tərəfindən 11 dekabrda verilir. 2018-12-11 20:52 '18 saat 20:52 2018-12-11 20:52

Mən yenə də özümə bunu başa düşməyə çalışırdım. Aşağıdakı köməkləri tapdım!

• Bir döngənin içərisində (və ya olmayan) birləşmə ilə əlaqədar olaraq düşünün - əgər şərt yerinə yetirilirsə, döngəni pozun, əksinə bunu yapın - əgər else çoxluğa birləşdirilirsə, s!
• Əgər olmasaydı, razı if , else .
• Bir neçə dəfə həqiqətən də hesab edilə bilər, if - elif ilə!

0
11 дек. Germaine Goh tərəfindən verilmiş cavab 11 dekabr. 2018-12-11 18:06 '18 at 18:06 2018-12-11 18:06
 for i in range(3): print(i) if i == 2: print("Too big - I'm giving up!") break; else: print("Completed successfully") 

qalanları insanely sadə, yalnız deməkdir

1, "əgər for clause tamamlandığı"

 for i in range(3): print(i) if i == 2: print("Too big - I'm giving up!") break; if "for clause is completed": print("Completed successfully") 

O, uzun müddətli operatorları "cəza tamamlandı" kimi yazdıqları üçün "daha çox" təqdim edirlər.

Burada təbiətə görə else var.

2, buna baxmayaraq for clause is not run at all haqqında nə for clause is not run at all

 In [331]: for i in range(0): ...: print(i) ...: ...: if i == 9: ...: print("Too big - I'm giving up!") ...: break ...: else: ...: print("Completed successfully") ...: Completed successfully 

Yəni tamamilə məntiqi birləşmə bəyanatı:

 if "for clause is completed" or "not run at all": do else stuff 

ya da belə deyir:

 if "for clause is not partially run": do else stuff 

və ya belə:

 if "for clause not encounter a break": do else stuff 
0
25 авг. JawSaw tərəfindən verilmiş cavab Aug 25 2018-08-25 07:29 '18 saat 07:29 'də 2018-08-25 07:29

etiketləri ilə bağlı digər suallar və ya bir sual verin