1. 程式人生 > 實用技巧 >Python語言程式設計基礎——4 程式的控制結構

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)