Python語言程式設計基礎——4 程式的控制結構
四 程式的控制結構
目錄
基本結構
程式流程圖
程式描述方式主要有三種,分別是自然語言,流程圖,虛擬碼。
、
分支結構
單分支 if
微例項 4.4 PM2.5空氣質量提醒
問題描述:
目前空氣質量等級以PM2.5數值劃分為6級,PM2.5數值在0~35空氣質量為優,3 5~75為良, 75~115為輕度汙染, 115~150為中度汙染, 150~250為重度汙染, 250~500為嚴重汙染,。
一個簡化版的空氣質量標準採用三級模式:0~35空氣質量為優,3 5~75為良, 75以上為汙染。
問題分析:
IPO描述
輸入:接受外部輸入的 PM2.5 值
處理:
if PM2.5 值 >= 75 ,列印空氣汙染警告
if 35 <= PM2.5值 < 75 ,列印空氣質量良,建議適度戶外活動
if PM2.5值 < 35 ,列印空氣質量優,建議戶外活動
程式碼:
#微例項4.4 PM = eval(input("請輸入PM2.5 數值: ")) if 0 <= PM <= 35: print("空氣優異,快去戶外運動") if 35 <= PM <= 75: print("空氣良好,適度戶外活動") if 75 <= PM: print("空氣汙染,請小心!")
二分支結構: if-else 語句
微例項 4.5 PM2.5空氣質量提醒(2)
程式碼:
#微例項 4.5 PM = eval(input("請輸入PM2.5數值: ")) if PM >= 75: print("空氣汙染,請小心!") else: print("空氣沒有汙染,可以展開戶外活動")
程式碼:
PM = eval(input("請輸入PM2.5數值: ")) print(f'空氣{"存在" if PM >=75 else "沒有"} 汙染!')
多分支結構: if-elif-else 語句
微例項 4.46 PM2.5空氣質量提醒(3)
程式碼:
PM = eval(input("請輸入PM2.5數值:")) if 0<= PM <=35: print("空氣優異,快去戶外活動!") elif 35 <= PM <= 75: print("空氣良好,適度戶外活動!") else: print("空氣汙染,請小心!")
例項5: 身體質量指數
問題描述:
\(BMI = 體重(kg) / 身高^{2}(m^2)\)
BMI指標分類
分類 國際BMI值(\(kg/m^2\)) 國內BMI值(\(kg/m^2\)) 偏瘦 <18.5 <18.5 正常 18.5 ~ 25 18.5~24 偏胖 25~ 30 24 ~ 28 肥胖 >=30 > = 28 編寫一個根據身高體重計算BMI值的程式,同時輸出國際和國內的BMI指標建議值。
問題分析:
IPO描述
輸入:身高和體重值
處理:計算BMI值,並根據BMI指標分類找到合適類別
輸出L列印指標分類資訊
程式碼:
#示例程式碼5.1 height , weight = eval(input("請輸入身高(m)和體重(kg)[逗號隔開]: ")) bmi = weight / pow(height,2) print(f'BMI數值為:{bmi:.2f}') who , dom = "", "" # WHO標準 if bmi < 18.5: who = "偏瘦" elif bmi < 25: who ="正常" elif bmi <30: who = "偏胖" else: who = "肥胖" #我國衛生部標準 if bmi < 18.5: dom = "偏瘦" elif bmi < 24: dom ="正常" elif bmi <28: dom = "偏胖" else: dom = "肥胖" print(f'BMI指標為: 國際{who},國內{dom}')
迴圈結構
遍歷迴圈 for
for <迴圈變數> in <遍歷結構> : <語句塊>
遍歷結構可以是字串,檔案,組合資料型別或range()函式等,常見的使用方式如下:
迴圈N次 for i in range(N): <語句塊>
遍歷檔案fi的每一行 for line in fi: <語句塊>
遍歷字串s for c in s: <語句塊>
遍歷列表ls for item in ls: <語句塊>
迴圈遍歷還有一種擴充套件模式
for <迴圈變數> in <遍歷結構>:
<語句塊1>
else:
<語句2>
在這種擴充套件模式中,當for迴圈正常執行之後,程式會繼續執行else語句中的內容。else語句只在迴圈征程執行並結束才執行。
for s in "BAT":
print("迴圈執行中"+s)
else:
s ="迴圈正常結束"
print(s)
無限迴圈 while
while <條件> :
<語句塊>
擴充套件方式
while <條件> :
<語句塊1>
else:
<語句塊2>
s , idx = "BAT" ,0
while idx < len(s):
print("迴圈進行中:"+s[idx])
idx += 1
else:
s = "迴圈正常結束"
print(s)
迴圈保留字 break 和 continue
break 跳出當前層次迴圈,結束整個迴圈過程,不再判斷執行迴圈的條件是否成立。
continue 用來結束當前當次迴圈,即跳出迴圈體下面尚未執行的語句,但不跳出當前迴圈,只結束本次迴圈,而不終止整個迴圈的執行。
for s in "PYTHON":
if s=="T":
continue
print(s,end='')
for s in "PYTHON":
if s=="T":
break
print(s,end='')
for迴圈和while迴圈中都存在一個else擴充套件用法。else中的語句只在一種條件下執行,即迴圈正常遍歷了所有內容或由於條件不成立二結束迴圈,沒有因為break或return而退出。continue保留字對else沒有影響。
for s in "PYTHON":
if s == "T":
continue
print(s,end='')
else:
print("正常退出")
for s in "PYTHON":
if s == "T":
break
print(s,end='')
else:
print("正常退出")
模組2:random庫的使用
概述
random庫次用梅森旋轉演算法(Mersenne Twister)生成偽隨機序列,可用於除隨機性要求更高的加解密演算法之外的大多數工程應用。
random 庫常用的隨機函式 共9個
函式 | 描述 |
---|---|
seed(a=None) | 初始化隨機數種子 |
random(m) | 生成一個【0.0,1.0】之間的隨機小數 |
randint(a,b) | 生成一個【a,b]之間的整數 |
getrandbits(k) | 生成一個k位元長度的隨機整數 |
randrange(start,stop,[,step]) | 生成一個【start,stop]之間以step為步數的隨機整數 |
uniform(a,b) | 生成一個【a,b]之間的隨機小數 |
choice(seq) | 從序列型別,例如列表中隨機返回一個元素 |
shuffle(seq) | 將序列型別中的元素隨機排列,返回打亂後的序列 |
sample(pop,k) | 從pop型別中隨機選取k個元素,以列表型別返回 |
生成隨機數鍾子之前可以通過seed()函式指定隨機數種子,隨機數種子1一般是一個整數,只要種子相同,每次生成的隨機數序列也相同。
思考與練習
4.18 從randon庫中選取相應的函式滿足下列條件。
1 隨機生成100以內的10個整數
2 隨機選取0到100間的奇數
3 從字串‘abcdefghij’中隨機選取4個字元
4 隨機選取列表[‘apple’,’pear’,’peach’,’orange’]中的一個字串
from random import *
print(sample(range(100),10))
while(1):
a=randint(0,100)
if a %2 == 1 :
print(a)
break
print(sample('abcdefghij',4))
print(choice(['apple','pear','peach','orange']))
例項6: \(\pi\)的計算
蒙特卡洛方法,又稱隨機抽樣統計試驗方法。當所要求解的問題是某種事件出現的概率,或者是某個隨機變數的期望值時,它們可以通過某種‘試驗’的方法,得到這種事件發生的頻率,或者這個隨機變數的平均值,並用它們作為問題的解。這就是蒙特卡羅法的基本思想。
蒙特卡洛求\(\pi\)的就是隨機向單位正方形和圓中泡隨機點,計算每個點到圓心的距離從而判斷該店在園內或者圓外,用圓內的點數除以總點數就是\(\pi\)值。隨機點數量越大,越充分覆蓋整個圓形,計算得到的\(\pi\)值越精確。這個方法的思想是利用離散點值表示圖形的面積,通過面積比例來求解\(\pi\)值。
IPO描述:
輸入:拋點數
處理:計算每個點到圓心的距離,統計在圓心點的數量
輸出:\(\pi\)值
程式碼:
# 示例程式碼 6.1 蒙特卡洛計算pi from random import random from math import sqrt from time import clock DARTS =10000 hits = 0.0 clock() for i in range(1,DARTS+1): x ,y = random() , random() dist = sqrt(x**2 + y**2) if dist <= 1.0: hits = hits + 1 pi = 4 * (hits / DARTS) print(f'Pi值是{pi}') print(f'執行時間是:{clock():5.5} s')
異常處理
try-except
num=eval(input("請輸入一個整數: "))
print(num)
Python異常資訊含義說明
Python 使用· try -except語句實現異常,其基本語法格式如下
try:
<語句塊1>
except <異常型別>:
<語句塊2>
程式碼改進
try:
num=eval(input("請輸入一個整數: "))
print(num)
except NameError:
print("輸入錯誤,請輸入一個整數")
try except else finally
try - except 語句支援多個except語句,其語法格式如下
try:
<語句塊1>
except <異常型別1>:
<語句塊2>
。。。
except <異常型別N> :
<語句塊N+1>
except:
<語句塊N+2>
其中,第一個到第N個except語句後面都指定了異常型別,說明這些except所包含的語句塊只處理這些型別的異常。最後一個except沒有指定任何型別,表示它對應的語句塊可以處理所有其他異常。
異常語句還可以與else和finally配合使用,語法格式如下
try:
<語句塊1>
except <異常型別1>:
<語句塊2>
else :
<語句塊3>
finally:
<語句塊4>
此處的else語句與for迴圈和while迴圈中的else一樣,當try中的語句塊正常執行結束且沒有發生異常時,else中的語句塊3執行,可以看作是對try語句塊正常執行後的一種追加處理。finnally語句塊,無論try語句塊1是否發生異常都會執行,可以將程式執行語句塊1的一些收尾工作放在這裡,例如,關閉檔案等。
程式練習題
4.1 猜數遊戲 。從程式中預設一個0~9之間的整數,讓使用者輸入所猜的數字,如果大於預設的數字,顯示“遺憾,太大了”;小於預設的數,顯示”遺憾,太小了“,如此迴圈,直至猜中該數字,顯示“預測N次,你猜中了!”,其中N是使用者輸入數字的次數。
from random import *
result = randint(0,9)
count=0
while(1):
temp = eval(input("請輸入數字"))
count = count+1
if (temp<result):
print("遺憾,太小了")
elif (temp>result):
print("遺憾,太大了")
else:
print(f'預測{count}次,你猜中了!')
break
4.2 統計不同字元個數。使用者從鍵盤輸入一行字元,編寫一個·程式,統計並輸出其中英文字元、數字、空格和其他字元的個數。
#統計不同字元
stri = input("請輸入字串:")
kong = 0
alpha = 0
chi = 0
num = 0
other = 0
for i in stri:
if ( i == " " ):
kong = kong+1
elif ('0' <= i <='9'):
num = num+1
elif (i >= u'\u4e00' and i<= u'\u9fa5'):
chi = chi+1
elif True == i.isalpha():
alpha = alpha+1
else:
other=other+1
print(f'請輸入的字串中有{kong}個空格,{num}個數字,{chi}箇中文,{alpha}個英文字元,{other}個其他字元')
4.3 最大公約數計算。從鍵盤接受兩個整數,程式設計求這兩個整數的最大公約數和最小公倍數.(提示最大公因數可以用輾轉相除法,求最小公倍數則用兩個數的乘積除以最大公約數即可。)
#最大公約數 最小公倍數
a,b=eval(input("請輸入兩個整數,中間用,隔開:"))
c=a*b
if a<b:
a,b=b,a
while False == (a in[0,1]):
b,a=a,b%a
c=c/b
print(f'最大公約數為:{b},最小公倍數為:{c}')
4.4 猜數字遊戲。改編4.1 ,隨機數範圍改為0-100.
#猜數遊戲 0-100整數
from random import *
result = randint(0,100)
count=0
while(1):
try:
temp = eval(input("請輸入數字"))
count = count+1
if (temp<result):
print("遺憾,太小了")
elif (temp>result):
print("遺憾,太大了")
else:
print(f'預測{count}次,你猜中了!')
break
except:
print("輸入有誤!")
4.5 猜數遊戲續。當用戶輸入不是整數時,給出“輸入內容必須是整數”的提示,並讓使用者重新輸入。
#猜數遊戲 0-100整數
from random import *
result = randint(0,100)
count=0
tim = 0
while(1):
try:
temp = eval(input("請輸入數字"))
count = count+1
if (temp<result):
print("遺憾,太小了")
elif (temp>result):
print("遺憾,太大了")
else:
print(f'預測{count}次,你猜中了!')
break
except:
print("輸入有誤!")
4.6 羊車門問題。有3扇關閉的門,一扇門後停著汽車,其餘門後面是山羊,只有主持人知道每扇門後面是什麼。參賽者可以選擇一扇門,在開啟它之前,支援人會開啟另一扇門,露出後面的山羊,然後允許參賽者更換自己的選擇。請問:參賽者更換選擇後能否增加猜中汽車的機會?——這是一個經典問題。
請使用random庫對這個隨機事件進行預測,分別輸出參賽者改變選擇和堅持選擇獲勝的機率。
import random
times = eval(input("請輸入你希望模擬的次數: "))
pick_first_n = 0
pick_change_n = 0
for i in range(times):
car = random.randint(0, 2) #生成哪個門後藏車
pick_first = random.randint(0, 2) #初始隨機選一個
if pick_first == car: #如果直接選中,則初始選擇正確,pick_first_n 加 1,換選擇一定不中
pick_first_n += 1
else: #如果初始選擇沒中,則主持人開啟另一扇沒車的門後,換選擇一定中
pick_change_n += 1 #故 pick_change_n 加 1
pick_first_percent = pick_first_n / times #計算堅持不換選擇的勝率
pick_change_percent = pick_change_n / times #計算換選擇的勝率
print(f'如果堅持初選,勝率為{pick_first_percent *100:.2f}%')
print(f'如果改變初選,勝率為{pick_change_percent *100:.2f}%')
4.7 使用異常處理改造例項1,使其能夠接受並處理使用者的任何輸入。
TempStr = input('請輸入帶有符號的溫度值: ')
if TempStr[-1] in ['F','f']:
try:
C = (eval(TempStr[:-1]) - 32)/1.8
print('轉換後的溫度是{:.2f}C'.format(C))
except:
print('您輸入的溫度格式有誤! ')
elif TempStr[-1] in ['C','c']:
try:
F = 1.8 * (eval(TempStr[:-1])) + 32
print('轉換後的溫度是{:.2f}F'.format(F))
except:
print('您輸入的溫度格式有誤! ')
else:
print('您輸入的溫度格式有誤! ')
Python123程式練習題
#6922 整數的加減和
編寫程式計算如下數列的值:
1-2+3-4...966
其中,所有數字為整數,從1開始遞增,奇數為正,偶數為負
s = 0 count = 1 while count <=966: if count%2 == 0: s -= count else: s += count count += 1 print(s)
#6938 水仙花數
"水仙花數"是指一個三位整數,其各位數字的3次方和等於該數本身。
例如:ABC是一個"3位水仙花數",則:A的3次方+B的3次方+C的3次方 = ABC。
請按照從小到大的順序輸出所有的3位水仙花數,請用"逗號"分隔輸出結果。
s = "" for i in range(100, 1000): t = str(i) if pow(eval(t[0]),3) + pow(eval(t[1]),3) + pow(eval(t[2]),3) == i : s += f'{i},' #s += "{},".format(i) print(s[:-1])
#6913 使用者登入的三次機會
給使用者三次輸入使用者名稱和密碼的機會,要求如下:
1)如輸入第一行輸入使用者名稱為‘Kate’,第二行輸入密碼為‘666666’,輸出‘登入成功!’,退出程式;
2)當一共有3次輸入使用者名稱或密碼不正確輸出“3次使用者名稱或者密碼均有誤!退出程式。”。
count = 0 while count < 3: name = input() password = input() if name == 'Kate'and password == '666666': print("登入成功!") break else: count += 1 if count == 3: print("3次使用者名稱或者密碼均有誤!退出程式。")
Python123測試題
#6912 四位玫瑰數
描述
四位玫瑰數是4位數的自冪數。自冪數是指一個 n 位數,它的每個位上的數字的 n 次冪之和等於它本身。
例如:當n為3時,有1^3 + 5^3 + 3^3 = 153,153即是n為3時的一個自冪數,3位數的自冪數被稱為水仙花數。
請輸出所有4位數的四位玫瑰數,按照從小到大順序,每個數字一行。
s = "" for i in range(1000, 10000): t = str(i) if pow(eval(t[0]),4) + pow(eval(t[1]),4) + pow(eval(t[2]),4) + pow(eval(t[3]),4) == i : print(i)
#5158 100以內素數之和
描述
求100以內所有素數之和並輸出。
素數指從大於1,且僅能被1和自己整除的整數。
提示:可以逐一判斷100以內每個數是否為素數,然後求和。
#Prime def is_prime(n): for i in range(2,n): if n%i == 0: return False return True sum = 0 for i in range(2,100): if is_prime(i): sum += i print(sum)