Python循環(huán)結(jié)構(gòu)全面解析
循環(huán)是計算機科學(xué)運算領(lǐng)域的用語,也是一種常見的控制流程。循環(huán)是一段在程序中只出現(xiàn)一次,但可能會連續(xù)執(zhí)行多次的代碼。循環(huán)中的代碼會執(zhí)行特定的次數(shù),或者是執(zhí)行到特定條件成立時結(jié)束循環(huán),或者是針對某一集合中的所有項目都執(zhí)行一次。
Python提供了兩種主要的循環(huán)結(jié)構(gòu):for
循環(huán)和while
循環(huán)。
for-in循環(huán)
如果明確知道循環(huán)執(zhí)行的次數(shù),推薦使用for-in
循環(huán)
for 變量 in 可迭代對象: # 循環(huán)體 # 每次迭代執(zhí)行這里的代碼
# 遍歷列表 fruits = ["apple", "banana", "cherry"] for fruit in fruits: print(fruit) # 遍歷字符串 for char in "Python": print(char) # 使用range()函數(shù) for i in range(5): # 0到4 print(i) for i in range(2, 6): # 2到5 print(i) for i in range(0, 10, 2): # 0到9,步長為2 print(i)
range函數(shù):
- range(101):可以用來產(chǎn)生0到100范圍的整數(shù),需要注意的是取不到101。
- range(1, 101):可以用來產(chǎn)生1到100范圍的整數(shù),相當于是左閉右開的設(shè)定,即[1, 101)。
- range(1, 101, 2):可以用來產(chǎn)生1到100的奇數(shù),其中2是步長(跨度),即每次遞增的值,101取不到。
- range(100, 0, -2):可以用來產(chǎn)生100到1的偶數(shù),其中-2是步長(跨度),即每次遞減的值,0取不到。
# 同時獲取索引和值 for index, value in enumerate(fruits): print(index, value) # 遍歷字典 person = {"name": "Alice", "age": 25, "city": "New York"} for key in person: # 遍歷鍵 print(key) for value in person.values(): # 遍歷值 print(value) for key, value in person.items(): # 同時遍歷鍵和值 print(key, value) # 并行遍歷多個序列 names = ["Alice", "Bob", "Charlie"] ages = [25, 30, 35] for name, age in zip(names, ages): print(name, age) # 循環(huán)變量命名為_ import time for _ in range(36): print('hello, world') time.sleep(1)
while循環(huán)
如果要構(gòu)造循環(huán)結(jié)構(gòu)但是又不能確定循環(huán)重復(fù)的次數(shù),推薦使用while
循環(huán)。
while 條件: # 循環(huán)體 # 當條件為True時執(zhí)行這里的代碼
# 基本while循環(huán) count = 0 while count < 5: print(count) count += 1 # 無限循環(huán)(通常配合break使用) while True: user_input = input("輸入'quit'退出: ") if user_input == "quit": print(f"你輸入了:{user_input},退出") break print(f"你輸入了: {user_input}")
循環(huán)控制語句
break語句
break
用于完全終止循環(huán),跳出循環(huán)體。
for i in range(10): if i == 5: break print(i) # 只打印0-4
continue語句
continue
跳過當前迭代,直接進入下一次循環(huán)。
for i in range(10): if i % 2 == 0: continue print(i) # 只打印奇數(shù)
else子句
循環(huán)可以有一個可選的else
塊,它在循環(huán)正常完成(即不是由break
終止)時執(zhí)行。
for i in range(5): print(i) else: print("循環(huán)正常完成") # 如果循環(huán)被break終止,else不會執(zhí)行 for i in range(5): if i == 3: break print(i) else: print("這不會被執(zhí)行")
嵌套的循環(huán)結(jié)構(gòu)
循環(huán)可以嵌套,即一個循環(huán)內(nèi)部包含另一個循環(huán)。
# 打印乘法表 for i in range(1, 10): for j in range(1, i+1): print(f"{j}×{i}={i*j}", end="\t") print() # 換行 # 嵌套循環(huán)中的break和continue for i in range(3): for j in range(3): if j == 1: break # 只影響內(nèi)層循環(huán) print(i, j)
循環(huán)結(jié)構(gòu)的應(yīng)用
例子1:判斷素數(shù)
要求:輸入一個大于 1 的正整數(shù),判斷它是不是素數(shù)。
提示:素數(shù)指的是只能被 1 和自身整除的大于 1 的整數(shù)。例如對于正整數(shù) n,我們可以通過在 2 到 n−1 之間尋找有沒有 n 的因子,來判斷它到底是不是一個素數(shù)。當然,循環(huán)不用從 2 開始到 n−1 結(jié)束,因為對于大于 1 的正整數(shù),因子應(yīng)該都是成對出現(xiàn)的,所以循環(huán)到 n 就可以結(jié)束了。
""" 輸入一個大于1的正整數(shù)判斷它是不是素數(shù) """ num = int(input('請輸入一個正整數(shù): ')) end = int(num ** 0.5) is_prime = True for i in range(2, end + 1): if num % i == 0: is_prime = False break if is_prime: print(f'{num}是素數(shù)') else: print(f'{num}不是素數(shù)')
例子2:最大公約數(shù)
要求:輸入兩個大于 0 的正整數(shù),求兩個數(shù)的最大公約數(shù)。
提示:兩個數(shù)的最大公約數(shù)是兩個數(shù)的公共因子中最大的那個數(shù)。
""" 輸入兩個正整數(shù)求它們的最大公約數(shù) """ x = int(input('x = ')) y = int(input('y = ')) for i in range(x, 0, -1): if x % i == 0 and y % i == 0: print(f'最大公約數(shù): {i}') break
例子3:猜數(shù)字游戲
要求:計算機出一個 1 到 100 之間的隨機數(shù),玩家輸入自己猜的數(shù)字,計算機給出對應(yīng)的提示信息“大一點”、“小一點”或“猜對了”,如果玩家猜中了數(shù)字,計算機提示用戶一共猜了多少次,游戲結(jié)束,否則游戲繼續(xù)。
""" 猜數(shù)字小游戲 """ import random answer = random.randrange(1, 101) counter = 0 while True: counter += 1 num = int(input('請輸入: ')) if num < answer: print('大一點.') elif num > answer: print('小一點.') else: print('猜對了.') break print(f'你一共猜了{counter}次.')
分支和循環(huán)結(jié)構(gòu)實戰(zhàn)
例子1:100以內(nèi)的素數(shù)
說明:素數(shù)指的是只能被 1 和自身整除的正整數(shù)(不包括 1)
""" 輸出100以內(nèi)的素數(shù) """ for num in range(2, 100): is_prime = True for i in range(2, int(num ** 0.5) + 1): if num % i == 0: is_prime = False break if is_prime: print(num)
例子2:斐波那契數(shù)列
要求:輸出斐波那契數(shù)列中的前 20 個數(shù)。
說明:斐波那契數(shù)列(Fibonacci sequence),通常也被稱作黃金分割數(shù)列,是意大利數(shù)學(xué)家萊昂納多·斐波那契(Leonardoda Fibonacci)在《計算之書》中研究理想假設(shè)條件下兔子成長率問題而引入的數(shù)列,因此這個數(shù)列也常被戲稱為“兔子數(shù)列”。斐波那契數(shù)列的特點是數(shù)列的前兩個數(shù)都是 1,從第三個數(shù)開始,每個數(shù)都是它前面兩個數(shù)的和。按照這個規(guī)律,斐波那契數(shù)列的前 10 個數(shù)是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55
。斐波那契數(shù)列在現(xiàn)代物理、準晶體結(jié)構(gòu)、化學(xué)等領(lǐng)域都有直接的應(yīng)用。
""" 輸出斐波那契數(shù)列中的前20個數(shù) """ a, b = 0, 1 for _ in range(20): a, b = b, a + b print(a)
例子3:尋找水仙花數(shù)
要求:找出 100 到 999 范圍內(nèi)的所有水仙花數(shù)。
提示:在數(shù)論中,水仙花數(shù)(narcissistic number)也被稱為超完全數(shù)字不變數(shù)、自戀數(shù)、自冪數(shù)、阿姆斯特朗數(shù),它是一個 N 位非負整數(shù),其各位數(shù)字的 N 次方和剛好等于該數(shù)本身,例如: 153=13+53+33 ,所以 153 是一個水仙花數(shù); 1634=14+64+34+44 ,所以 1634 也是一個水仙花數(shù)。對于三位數(shù),解題的關(guān)鍵是將它拆分為個位、十位、百位,再判斷是否滿足水仙花數(shù)的要求,這一點利用 Python 中的//
和%
運算符其實很容易做到。
""" 找出100到999范圍內(nèi)的水仙花數(shù) """ for num in range(100, 1000): low = num % 10 mid = num // 10 % 10 high = num // 100 if num == low ** 3 + mid ** 3 + high ** 3: print(num)
例子4:百錢百雞問題
說明:百錢百雞是我國古代數(shù)學(xué)家張丘建在《算經(jīng)》一書中提出的數(shù)學(xué)問題:雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、雞母、雞雛各幾何?翻譯成現(xiàn)代文是:公雞 5 元一只,母雞 3 元一只,小雞 1 元三只,用 100 塊錢買一百只雞,問公雞、母雞、小雞各有多少只?
""" 百錢百雞問題 """ for x in range(0, 21): for y in range(0, 34): for z in range(0, 100, 3): if x + y + z == 100 and 5 * x + 3 * y + z // 3 == 100: print(f'公雞: {x}只, 母雞: {y}只, 小雞: {z}只') """ 百錢百雞問題2 """ for x in range(0, 21): for y in range(0, 34): z = 100 - x - y if z % 3 == 0 and 5 * x + 3 * y + z // 3 == 100: print(f'公雞: {x}只, 母雞: {y}只, 小雞: {z}只')
例子5:CRAPS賭 博游戲
說明:CRAPS又稱花旗骰,是美國拉斯維加斯非常受歡迎的一種的桌上賭 博游戲。該游戲使用兩粒骰子,玩家通過搖兩粒骰子獲得點數(shù)進行游戲。簡化后的規(guī)則是:玩家第一次搖骰子如果搖出了 7 點或 11 點,玩家勝;玩家第一次如果搖出 2 點、3 點或 12 點,莊家勝;玩家如果搖出其他點數(shù)則游戲繼續(xù),玩家重新?lián)u骰子,如果玩家搖出了 7 點,莊家勝;如果玩家搖出了第一次搖的點數(shù),玩家勝;其他點數(shù)玩家繼續(xù)搖骰子,直到分出勝負。為了增加代碼的趣味性,我們設(shè)定游戲開始時玩家有 1000 元的賭注,每局游戲開始之前,玩家先下 注,如果玩家獲勝就可以獲得對應(yīng)下 注金額的獎勵,如果莊家獲勝,玩家就會輸?shù)糇约合?注的金額。游戲結(jié)束的條件是玩家破產(chǎn)(輸光所有的賭注)。
""" Craps賭博游戲 """ import random money = 1000 while money > 0: print(f'你的總資產(chǎn)為: {money}元') # 下注金額必須大于0且小于等于玩家的總資產(chǎn) while True: debt = int(input('請下 注: ')) if 0 < debt <= money: break # 用兩個1到6均勻分布的隨機數(shù)相加模擬搖兩顆色子得到的點數(shù) first_point = random.randrange(1, 7) + random.randrange(1, 7)
到此這篇關(guān)于Python循環(huán)結(jié)構(gòu)解析的文章就介紹到這了,更多相關(guān)Python循環(huán)結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Python找出序列中出現(xiàn)最多的元素示例代碼
這篇文章主要給大家介紹了關(guān)于利用Python找出序列中出現(xiàn)最多的元素的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12Python使用cx_Freeze庫生成msi格式安裝文件的方法
這篇文章主要介紹了Python使用cx_Freeze庫生成msi格式安裝文件的方法,結(jié)合實例形式分析了Python基于cx_Freeze庫生成msi格式安裝文件操作技巧與相關(guān)問題解決方法,需要的朋友可以參考下2018-07-07