Contoh penggunaan pernyataan "lanjutkan" dengan Python?

177

Itu Definisi dari continuepernyataan adalah:

The continuepernyataan berlanjut dengan iterasi berikutnya dari loop.

Saya tidak dapat menemukan contoh kode yang bagus.

Bisakah seseorang menyarankan beberapa kasus sederhana di mana continuediperlukan?

JohnG
sumber

Jawaban:

218

Berikut ini contoh sederhana:

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

Output akan menjadi:

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

Ini berlanjut ke iterasi loop berikutnya.

Snehal Parmar
sumber
1
Saya telah berpikir selama tiga atau empat hari terakhir, mengapa saya membutuhkan pernyataan 'lanjut' dan kemudian saya mengalami posting ini yang pada gilirannya membantu saya dengan beberapa QA - terima kasih banyak!
Freddy
3
sama di sini, ketika kita menulis skrip python (untuk pekerjaan cron) dan mengulang pada nilai yang besar dan beberapa pengecualian terjadi maka pekerjaan cron akan dihentikan dan Anda hanya dapat mengetahui bahwa pada hari berikutnya, itu benar-benar banyak membantu dalam kasus itu, ya kita dapat menulis fitur kirim email dengan pengecualian tetapi eksekusi masih akan terhenti.
Snehal Parmar
2
Ini menggambarkan apa yang continuedilakukan tetapi itu tidak terlalu berguna, ketika Anda bisa melakukannyaif letter != 'D': print 'Current Letter:', letter
Chris_Rands
Saya akan memilih Pray / remove r, atau Fast / remove s.
Benjamin Crouzier
102

Saya suka menggunakan terus dalam loop di mana ada banyak kondisi yang harus dipenuhi sebelum Anda "turun ke bisnis". Jadi alih-alih kode seperti ini:

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

Saya mendapatkan kode seperti ini:

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

Dengan melakukannya dengan cara ini saya menghindari kode yang sangat bersarang. Juga, mudah untuk mengoptimalkan loop dengan menghilangkan kasus yang paling sering terjadi terlebih dahulu, sehingga saya hanya harus berurusan dengan kasus yang jarang tetapi penting (misalnya pembagi adalah 0) ketika tidak ada showstopper lainnya.

Lauritz V. Thaulow
sumber
2
Jadi "terus" digunakan sebagian besar untuk keterbacaan dengan mengurangi indentasi. Saya bertanya-tanya apakah "melanjutkan" menambah kekuatan ekspresif.
JohnG
14
Menggunakan continuedengan cara ini mirip dengan menggunakan GOTO. Namun, ini cara yang tepat untuk digunakanGOTO .
dotancohen
1
@ JohnG Saya tidak percaya ada penggunaan terus (atau istirahat, dalam hal ini) yang tidak dapat direproduksi tanpanya, meskipun tidak memiliki itu bisa mahal di run-time.
Sparr
18

Biasanya situasi di mana lanjutkan diperlukan / berguna, adalah ketika Anda ingin melewatkan kode yang tersisa dalam loop dan melanjutkan iterasi.

Saya tidak benar-benar percaya itu perlu, karena Anda selalu dapat menggunakan pernyataan jika memberikan logika yang sama, tetapi mungkin berguna untuk meningkatkan keterbacaan kode.

pcalcao
sumber
23
perhatikan bahwa menggunakan if <condition>: continuealih - alih if not <condition>: ...menghindari tingkat lekukan yang seharusnya diperlukan jika ditulis tanpa itu.
Dan D.
1
Saya hendak memposting qn yang mirip dengan JohnG tetapi kemudian menemukan bahwa dia sudah bertanya apa yang ingin saya ketahui. Membaca semua tanggapan di sini telah membantu, tetapi saya masih harus yakin tentang satu hal - jadi apakah setiap kali kita menggunakan continuepernyataan, kita pada dasarnya melompat keluar dari bagian pengujian bersyarat dan memungkinkan iterasi dari loop untuk melanjutkan ke iterasi berikutnya? Tidak jelas bagi saya bagaimana ini akan lebih baik daripada menggunakan else. Apakah ini semua tentang peningkatan keterbacaan dan kinerja run-time?
AKKO
"Aku tidak percaya itu perlu" ... yah, pembuat python berpikir sebaliknya.
Jean-François Fabre
12
import random  

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

