Python循環(huán)結(jié)構(gòu)全面解析
循環(huán)是計(jì)算機(jī)科學(xué)運(yùn)算領(lǐng)域的用語,也是一種常見的控制流程。循環(huán)是一段在程序中只出現(xiàn)一次,但可能會(huì)連續(xù)執(zhí)行多次的代碼。循環(huán)中的代碼會(huì)執(zhí)行特定的次數(shù),或者是執(zhí)行到特定條件成立時(shí)結(jié)束循環(huán),或者是針對(duì)某一集合中的所有項(xiàng)目都執(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 可迭代對(duì)象:
# 循環(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,步長(zhǎng)為2
print(i)range函數(shù):
- range(101):可以用來產(chǎn)生0到100范圍的整數(shù),需要注意的是取不到101。
- range(1, 101):可以用來產(chǎn)生1到100范圍的整數(shù),相當(dāng)于是左閉右開的設(shè)定,即[1, 101)。
- range(1, 101, 2):可以用來產(chǎn)生1到100的奇數(shù),其中2是步長(zhǎng)(跨度),即每次遞增的值,101取不到。
- range(100, 0, -2):可以用來產(chǎn)生100到1的偶數(shù),其中-2是步長(zhǎng)(跨度),即每次遞減的值,0取不到。
# 同時(shí)獲取索引和值
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(): # 同時(shí)遍歷鍵和值
print(key, value)
# 并行遍歷多個(gè)序列
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)體
# 當(dāng)條件為True時(shí)執(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-4continue語句
continue跳過當(dāng)前迭代,直接進(jìn)入下一次循環(huán)。
for i in range(10):
if i % 2 == 0:
continue
print(i) # 只打印奇數(shù)else子句
循環(huán)可以有一個(gè)可選的else塊,它在循環(huán)正常完成(即不是由break終止)時(shí)執(zhí)行。
for i in range(5):
print(i)
else:
print("循環(huán)正常完成")
# 如果循環(huán)被break終止,else不會(huì)執(zhí)行
for i in range(5):
if i == 3:
break
print(i)
else:
print("這不會(huì)被執(zhí)行")嵌套的循環(huán)結(jié)構(gòu)
循環(huán)可以嵌套,即一個(gè)循環(huán)內(nèi)部包含另一個(gè)循環(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:判斷素?cái)?shù)
要求:輸入一個(gè)大于 1 的正整數(shù),判斷它是不是素?cái)?shù)。
提示:素?cái)?shù)指的是只能被 1 和自身整除的大于 1 的整數(shù)。例如對(duì)于正整數(shù) n,我們可以通過在 2 到 n−1 之間尋找有沒有 n 的因子,來判斷它到底是不是一個(gè)素?cái)?shù)。當(dāng)然,循環(huán)不用從 2 開始到 n−1 結(jié)束,因?yàn)閷?duì)于大于 1 的正整數(shù),因子應(yīng)該都是成對(duì)出現(xiàn)的,所以循環(huán)到 n 就可以結(jié)束了。
"""
輸入一個(gè)大于1的正整數(shù)判斷它是不是素?cái)?shù)
"""
num = int(input('請(qǐng)輸入一個(gè)正整數(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}是素?cái)?shù)')
else:
print(f'{num}不是素?cái)?shù)')例子2:最大公約數(shù)
要求:輸入兩個(gè)大于 0 的正整數(shù),求兩個(gè)數(shù)的最大公約數(shù)。
提示:兩個(gè)數(shù)的最大公約數(shù)是兩個(gè)數(shù)的公共因子中最大的那個(gè)數(shù)。
"""
輸入兩個(gè)正整數(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ù)字游戲
要求:計(jì)算機(jī)出一個(gè) 1 到 100 之間的隨機(jī)數(shù),玩家輸入自己猜的數(shù)字,計(jì)算機(jī)給出對(duì)應(yīng)的提示信息“大一點(diǎn)”、“小一點(diǎn)”或“猜對(duì)了”,如果玩家猜中了數(shù)字,計(jì)算機(jī)提示用戶一共猜了多少次,游戲結(jié)束,否則游戲繼續(xù)。
"""
猜數(shù)字小游戲
"""
import random
answer = random.randrange(1, 101)
counter = 0
while True:
counter += 1
num = int(input('請(qǐng)輸入: '))
if num < answer:
print('大一點(diǎn).')
elif num > answer:
print('小一點(diǎn).')
else:
print('猜對(duì)了.')
break
print(f'你一共猜了{(lán)counter}次.')分支和循環(huán)結(jié)構(gòu)實(shí)戰(zhàn)
例子1:100以內(nèi)的素?cái)?shù)
說明:素?cái)?shù)指的是只能被 1 和自身整除的正整數(shù)(不包括 1)
"""
輸出100以內(nèi)的素?cá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 個(gè)數(shù)。
說明:斐波那契數(shù)列(Fibonacci sequence),通常也被稱作黃金分割數(shù)列,是意大利數(shù)學(xué)家萊昂納多·斐波那契(Leonardoda Fibonacci)在《計(jì)算之書》中研究理想假設(shè)條件下兔子成長(zhǎng)率問題而引入的數(shù)列,因此這個(gè)數(shù)列也常被戲稱為“兔子數(shù)列”。斐波那契數(shù)列的特點(diǎn)是數(shù)列的前兩個(gè)數(shù)都是 1,從第三個(gè)數(shù)開始,每個(gè)數(shù)都是它前面兩個(gè)數(shù)的和。按照這個(gè)規(guī)律,斐波那契數(shù)列的前 10 個(gè)數(shù)是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55。斐波那契數(shù)列在現(xiàn)代物理、準(zhǔn)晶體結(jié)構(gòu)、化學(xué)等領(lǐng)域都有直接的應(yīng)用。
"""
輸出斐波那契數(shù)列中的前20個(gè)數(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ù),它是一個(gè) N 位非負(fù)整數(shù),其各位數(shù)字的 N 次方和剛好等于該數(shù)本身,例如: 153=13+53+33 ,所以 153 是一個(gè)水仙花數(shù); 1634=14+64+34+44 ,所以 1634 也是一個(gè)水仙花數(shù)。對(duì)于三位數(shù),解題的關(guān)鍵是將它拆分為個(gè)位、十位、百位,再判斷是否滿足水仙花數(shù)的要求,這一點(diǎn)利用 Python 中的//和%運(yùn)算符其實(shí)很容易做到。
"""
找出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:百錢百雞問題
說明:百錢百雞是我國(guó)古代數(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又稱花旗骰,是美國(guó)拉斯維加斯非常受歡迎的一種的桌上賭 博游戲。該游戲使用兩粒骰子,玩家通過搖兩粒骰子獲得點(diǎn)數(shù)進(jìn)行游戲。簡(jiǎn)化后的規(guī)則是:玩家第一次搖骰子如果搖出了 7 點(diǎn)或 11 點(diǎn),玩家勝;玩家第一次如果搖出 2 點(diǎn)、3 點(diǎn)或 12 點(diǎn),莊家勝;玩家如果搖出其他點(diǎn)數(shù)則游戲繼續(xù),玩家重新?lián)u骰子,如果玩家搖出了 7 點(diǎn),莊家勝;如果玩家搖出了第一次搖的點(diǎn)數(shù),玩家勝;其他點(diǎn)數(shù)玩家繼續(xù)搖骰子,直到分出勝負(fù)。為了增加代碼的趣味性,我們?cè)O(shè)定游戲開始時(shí)玩家有 1000 元的賭注,每局游戲開始之前,玩家先下 注,如果玩家獲勝就可以獲得對(duì)應(yīng)下 注金額的獎(jiǎng)勵(lì),如果莊家獲勝,玩家就會(huì)輸?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('請(qǐng)下 注: '))
if 0 < debt <= money:
break
# 用兩個(gè)1到6均勻分布的隨機(jī)數(shù)相加模擬搖兩顆色子得到的點(diǎn)數(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
TensorFlow Autodiff自動(dòng)微分詳解
這篇文章主要介紹了TensorFlow Autodiff自動(dòng)微分詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Flask項(xiàng)目中實(shí)現(xiàn)短信驗(yàn)證碼和郵箱驗(yàn)證碼功能
這篇文章主要介紹了Flask項(xiàng)目中實(shí)現(xiàn)短信驗(yàn)證碼和郵箱驗(yàn)證碼功能,需本文通過截圖實(shí)例代碼的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-12-12
利用Python找出序列中出現(xiàn)最多的元素示例代碼
這篇文章主要給大家介紹了關(guān)于利用Python找出序列中出現(xiàn)最多的元素的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
Python使用cx_Freeze庫生成msi格式安裝文件的方法
這篇文章主要介紹了Python使用cx_Freeze庫生成msi格式安裝文件的方法,結(jié)合實(shí)例形式分析了Python基于cx_Freeze庫生成msi格式安裝文件操作技巧與相關(guān)問題解決方法,需要的朋友可以參考下2018-07-07

