Python中while循環(huán)常見(jiàn)用法與實(shí)戰(zhàn)代碼
1.while 循環(huán)的基本概念
1.1 語(yǔ)法格式
while 條件表達(dá)式:
循環(huán)體代碼塊
else:
循環(huán)正常結(jié)束(沒(méi)有被 break 終止)時(shí)執(zhí)行的代碼塊條件表達(dá)式:任何能計(jì)算出布爾值的表達(dá)式。只要結(jié)果為
True,循環(huán)體就會(huì)重復(fù)執(zhí)行;一旦結(jié)果為False,循環(huán)終止。循環(huán)體:縮進(jìn)的代碼塊,至少要有一條語(yǔ)句(可以使用
pass占位)。else 子句(可選):僅當(dāng)循環(huán)沒(méi)有被
break終止時(shí)執(zhí)行。常用于“查找失敗”或“正常完成”的場(chǎng)景。
1.2 最簡(jiǎn)單的示例
count = 0
while count < 5:
print(count)
count += 1
執(zhí)行流程:
初始化
count = 0。判斷
count < 5為True,進(jìn)入循環(huán)體。打印
0,然后count變?yōu)?nbsp;1。回到條件判斷,
1 < 5仍為True,重復(fù)。當(dāng)
count變?yōu)?nbsp;5時(shí),5 < 5為False,循環(huán)結(jié)束。
1.3 while 與 for 的對(duì)比
| 特性 | for 循環(huán) | while 循環(huán) |
|---|---|---|
| 適用場(chǎng)景 | 遍歷已知序列或固定次數(shù) | 條件控制,次數(shù)未知 |
| 循環(huán)變量 | 自動(dòng)從可迭代對(duì)象中獲取 | 需要手動(dòng)初始化并更新 |
| 無(wú)限循環(huán)風(fēng)險(xiǎn) | 極少(除非可迭代對(duì)象無(wú)限大) | 容易忘記更新條件導(dǎo)致無(wú)限循環(huán) |
| 典型用途 | 遍歷列表、字符串、range 等 | 用戶輸入驗(yàn)證、游戲主循環(huán)、迭代收斂算法 |
2. 代碼執(zhí)行順序詳解
理解 while 的執(zhí)行順序是避免邏輯錯(cuò)誤的基礎(chǔ)
a = 1
while a < 3:
print(f"開(kāi)始循環(huán),a = {a}")
a += 1
print(f"結(jié)束本次循環(huán),a = {a}")
print("循環(huán)結(jié)束")開(kāi)始循環(huán),a = 1
結(jié)束本次循環(huán),a = 2
開(kāi)始循環(huán),a = 2
結(jié)束本次循環(huán),a = 3
循環(huán)結(jié)束
詳細(xì)步驟:
檢查條件
a < 3(此時(shí)a=1,True)→ 進(jìn)入循環(huán)體。執(zhí)行
a += 1使a變?yōu)?nbsp;2。再次回到條件檢查,
2 < 3為True,繼續(xù)第二次循環(huán)。第二次循環(huán)中
a從2變?yōu)?nbsp;3。條件檢查
3 < 3為False,循環(huán)終止,執(zhí)行循環(huán)外的
關(guān)鍵點(diǎn):循環(huán)條件在每次循環(huán)開(kāi)始前計(jì)算,而不是在循環(huán)體中間動(dòng)態(tài)判斷。
3. 無(wú)限循環(huán)及其控制
當(dāng)條件永遠(yuǎn)為 True 時(shí),循環(huán)永遠(yuǎn)不會(huì)終止,稱為無(wú)限循環(huán)。有時(shí)我們需要無(wú)限循環(huán)(例如游戲引擎、服務(wù)器主循環(huán)),但通常我們會(huì)設(shè)置一個(gè)退出條件(如 break)。
3.1 無(wú)限循環(huán)的基本寫(xiě)法
while True:
user_input = input("輸入 'exit' 退出: ")
if user_input == 'exit':
break
print(f"你輸入了: {user_input}")注意事項(xiàng):
使用
while True必須配合break退出,否則程序會(huì)永遠(yuǎn)運(yùn)行。可以在循環(huán)體內(nèi)的任何位置根據(jù)條件
break。
3.2 避免無(wú)限循環(huán)的常見(jiàn)錯(cuò)誤
# 錯(cuò)誤:忘記更新循環(huán)變量
i = 0
while i < 10:
print(i) # 無(wú)限循環(huán),因?yàn)?i 永遠(yuǎn)為 0修正:確保循環(huán)條件中的變量在循環(huán)體內(nèi)被修改。
4. break、continue 與 else
4.1break:提前終止整個(gè)循環(huán)
num = 0
while num < 10:
if num == 5:
break
print(num)
num += 1
# 輸出 0,1,2,3,4break 會(huì)立即退出循環(huán),即使條件仍為 True。
4.2continue:跳過(guò)本次循環(huán)剩余部分,進(jìn)入下一次迭代
num = 0
while num < 5:
num += 1
if num == 3:
continue
print(num)
# 輸出 1,2,4,5 (跳過(guò)了 3)注意:在 while 循環(huán)中使用 continue 時(shí),務(wù)必確保循環(huán)變量更新在 continue 之前,否則可能導(dǎo)致無(wú)限循環(huán)。
# 錯(cuò)誤示范
i = 0
while i < 5:
if i == 3:
continue # 跳過(guò) i += 1,i 永遠(yuǎn)為 3,無(wú)限循環(huán)
print(i)
i += 14.3else子句:循環(huán)正常結(jié)束時(shí)執(zhí)行
else 塊僅在循環(huán)沒(méi)有被 break 終止時(shí)運(yùn)行。
# 查找列表中是否包含偶數(shù)
numbers = [1, 3, 5, 7]
i = 0
while i < len(numbers):
if numbers[i] % 2 == 0:
print(f"找到偶數(shù) {numbers[i]}")
break
i += 1
else:
print("沒(méi)有找到偶數(shù)")因?yàn)榱斜砣瞧鏀?shù),break 未觸發(fā),else 會(huì)執(zhí)行。
5. 常見(jiàn)用法與實(shí)戰(zhàn)模式
5.1 用戶輸入驗(yàn)證(直到輸入合法)
while True:
age_str = input("請(qǐng)輸入年齡(1-120):")
if age_str.isdigit():
age = int(age_str)
if 1 <= age <= 120:
break
print("輸入無(wú)效,請(qǐng)重新輸入")
print(f"您的年齡是 {age}")5.2 模擬 do-while 循環(huán)
Python 沒(méi)有內(nèi)置的 do-while(先執(zhí)行一次再判斷條件)??梢杂?nbsp;while True + break 模擬:
while True:
# 循環(huán)體至少執(zhí)行一次
response = input("繼續(xù)嗎?(y/n): ")
if response == 'n':
break5.3 迭代收斂(數(shù)值計(jì)算,如牛頓迭代)
def sqrt_newton(n, tolerance=1e-6):
guess = n / 2
while abs(guess * guess - n) > tolerance:
guess = (guess + n / guess) / 2
return guess
print(sqrt_newton(2)) # 約 1.4142135625.4 遍歷自定義迭代器(手動(dòng)模擬 for)
it = iter([1, 2, 3])
while True:
try:
x = next(it)
print(x)
except StopIteration:
break5.5 倒計(jì)時(shí)與延遲
import time
countdown = 5
while countdown > 0:
print(countdown)
time.sleep(1)
countdown -= 1
print("發(fā)射!")6. 高級(jí)擴(kuò)展與性能優(yōu)化
6.1 使用while與else實(shí)現(xiàn)查找算法
在數(shù)據(jù)流中查找滿足條件的元素,若找到則處理,若未找到則執(zhí)行備選操作。
def find_first(predicate, iterable):
it = iter(iterable)
while True:
try:
item = next(it)
except StopIteration:
break
if predicate(item):
return item
else: # 這里 while-else 中的 else 表示“從未 break”
return None
print(find_first(lambda x: x > 10, [1,5,3])) # None
print(find_first(lambda x: x > 10, [1,15,3])) # 156.2while與生成器配合處理大文件
逐行讀取大文件,避免一次性加載到內(nèi)存:
with open('large_file.txt') as f:
while True:
line = f.readline()
if not line:
break
process(line)更 Pythonic 的方式是 for line in f:,但 while 方式能讓你在讀取過(guò)程中靈活控制(例如跳過(guò)、回溯等)。
6.3 性能注意事項(xiàng)
避免在循環(huán)內(nèi)重復(fù)計(jì)算不變的值:將常量提到循環(huán)外。
# 不推薦
while i < len(data):
do_something(i, len(data))
i += 1
# 推薦
n = len(data)
while i < n:
do_something(i, n)
i += 1盡量使用局部變量:在循環(huán)內(nèi)頻繁訪問(wèn)全局變量或?qū)傩詴?huì)比局部變量慢。
對(duì)于大量數(shù)值計(jì)算,考慮使用 NumPy 向量化,避免 Python 級(jí)別的循環(huán)。
6.4while與遞歸
任何 while 循環(huán)都可以改寫(xiě)為遞歸,但遞歸受限于調(diào)用棧深度。一般情況下 while 更高效且無(wú)棧溢出風(fēng)險(xiǎn)。
# 遞歸版本(不推薦用于大數(shù)據(jù)量)
def countdown(n):
if n <= 0:
print("發(fā)射")
else:
print(n)
countdown(n-1)
# while 版本
def countdown_while(n):
while n > 0:
print(n)
n -= 1
print("發(fā)射")6.5while循環(huán)中的指針技巧(模擬 C 語(yǔ)言風(fēng)格)
雖然 Python 不提倡,但有時(shí)需要手動(dòng)控制索引:
# 刪除列表中所有特定值(原地修改)
lst = [1, 2, 3, 2, 4, 2]
i = 0
while i < len(lst):
if lst[i] == 2:
lst.pop(i)
else:
i += 1
print(lst) # [1, 3, 4]注意:pop 會(huì)改變列表長(zhǎng)度,索引管理需要小心。更簡(jiǎn)單的做法是列表推導(dǎo)式。
7. 常見(jiàn)陷阱與避坑指南
| 陷阱 | 錯(cuò)誤示例 | 解決方案 |
|---|---|---|
| 無(wú)限循環(huán) | while i < 10: 但未更新 i | 確保循環(huán)條件中的變量在循環(huán)體內(nèi)改變 |
continue 跳過(guò)更新 | while i < 5: if cond: continue; i+=1 | 將 i+=1 放在 continue 之前 |
| 忘記處理迭代器耗盡 | while True: x = next(it) 無(wú) StopIteration 捕獲 | 使用 try-except 或改用 for |
使用 = 而不是 == 作為條件 | while x = 5:(語(yǔ)法錯(cuò)誤) | 使用 == 比較 |
在 while 內(nèi)修改正在遍歷的列表 | 導(dǎo)致索引錯(cuò)亂 | 遍歷副本或使用其他結(jié)構(gòu) |
| 整數(shù)溢出(Python 中不存在) | - | Python 整數(shù)無(wú)限精度,但其他語(yǔ)言需注意 |
到此這篇關(guān)于Python中while循環(huán)常見(jiàn)用法與實(shí)戰(zhàn)代碼的文章就介紹到這了,更多相關(guān)Python中while循環(huán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 全面解析Python的While循環(huán)語(yǔ)句的使用方法
- 跟老齊學(xué)Python之用while來(lái)循環(huán)
- Python學(xué)習(xí)之while 循環(huán)語(yǔ)句
- 談?wù)凱ython中的while循環(huán)語(yǔ)句
- python中使用while循環(huán)的實(shí)例
- Python入門_淺談for循環(huán)、while循環(huán)
- Python while 循環(huán)使用的簡(jiǎn)單實(shí)例
- 詳解python基礎(chǔ)之while循環(huán)及if判斷
- 對(duì)python while循環(huán)和雙重循環(huán)的實(shí)例詳解
- Python基礎(chǔ)教程之if判斷,while循環(huán),循環(huán)嵌套
相關(guān)文章
python檢測(cè)空間儲(chǔ)存剩余大小和指定文件夾內(nèi)存占用的實(shí)例
今天小編就為大家分享一篇python檢測(cè)空間儲(chǔ)存剩余大小和指定文件夾內(nèi)存占用的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
python數(shù)據(jù)預(yù)處理 :樣本分布不均的解決(過(guò)采樣和欠采樣)
今天小編就為大家分享一篇python數(shù)據(jù)預(yù)處理 :樣本分布不均的解決(過(guò)采樣和欠采樣),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
python實(shí)現(xiàn)合并兩個(gè)有序列表的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)合并兩個(gè)有序列表的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Python網(wǎng)絡(luò)爬蟲(chóng)之Web網(wǎng)頁(yè)基礎(chǔ)
我們?cè)趯W(xué)習(xí)爬蟲(chóng)之前,要先了解網(wǎng)頁(yè)的組成,只有我們了解其組成嗎,才可以方能百戰(zhàn)百勝,文章中有詳細(xì)的代碼示例,需要的朋友可以參考一下2023-04-04
PyQt6/PySide6 的 QPropertyAnimation 類適用場(chǎng)景分析
QGraphicsView和QGraphicsScene是Qt圖形視圖框架的核心類,用于構(gòu)建高性能、可交互的2D圖形界面,QGraphicsView 和 QGraphicsScene 為復(fù)雜圖形應(yīng)用提供了強(qiáng)大支持,本文給大家介紹PyQt6/PySide6 的 QPropertyAnimation 類,感興趣的朋友一起看看吧2025-03-03
精選20個(gè)好玩又實(shí)用的的Python實(shí)戰(zhàn)項(xiàng)目(有圖文代碼)
文章介紹了20個(gè)實(shí)用Python項(xiàng)目,涵蓋游戲開(kāi)發(fā)、工具應(yīng)用、圖像處理、機(jī)器學(xué)習(xí)等,使用Tkinter、PIL、OpenCV、Kivy等庫(kù)實(shí)現(xiàn)功能,適合學(xué)習(xí)和練習(xí),項(xiàng)目包括猜字游戲、鬧鐘、二維碼生成、語(yǔ)言檢測(cè)、音樂(lè)播放器等,用戶可直接pip安裝所需庫(kù)并動(dòng)手實(shí)踐2025-08-08
python神經(jīng)網(wǎng)絡(luò)MobileNet模型的復(fù)現(xiàn)詳解
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)MobileNet模型的復(fù)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05

