python例題十講
李立宗
2021年10月16日 版本V1.0
文章目錄
- python例題十講
- 題目1:分組示例
- 分組思路
- 知識點1:随機數
- 知識點2:結構(循環、分支)
- 主程式
- 改進1
- 改進2
- 題目2:票價示例
- 知識點1:輸入
- 知識點2:多分支結構
- 主程式
- 題目3:身高與票價
- 知識點1:輸入控制
- 知識點2:多分支結構
- 主程式:範例1
- 主程式:範例2
- 題目4:猴子吃桃
- 問題分析
- 主程式
- 改進1:使用一個變量。
- 改進2:輸出控制
- 題目5:使用者登入
- 知識點1:循環
- 知識點2: break
- 知識點3:與或關系
- 主程式
- 題目6:九九乘法表
- 知識點1:輸出資料控制在同一行
- 知識點2:嵌套循環
- 知識點3:嵌套循環内運算
- 知識點4:嵌套循環次數控制
- 主程式
- 改進:格式控制
- 題目7:平均身高
- 知識點1:循環控制
- 知識點2:求和
- 主程式
- 改進:增加說明
- 題目8:猜數字遊戲
- 題目9:數值各位和
- 主程式
- 拓展:不同方式計算十位值
- 題目10:半徑和直徑互換
- 【例16.1.1】随機生成一個1到10之間的随機數。
# 例16.1.1.py import random x = random.randint(1, 10) print(x)
輸出結果:
一個1到10之間的随機數。
知識點2:結構(循環、分支)
循環結構:for-in循環結構
選擇結構:if分支結構
主程式
輸出結果:# 例16.1.2.py import random x = [0, 0] for i in range(100): a = random.randint(1, 2) if a == 1: x[0] = x[0] + 1 else: x[1] = x[1] + 1 print("第1組人數:", x[0]) print("第2組人數:", x[1])
每次運作的輸出不一樣,因為分組是根據随機值劃分的。第1組人數: 54 第2組人數: 46
改進1
将生成的數按照大小進行分組。
輸出結果:# 例16.1.3.py import random x = [0, 0] for i in range(100): a = random.randint(0, 100) if a > 50: x[0] = x[0] + 1 else: x[1] = x[1] + 1 print("第1組人數:", x[0]) print("第2組人數:", x[1])
上述是某次運算結果,由于是随機,每次情況略有不同,但是兩組值會大體相當。第1組人數: 52 第2組人數: 48
改進2
将生成的數按照奇數、偶數, 進行分組。
輸出結果:# 例16.1.4.py import random x = [0, 0] for i in range(100): a = random.randint(0, 100) if a % 2 == 0: x[0] = x[0] + 1 else: x[1] = x[1] + 1 print("第1組人數:", x[0]) print("第2組人數:", x[1])
第1組人數: 47 第2組人數: 53
題目2:票價示例
某公園,票價政策為:60歲及以上老人半價50元、成年人100元、未成年人免費。
需要有歸納能力,進一步歸納如下:
* >= 60:半價 * [18,60):正常票價 * <18:免費
知識點1:輸入
input:讀取鍵盤的輸入
int:鍵盤讀取的内容是字元串,需要使用int将其轉換為數值類型
【例16.2.1】輸入一個數值,觀察其在作為字元串與數值時的不同處理結果。
輸出# 例16.2.1.py x = input("請輸入一個數值:") print(x + "5") print(int(x) + 5)
請輸入一個數值:10 105 15
知識點2:多分支結構
多分支:包含if…elif…else的分支結構
具體結構:
if 條件A: 語句A elif 條件B: 語句B else:
條件B是在條件A不成立的情況下發生的。
例如,如下的語句"elif x>50"是在“if x>60"不成立的情況下發生的。
是以,“elif x>50"對應的值範圍是“在50到60之間(不包含50,包含60)”,即(50,60]。
# 例16.2.2.py import random x = random.randint(0, 100) print("x=", x) if x > 60: print("x>60") elif x > 50: print("x在50到60之間(不包含50,包含60)") else: print("x<=50")
主程式
輸出:# 例16.2.3.py x = int(input("請輸入您的年齡:")) print("您輸入的年齡是:", x) if x >= 60: price = 50 elif x >= 18: price = 100 else: price = 0 print("您支付的票價為:", price)
上述程式,在輸入不同年齡時,會對應不同的輸出結果。
題目3:身高與票價
某公園規定:随同成人入園身高1.2~1.5米的兒童,應當購買兒童票;超過1.5米時應買全價票。每一成人遊客可免費攜帶一名身高不足1.2米的兒童。
簡單來說:歸納如下:
或者,歸納如下:* >1.5:全價票 * [1.2,1.5]:兒童票 * <1.2:免費
* <1.2:免費 * [1.2,1.5]:兒童票 * >1.5:全價票
知識點1:輸入控制
input:讀取鍵盤的輸入
int:鍵盤讀取的内容是字元串,需要使用int将其轉換為數值類型【針對整數】
float:鍵盤讀取的内容是字元串,需要使用float将其轉換為數值類型【針對小數】
【例16.3.1】輸入一個數值,觀察其在作為字元串與數值時的不同處理結果。
輸出# 例16.3.1.py x = input("請輸入一個數值:") print(x + "5") # print(int(x) + 5) #如果x是小數,會發生錯誤 print(float(x) + 5)
請輸入一個數值:1.2 1.25 6.2
知識點2:多分支結構
多分支結構:包含if…elif…else的分支結構主程式:範例1
- >1.5:全價票
- [1.2,1.5]:兒童票
- <1.2:免費
輸出:# 例16.3.2.py h = float(input("請輸入您的身高:")) print("您輸入的身高是:", h) if h > 1.5: price = "全價票" elif h >= 1.2: price = "半價票" else: price = "免票" print("您支付的票價為:", price)
上述程式,在輸入不同身高時,會對應不同的輸出結果。
主程式:範例2
- <1.2:免費
- [1.2,1.5]:兒童票
- >1.5:全價票
輸出:# 例16.3.3.py h = float(input("請輸入您的身高:")) print("您輸入的身高是:", h) if h < 1.2: price = "免票" elif h <= 1.5: price = "半價票" else: price = "全價票" print("您支付的票價為:", price)
上述程式,在輸入不同年齡時,會對應不同的輸出結果。
題目4:猴子吃桃
猴子第1天摘下若幹桃子,當即吃了一半,還不過瘾,就又多吃了一個。第2天早上,将剩下的桃子吃掉一半後,又多吃了一個。以後,每天早上都吃前一天剩下的一半加一個。到第10天早上想再吃時,發現隻剩下一個桃子了。求第1天共摘了多少。問題分析
已知第10天(day10),則第9天(day9),存在如下關系:
實際上,依次類推往前推,每一天都是後一天加上1後的2倍。具體為:
也就是說,從第10天開始,依次往前推,每一天都是按照上述公式處理。
是以,可以使用循環【for i in range(9, 0, -1)】實作。
主程式
【例16.4.1】根據邏輯關系計算桃子的數量。
定義變量:today、yesterday分别表示今天的桃子數量、昨天的桃子數量。
循環:從目前第10天開始,計算第9天的桃子數量。依次循環。
# 例16.4.1.py today = 1 for i in range(9, 0, -1): yesterday = (today + 1) * 2 today = yesterday print('第1天共摘了%s個桃子' % yesterday)
【例16.4.2】顯示每天的桃子的數量。
使用print語句顯示每天的桃子數量。
當然,我們平時看到的程式,可能變量的定義比較随意。例如,可能為:# 例16.4.2.py today = 1 print('第10天吃之前:有1個桃子') for i in range(9, 0, -1): yesterday = (today + 1) * 2 today = yesterday print('第', i, '天吃之前', '有', yesterday, '個桃子') print('第1天共摘了%s個桃子' % yesterday)
# 構造變量x2/x1 x2 = 1 print('第10天吃之前:有1個桃子') for i in range(9, 0, -1): x1 = (x2 + 1) * 2 x2 = x1 print('第', i, '天吃之前', '有', x1, '個桃子') print('第1天共摘了%s個桃子' % x1)
改進1:使用一個變量。
不需要構造兩個變量,僅僅使用一個變量更替實作即可。
具體為:
程式如下:peach = (peach + 1) * 2
# 例16.4.3.py peach = 1 print('第10天吃之前:1個桃子') for i in range(9, 0, -1): peach = (peach + 1) * 2 print('第', i, '天吃之前', '有', peach, '個桃子') print('第1天共摘了%s個桃子' % peach)
改進2:輸出控制
使用%控制輸出%d:格式化輸出一個整數;
%f:格式化輸出浮點數;
%s:格式化輸出字元串;
輸出結果為:a = 666 print("數值%d表示非常有趣?" % a)
數值666表示非常有趣?
更具體來說:%4d:其中的4表示占位長度,占4位,不足在前面補空格;超過4位,全部顯示。
%4.2f:數值4表示總長度、2表示2個小數位;
%8s:輸出8位字元,不足時前面補空格、超過8位,全部顯示;
輸出結果:# 例16.4.4.py peach = 1 print('第10天吃之前:1個桃子') for i in range(9, 0, -1): peach = (peach + 1) * 2 print('第%2d天吃之前:有%4d個桃子' % (i, peach)) print('第1天共摘了%s個桃子' % peach)
可以看到輸出中對輸出的資料寬度進行了控制。第10天吃之前:1個桃子 第 9天吃之前:有 4個桃子 第 8天吃之前:有 10個桃子 第 7天吃之前:有 22個桃子 第 6天吃之前:有 46個桃子 第 5天吃之前:有 94個桃子 第 4天吃之前:有 190個桃子 第 3天吃之前:有 382個桃子 第 2天吃之前:有 766個桃子 第 1天吃之前:有1534個桃子 第1天共摘了1534個桃子
題目5:使用者登入
某考試系統,使用者名為“李立宗”,密碼為“13602153866”。在使用者輸入正确的使用者名和密碼後,顯示登陸成功;否則,顯示“登入顯示”。使用者有三次試錯機會。知識點1:循環
使用者具有三次機會,依靠循環實作。for i in range(3)
這是典型的循環結構,通過控制range(N)中值N來控制循環的次數。
輸出結果為:# 例16.5.1.py for i in range(3): print("你好")
你好
你好
你好
你好
你好
知識點2: break
關鍵字break,用于退出循環。
通常情況下,在某個特定條件下,退出循環。
輸出結果為:# 例16.5.2.py for i in range(3): if i == 2: break print(i)
1
當使用者輸入正确的使用者名和密碼後,不再需要循環了,要退出循環。知識點3:與或關系
與關系:and。兩個條件同時成立,結果為真。類似于串聯電路。
或關系:or。兩個條件,有一個成立,結果為真。類似于并聯電路。
與或關系具體示意圖如下:
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-ckndP48d-1634395880549)(…/typora/image-20211016113042200.png)]
【例16.5.3】當使用者名和密碼都正确時、輸出“登陸成功”;否則,輸出“使用者名或密碼錯誤”。
【例16.5.4】當年齡大于60歲,或者小于18歲,免門票;否則,購買全價票。# 例16.5.3.py name = input("請輸入使用者名:") password = input("請輸入密碼:") if name == "lilizong" and password == "13602153866": print("登陸成功") else: print("使用者名或密碼錯誤")
# 例16.5.4.py age = int(input("請輸入年齡:")) if age > 60 or age < 18: print("免門票") else: print("請購買全價票")
主程式
主程式如下:# 例16.5.5.py for i in range(3): name = input("請輸入使用者名:") password = input("請輸入密碼:") if name == "lilizong" and password == "13602153866": print("登陸成功") break else: print("使用者名或密碼錯誤")
題目6:九九乘法表
輸入如下所示的九九乘法表。1*1= 1 2*1= 2 2*2= 4 3*1= 3 3*2= 6 3*3= 9 4*1= 4 4*2= 8 4*3=12 4*4=16 5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25 6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
知識點1:輸出資料控制在同一行
将循環資料輸出在同一行,采用【end=” “】控制每次輸出不要換行,而是在輸出結果加上空格。
程式輸出如下:# 例16.6.1.py for i in range(1, 10): print(i, end=" ") print()
1 2 3 4 5 6 7 8 9
需要注意,最後的【print()】表示在輸出完所有的數值後,加一個換行。知識點2:嵌套循環
嵌套循環是在循環裡面嵌入循環。将内層循環看成一個獨立的整體,更利于了解嵌套循環。
例如,将下面的【例16.6.1.py】内的代碼看為一個整體,則可以将【在同一行輸出1到9】作為一個整體。
将上述代碼,用在一個循環體内,可以将上述代碼執行指定的次數。
程式輸出如下:# 例16.6.2.py for j in range(1, 10): for i in range(1, 10): print(i, end=" ") print()
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
**改進1:**将每一行乘以行号:第1行乘以1,第2行乘以2,以此類推。實際上每一行乘以j的值;
**改進2:**控制每一行輸出的數值個數,第1行輸出1個數值,第2行輸出2個數值,以此類推。實際上,每行輸出的個數是j個值。
知識點3:嵌套循環内運算
**改進1:**将每一行乘以行号:第1行乘以1,第2行乘以2,以此類推。實際上每一行乘以j的值;
程式輸出如下:# 例16.6.3.py for j in range(1, 10): for i in range(1, 10): print(i * j, end=" ") print()
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
知識點4:嵌套循環次數控制
**改進2:**控制每一行輸出的數值個數,第1行輸出1個數值,第2行輸出2個數值,以此類推。實際上,每行輸出的個數是j個值。
程式輸出如下:# 例16.6.4.py for j in range(1, 10): for i in range(1, j+1): print(i * j, end=" ") print()
1
2 4
3 6 9
4 8 12 16
5 10 15 20 25
6 12 18 24 30 36
7 14 21 28 35 42 49
8 16 24 32 40 48 56 64
9 18 27 36 45 54 63 72 81
主程式
将乘數加上,結果如下:
輸出結果如下:# 例16.6.5.py for i in range(1, 10): for j in range(1, i + 1): print(i, '*', j, '=', i * j, end=" ") print()
1 * 1 = 1
2 * 1 = 2 2 * 2 = 4
3 * 1 = 3 3 * 2 = 6 3 * 3 = 9
4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16
5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25
6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36
7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49
8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64
9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81
改進:格式控制
通過格式控制符控制輸出的格式:
輸出結果如下:# 例16.6.6.py for i in range(1, 10): for j in range(1, i + 1): print("%d*%d=%-2d" % (i, j, i * j), end=" ") print()
1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
題目7:平均身高
編寫一個程式,能夠測量本組同學的平均身高。知識點1:循環控制
要點1:控制次數。通過讀取一個資料n,将n作為控制循環的次數。
要點2:顯示目前的次數。實作起來包含兩點:
要點2.1:使用str(i+1),将數值轉換為字元串,友善後續運算。數值無法與字元串直接運算。
要點2.2:使用加号“+”完成字元串的連接配接。例如:【“第”+str(i+1)+“次讀取資料”】
輸出結果如下:# 例16.7.1.py s = 0 n = int(input("本組同學個數:\n")) for i in range(n): print("第"+str(i+1)+"次讀取資料")
本組同學個數:
3
第1次讀取資料
第2次讀取資料
第3次讀取資料
知識點2:求和
想象有三堆豆子,第1堆有1個,第2堆有2個,第3堆有3個。
拿一個空盒子,分别把豆子裝進盒子裡。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-U9zvjxNB-1634395880555)(…/typora/image-20211016140726080.png)]
步驟1:在第1堆豆子旁,把第1堆裡面的一粒豆子,放進盒子。
盒子(新值) = 盒子(原有值) + 1
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-zGYe75Cl-1634395880557)(…/typora/image-20211016140747332.png)]
步驟2:在第2堆豆子旁,把第2堆裡面的2粒豆子,放進盒子。
盒子(新值) = 盒子(原有值) + 2
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-zcra0bUy-1634395880559)(…/typora/image-20211016140759031.png)]
步驟3:在第3堆豆子旁,把第3堆裡面的3粒豆子,放進盒子。
盒子(新值) = 盒子(原有值) + 3
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-vlzOZlZD-1634395880560)(…/typora/image-20211016140814211.png)]
【例16.7.2】設計一個程式,計算1到數值N的和。
程式輸出如下:# 例16.7.2.py # 計算1到N的和。 s = 0 n = int(input("要加到幾:\n")) for i in range(n+1): s += i print("和為:", s)
要加到幾:
5
和為: 15
程式輸出如下:# 例16.7.3.py # 計算指定個數的數值和。 s = 0 n = int(input("要計算幾個數:\n")) for i in range(n): a = float(input('請輸入一個數值:')) s += a print("和為:", s)
要計算幾個數:
3
請輸入一個數值:6
請輸入一個數值:9
請輸入一個數值:8
和為: 23.0
主程式
程式輸出如下:# 例16.7.4.py s = 0 n = int(input("本組同學個數:\n")) for i in range(n): h = float(input('請輸入身高值:')) s += h average = s / n print("本組同學的平均身高值為:%.2f" % average)
本組同學個數: 3 請輸入身高值:1.81 請輸入身高值:1.65 請輸入身高值:1.72 本組同學的平均身高值為:1.73
改進:增加說明
增加輸入提示說明
程式輸出結果如下:# 例16.7.5.py s = 0 n = int(input("本組同學個數:\n")) for i in range(n): h = float(input('請輸入第' + str(i+1) + '個同學的身高:')) s += h average = s / n print("本組同學的平均身高值為:%.2f" % average)
本組同學個數:
3
請輸入第1個同學的身高:1.81
請輸入第2個同學的身高:1.62
請輸入第3個同學的身高:1.78
本組同學的平均身高值為:1.74
題目8:猜數字遊戲
設計一個猜數字遊戲。計算機随機生成一個數字,使用者猜測該數字值。計算機針對使用者的猜測結果報告“比這個數值小”,或者“比這個數值大”;直到使用者猜對了,提示“完全正确”。# 例16.8.py import random guess = 0 result = random.randint(0, 100) time = 0 while guess != result: time += 1 guess = int(input('請輸入您的猜測值(0-100之間的整數):')) if guess > result: print('您的猜測比答案大') elif guess < result: print('您的猜測比答案小') else: print('預測' + str(time) + '次,你猜中了!') break
題目9:數值各位和
随機生成一個三位數,計算其各個位上數值的和。
例如,數值168其各位和為“1+6+8=15”。
計算個位:使用求餘數“%”,計算得到。例如,168%10=8
計算十位:使用求整除“//”和求餘數“%”,計算得到。例如,首先計算“168//10=16”,接下來計算“16%10=6”。
計算百位:使用整除“//”,計算得到。例如,168//100=1
主程式
輸出結果:# 例16.9.1.py import random x = random.randint(100, 999) # randint(a,b)生成的數值包含a也包含b gewei = x % 10 shiwei = x // 10 % 10 baiwei = x // 100 sum = gewei + shiwei + baiwei print("随機數為:%d,其各個位上和為:%d" % (x, sum))
随機數為:339,其各個位上和為:15
拓展:不同方式計算十位值
計算十位,有兩種不同的方式:
方式1:先取到前兩位,再取最低位。例如,【168//10=16,16%10=6】。
方式2:先取到後兩位,再取最高位。例如,【168%100=68,68//10=6】。
# 例16.9.2.py import random x = random.randint(100, 999) # randint(a,b)生成的數值包含a也包含b x1 = x // 10 % 10 x2 = x % 100 // 10 print("随機數為:", x) print("使用方式1,其十位值為:", x1) print("使用方式2,其十位值為:", x2)
題目10:半徑和直徑互換
設計一個程式, 當輸入一個半徑值時,輸出對應的直徑值;當輸入一個直徑值時,輸出對應的半徑值。知識點1:eval(232, 232, 232); background: rgb(249, 249, 249);">
# 例16.10.1.py x = input('請輸入長度值:') y = eval(x) print(x + "5.3") print(y + 5)
輸出結果如下:
請輸入長度值:1.1
1.15.3
6.1
知識點2:成員運算符
關鍵字in:
in:某個元素在集合内。例如:
# 例16.10.2.py
print("張三" in ["張三", "李四", "王五"]) #結果為:True
print("趙六" in ["張三", "李四", "王五"]) #結果為:False
關鍵字not in:
not in:某個元素不在集合内。例如:
# 例16.10.2.py
print("張三" not in ["張三", "李四", "王五"]) # 結果為False
print("趙六" not in ["張三", "李四", "王五"]) # 結果為True
主程式
# 例16.10.2.py
value = eval(input('請輸入長度值:'))
x = input('請輸入值的含義(r或d):')
if x in ['r', 'R', '半徑']:
d = value * 2
print('該半徑所對應的直徑值為:', d)
elif x in ['d', 'D', '直徑']:
r = value / 2
print('該直徑所對應的半徑值為:', r)
else:
print('輸入錯誤!')
輸入直徑值時,輸出結果如下:
請輸入長度值:10.2
請輸入值的含義(r或d):d
該直徑所對應的半徑值為: 5.1
輸入半徑值時,輸出結果如下:
請輸入長度值:2.5
請輸入值的含義(r或d):r
該半徑所對應的直徑值為: 5.0
說明
本版本為 1.0,完成于2021年10月6日。
嚴正聲明:本書可免費用于學習和研究目的,可自由傳播,但切勿擅自用 于商業用途或私自引用,筆者保留著作權相關權利。