簡體   English   中英

看來我的代碼正在無限循環

[英]It seems my code is making an infinite loop

我是一名 Python 學習者,似乎我的代碼在while表達式中進行了無限循環,但我不明白為什么。

我想要的是一個程序來總結這個列表中的前五個奇數。

這是 Udacity 站點中一個非常基本的練習,輸出是程序關閉使用 13 個 CPU 秒,而在 Windows python3 中它不顯示任何輸出。 經過一些測試,我懷疑是while表達式中存在無限循環的問題。

num_list = [422, 136, 524, 85, 96, 719, 85, 92, 10, 17, 312, 542, 87, 23, 86, 191, 116, 35, 173, 45, 149, 59, 84, 69, 113, 166]

    z=0
    s=0
    for i in range(len(num_list)):
        while z<=5:
            if num_list[i]%2==1:
                z+=1
                s+=num_list[i]
    print(s)

按照你的代碼

  • 你開始索引0
  • 讀取值為422
  • 你沒有進入如果
  • 你不增加z
  • 你無限期地停留在while循環中
for i in range(len(num_list)):
    while z <= 5:
        if num_list[i] % 2 == 1:

解決方案 1 :不要使用 2 個循環(while 和 for),因為您想做兩件事:迭代值檢查 5 個條件。 當你得到五個時,你可以break

for i in range(len(num_list)):
    if num_list[i] % 2 == 1:
        z += 1
        s += num_list[i]
    if z >= 5:
        break

解決方案 2 :使用不同的邏輯

  • 得到奇怪的
  • 獲得前 5 個
  • 將它們相加
r = sum(list(filter(lambda i: i % 2 == 1, num_list))[:5])

您的 for 循環會將num_list的第一項放入i因此i將是422 然后你有一個 while 循環,只要z<=5就會運行。

然后您檢查422 % 2是否等於 1。它不是 422 mod 2 是 0。因此,由於此條件不成立,因此您永遠不會更新 z,因此 z 將始終保持為 0。並且由於 0 小於 5,您的循環將永遠運行

問題是if num_list[i]%2==1:不會觸發。 這可以防止forwhile循環條件發生變化,從而將執行困在內部循環中。

避免無限循環的第一個變化是避免循環本身。 由於每個數字只應檢查奇數的計數,因此請使用if而不是while

z=0
s=0
for i in range(len(num_list)):
    if z<=5:  # checked only once for each i
        if num_list[i]%2==1:
            z+=1
            s+=num_list[i]
print(s)

這已經可以解決您的問題。 不過,您可能希望進一步清理代碼。 編寫慣用代碼自然會避免某些陷阱,例如無限循環。

首先,考慮這兩項檢查有不同的目的。 z檢查用於停止迭代, %2檢查用於選擇元素。 停止迭代是使用break完成的。

z=0
s=0
for i in range(len(num_list)):
    if z<=5:  # break condition
        break
    if num_list[i]%2==1:  # sum condition
        z+=1
        s+=num_list[i]
print(s)

現在,請記住 Python 的容器類型本身是可迭代的。 不需要單獨的i索引,可以直接從列表中獲取數字。 另外,請記住,非零數字被認為是“真”——而不是num % 2 == 1 ,只檢查num %2

z=0
s=0
for number in num_list:  # iterate on elements, eliminate i
    if z <= 5:
        break
    if number % 2:  # only test that it is not zero
        z += 1
        s += number
print(s)

Python 有多種工具可以簡化可迭代對象的使用。 生成器表達式允許廉價地過濾和轉換可迭代對象。 這允許在for循環之前刪除所有偶數。

z=0
s=0
# only work on odd numbers
for odd_number in (num for num in num_list if num % 2):
    if z <= 5:
        break
    z += 1
    s += odd_number
print(s)

由於增加迭代次數非常普遍,Python 有一個內置函數可以為您執行此操作: enumerate 它需要一個可迭代對象,並在獲取新項目時計數。

s=0
# automatically calculate z
for z, odd_number in enumerate(num for num in num_list if num % 2):
    if z == 5:
        break
    s += odd_number
print(s)

在這種情況下, z的唯一目的是選擇前 5 個元素。 每當您需要處理“前 n”或“最后 m”項時,請考慮使用切片。 切片用於使用container[start:stop:step]語法的container[start:stop:step] ,或使用itertools.islice任意迭代器。

from itertools import islice

s=0
# only use the first 5 odd numbers                             V
for odd_number in islice((num for num in num_list if num % 2), 5):
    s += odd_number
print(s)

最后,總結一個迭代也是一項非常常見的任務,Python 也有一個內置的: sum 由於現在整個邏輯已經從循環轉移到可迭代的,所以可以一口氣總結。

s = sum(islice((num for num in num_list if num % 2), 5))
print(s)

希望這可以幫助

num_list = [422, 136, 524, 85, 96, 719, 85, 92, 10, 17, 312, 542, 87, 23, 86, 191, 116, 35, 173, 45, 149, 59, 84, 69, 113, 166]
c = 0
sum_ = 0
for number in num_list:
    if (c > 4 ):
        break
    if (number % 2 == 1):
        sum_ += number
        c+=1
print(sum_)

印刷

993

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM