[英]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
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 :使用不同的邏輯
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:
不會觸發。 這可以防止for
和while
循環條件發生變化,從而將執行困在內部循環中。
避免無限循環的第一個變化是避免循環本身。 由於每個數字只應檢查奇數的計數,因此請使用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.