melanjutkan adalah pernyataan kontrol yang sangat penting. Kode di atas menunjukkan aplikasi khas, di mana hasil pembagian dengan nol dapat dihindari. Saya sering menggunakannya ketika saya perlu menyimpan output dari program, tetapi tidak ingin menyimpan output jika program macet. Catatan, untuk menguji contoh di atas, ganti pernyataan terakhir dengan print 1 / float (x), atau Anda akan mendapatkan nol setiap kali ada pecahan, karena randint mengembalikan integer. Saya menghilangkannya untuk kejelasan.

pengguna1871712
sumber
10

Beberapa orang berkomentar tentang keterbacaan, dengan mengatakan, "Oh, itu tidak banyak membantu keterbacaan, siapa yang peduli?"

Misalkan Anda perlu cek sebelum kode utama:

if precondition_fails(message): continue

''' main code here '''

Perhatikan Anda dapat melakukan ini setelah kode utama ditulis tanpa mengubah kode itu. Jika Anda membedakan kode, hanya baris yang ditambahkan dengan "lanjutkan" yang akan disorot karena tidak ada perubahan spasi pada kode utama.

Bayangkan jika Anda harus melakukan perbaikan kode produksi, yang ternyata hanya menambahkan baris dengan melanjutkan. Sangat mudah untuk melihat bahwa satu-satunya perubahan ketika Anda meninjau kode. Jika Anda mulai membungkus kode utama di if / else, diff akan menyorot kode yang baru diindentasi, kecuali jika Anda mengabaikan perubahan spasi, yang berbahaya terutama di Python. Saya pikir kecuali Anda sudah dalam situasi di mana Anda harus mengeluarkan kode dalam waktu singkat, Anda mungkin tidak sepenuhnya menghargai ini.

CS
sumber
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']
ILYA Khlopotov
sumber
4
Tapi apa yang ditambahkancontinue pernyataan itu di sini? Itu bisa dihilangkan dengan menggunakan , dan kodenya akan mudah dibaca. element not in colors
ekhumoro
4

Katakanlah kita ingin mencetak semua angka yang bukan kelipatan 3 dan 5

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
ytpillai
sumber
Anda juga bisa hanya menggunakan if x %3 == 0 or x % 5 == 0:, pass, else:,print x
Wildcard
Cara yang benar adalah menggunakan terus atau tidak operator. Mengapa menggunakan pass yang tidak perlu?
ytpillai
Saya suka cara Anda lebih baik (maka upvote). Saya datang ke halaman ini mencoba memilah-milah jika ada kebutuhan untuk digunakan continue. Kesimpulan saya adalah bahwa tidak pernah ada kebutuhan , tetapi dalam beberapa kasus (seperti ini) kodenya lebih mudah dibaca continue. Ini contoh yang sangat bagus.
Wildcard
3

Ini tidak mutlak diperlukan karena dapat dilakukan dengan IF tetapi lebih mudah dibaca dan juga lebih murah dalam menjalankan waktu.

Saya menggunakannya untuk melewati iterasi dalam satu lingkaran jika data tidak memenuhi beberapa persyaratan:

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

Keluaran:

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

Seperti yang Anda lihat, nilai yang salah tidak berhasil setelah continuepernyataan.

Bastian
sumber
ifhanya dapat melakukan apa continuejika semua kode terkandung dalam sebuah blok. continuemelewatkan kode yang bahkan di luar ifblok.
bryc
mengapa jam 24 inklusif tetapi menit 60 eksklusif?
Patrick Artner
tidak ada alasan khusus, hanya sebuah contoh, jangan ragu untuk mengedit
Bastian
1

Misalnya jika Anda ingin melakukan hal-hal yang berbeda tergantung pada nilai variabel:

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

Dalam contoh di atas jika saya menggunakan breakinterpreter akan melewatkan loop. Tetapi dengan continueitu hanya melewatkan pernyataan if-elif dan langsung ke item berikutnya dari loop.

jonathan.hepp
sumber
3
contoh Anda tidak akan pernah mencetak apa pun, karena kondisi pertama selalu benar. dengan asumsi nilai awal untuk my_vardari 0.
Dan D.
Saya hanya mengadaptasi contoh kode lama saya. Nilai asli var bukan 0 dan bagian yang bertambah ditambahkan untuk kenyamanan karena tempat aslinya tidak ada. Karena ini adalah contoh dan nilainya tidak terlalu penting, saya kira tidak apa-apa.
jonathan.hepp
9
Itu tidak baik. Ini bukan iklan yang baik untuk digunakan continue.
John Machin
3
Dan yang pertama elifharus menjadi if. Kode hanya tidak memberikan tampilan yang Anda tahu apa yang Anda lakukan.
John Machin
ini adalah contoh buruk
patrick
0

continue cukup lewati sisa kode dalam loop sampai iterasi berikutnya

Yanfeng Liu
sumber