Python'da “continue” ifadesinin örnek kullanımı?


177

Tanımı içinde continuedeyimi geçerli:

continueDeyim döngünün bir sonraki yineleme devam eder.

Kodun iyi örneklerini bulamıyorum.

Birisi continuegerekli olan bazı basit durumlar önerebilir mi?

Yanıtlar:


218

İşte basit bir örnek:

for letter in 'Django':    
    if letter == 'D':
        continue
    print("Current Letter: " + letter)

Çıktı:

Current Letter: j
Current Letter: a
Current Letter: n
Current Letter: g
Current Letter: o

Döngünün bir sonraki yinelemesine devam eder.


1
Son üç ya da dört gündür düşünüyordum, neden bir 'devam' ifadesine ihtiyacım var ve daha sonra bu yazıya giriyorum ve bu da bana bazı KG ile yardımcı oluyor - çok teşekkürler!
Freddy

3
burada da, python betiği yazdığımızda (cron işi için) ve büyük değerlerde yineleme yaptığımızda ve bazı istisnalar meydana geldiğinde cron işi durdurulacak ve sadece ertesi gün, bu durumda gerçekten çok yardımcı olduğunu biliyorsunuz, Evet istisna olarak posta gönderme özelliğini yazabiliriz ancak yine de yürütme durdurulur.
Snehal Parmar

2
Bu, ne continueişe yaradığını gösterir , ancak yapabildiğinizde aşırı kullanışlı değildirif letter != 'D': print 'Current Letter:', letter
Chris_Rands

Ben Pray / remove r veya Fast / remove s seçeneğini seçerdim.
Benjamin Crouzier

102

Eğer "işe" geçmeden önce yerine getirilmesi gereken birçok hükümler olan döngülerde devam etmeyi seviyorum. Yani böyle bir kod yerine:

for x, y in zip(a, b):
    if x > y:
        z = calculate_z(x, y)
        if y - z < x:
            y = min(y, z)
            if x ** 2 - y ** 2 > 0:
                lots()
                of()
                code()
                here()

Ben böyle kodu almak:

for x, y in zip(a, b):
    if x <= y:
        continue
    z = calculate_z(x, y)
    if y - z >= x:
        continue
    y = min(y, z)
    if x ** 2 - y ** 2 <= 0:
        continue
    lots()
    of()
    code()
    here()

Bu şekilde çok derin iç içe kod kaçının. Ayrıca, önce en sık meydana gelen vakaları ortadan kaldırarak döngüyü optimize etmek kolaydır, böylece başka bir showtopper olmadığında sadece seyrek ama önemli vakalarla (örneğin bölen 0'dır) uğraşmam gerekir.


2
Bu nedenle "devam" çoğunlukla girintiyi azaltarak okunabilirlik için kullanılır. "Devam" ın herhangi bir ifade gücü ekleyip eklemediğini merak ediyorum.
JohnG

14
continueBu şekilde kullanmak , kullanmaya benzer GOTO. Ancak, bu doğru kullanım yoludur GOTO.
dotancohen

1
@JohnG Çalışma zamanında pahalı olmamasına rağmen, onsuz çoğaltılamayan herhangi bir devam etmenin (ya da kırılmanın) olduğuna inanmıyorum.
Sparr

18

Genellikle devam etmenin gerekli / yararlı olduğu durum, döngüde kalan kodu atlamak ve yinelemeye devam etmek istediğiniz durumdur.

Her zaman aynı mantığı sağlamak için if ifadelerini kullanabildiğiniz için gerçekten gerekli olduğuna inanmıyorum, ancak kodun okunabilirliğini artırmak için yararlı olabilir.


23
dikkat if <condition>: continueetmeden kullanmak if not <condition>: ..., aksi takdirde yazılmamışsa gerekli olacak bir girinti düzeyinden kaçınır.
Dan D.7

1
JohnG'ye benzer bir qn göndermek üzereydim ama daha sonra ne bilmek istediğimi sorduğunu gördüm. Buradaki tüm yanıtları okumak yardımcı oldu, ancak yine de bir şeyden emin olmalıyım - yani, bir continueifade kullandığımızda , esasen bir koşullu test bölümünden atlıyoruz ve döngü yinelemesinin devam etmesine izin veriyoruz sonraki yinelemeye? Bunun nasıl kullanacağımdan daha iyi olacağı belli değil else. Sadece geliştirilmiş okunabilirlik ve çalışma zamanı performansı ile mi ilgili?
AKKO

"Bunun gerekli olduğuna inanmıyorum" ... python yaratıcıları aksini düşündü.
Jean-François Fabre

12
import random  

for i in range(20):  
    x = random.randint(-5,5)  
    if x == 0: continue  
    print 1/x  

devam etmek son derece önemli bir kontrol ifadesidir. Yukarıdaki kod, sıfıra bölünmenin sonucunun önlenebileceği tipik bir uygulamayı gösterir. Programlardan çıktıyı depolamam gerektiğinde sık sık kullanıyorum, ancak program çöktüğünde çıktıyı saklamak istemiyorum. Yukarıdaki örneği test etmek için, son ifadeyi print 1 / float (x) ile değiştirin veya bir kesir olduğunda sıfırlar elde edersiniz, çünkü randint bir tamsayı döndürür. Anlaşılır olması için atladım.


10

Bazı insanlar okunabilirlik hakkında "Oh, okunabilirliğe o kadar yardımcı olmuyor, kimin umurunda?"

Ana koddan önce bir kontrole ihtiyacınız olduğunu varsayalım:

if precondition_fails(message): continue

''' main code here '''

Bunu , ana kod yazıldıktan sonra yine de bu kodu değiştirmeden yapabileceğinizi unutmayın . Kodu ayırırsanız, ana kodda boşluk değişikliği olmadığından yalnızca "devam" ile eklenen satır vurgulanır.

Üretim kodunun bir kahvaltısını yapmanız gerekip gerekmediğini düşünün. Kodu incelediğinizde bunun tek değişiklik olduğunu görmek kolaydır. Ana kodu if / else içinde kaydırmaya başlarsanız, özellikle Python'da tehlikeli olan boşluk değişikliklerini yok saymazsanız diff yeni girilen kodu vurgulayacaktır. Kısa sürede kod yayınlamanız gereken durumda değilseniz, bunu tam olarak takdir edemeyebilirsiniz.


5
def filter_out_colors(elements):
  colors = ['red', 'green']
  result = []
  for element in elements:
    if element in colors:
       continue # skip the element
    # You can do whatever here
    result.append(element)
  return result

  >>> filter_out_colors(['lemon', 'orange', 'red', 'pear'])
  ['lemon', 'orange', 'pear']

4
Peki continueifade buraya ne ekliyor ? Kullanarak ortadan kaldırılabilir element not in colorsve kod da okunabilir.
ekhumoro

4

Diyelim ki 3 ve 5'in katları olmayan tüm sayıları yazdırmak istiyoruz

for x in range(0, 101):
    if x % 3 ==0 or x % 5 == 0:
        continue
        #no more code is executed, we go to the next number 
    print x

Ayrıca, sadece kullanabilirsiniz if x %3 == 0 or x % 5 == 0:, pass, else:,print x
Joker

Doğru yol, continue ya da operatörün kullanılmamasıdır. Neden gereksiz yere pass kullanıyorsunuz?
ytpillai

Yolunu daha iyi seviyorum (bu yüzden upvote). Ben şimdiye kadar varsa çözmek için çalışırken bu sayfaya gelerek ihtiyaç kullanmak continue. Benim sonucum hiç bir ihtiyaç olmadığı , ancak bazı durumlarda (bunun gibi) kod kullanılarak daha okunabilir continue. Bu çok iyi bir örnek.
Wildcard

3

IF'lerle yapılabileceğinden kesinlikle gerekli değildir, ancak çalışma zamanında daha okunabilir ve daha az pahalıdır.

Veri bazı gereksinimleri karşılamıyorsa, bir döngüde bir yineleme atlamak için kullanın:

# List of times at which git commits were done.
# Formatted in hour, minutes in tuples.
# Note the last one has some fantasy.
commit_times = [(8,20), (9,30), (11, 45), (15, 50), (17, 45), (27, 132)]

for time in commit_times:
    hour = time[0]
    minutes = time[1]

    # If the hour is not between 0 and 24
    # and the minutes not between 0 and 59 then we know something is wrong.
    # Then we don't want to use this value,
    # we skip directly to the next iteration in the loop.
    if not (0 <= hour <= 24 and 0 <= minutes <= 59):
        continue

    # From here you know the time format in the tuples is reliable.
    # Apply some logic based on time.
    print("Someone commited at {h}:{m}".format(h=hour, m=minutes))

Çıktı:

Someone commited at 8:20
Someone commited at 9:30
Someone commited at 11:45
Someone commited at 15:50
Someone commited at 17:45

Gördüğünüz gibi, yanlış değer continueifadeden sonra bunu yapmadı .


ifyalnızca continuetüm kod bir blokta bulunuyorsa ne yapabilir? bloğun continuedışında bile olan kodu atlar if.
bryc

Saat neden 24 kapsayıcıdır, ancak dakika 60'a özeldir?
Patrick Artner

özel bir neden yok, sadece bir örnek, düzenlemek için çekinmeyin
Bastian

1

Örneğin, bir değişkenin değerine bağlı olarak farklı şeyler yapmak istiyorsanız:

my_var = 1
for items in range(0,100):
    if my_var < 10:
        continue
    elif my_var == 10:
        print("hit")
    elif my_var > 10:
        print("passed")
    my_var = my_var + 1

Yukarıdaki örnekte breaktercüman kullanırsam döngü atlanır. Ancak bununla continuebirlikte yalnızca if-elif ifadelerini atlar ve doğrudan döngünün bir sonraki öğesine gider.


3
ilk koşul her zaman doğru olduğundan örneğiniz asla hiçbir şey basmaz. için bir başlangıç değerini alan my_varbir 0.
Dan D.7

Eski bir kod örneğimi uyarladım. Var'ın orijinal değeri 0 değildir ve artan kısmı orijinal yeri olmadığı için kolaylık sağlamak için eklenmiştir. Bu bir örnek olduğu ve değeri gerçekten önemli olmadığı için tamam sanırım.
jonathan.hepp

9
Tamam değil. Kullanmak için iyi bir reklam değil continue.
John Machin

3
Ve ilki bir elifolmalıdır if. Kod, ne yaptığınızı bildiğiniz görünümü vermez.
John Machin

bu kötü bir örnek
patrick

0

continue bir sonraki yinelemeye kadar döngüdeki kodun geri kalanını atlar

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.