Python語言程序設計基礎
第二章 Python程序示例解析
部分截圖來自 北京理工大學 嵩天 的python基礎設計課程的ppt,僅做個人筆記使用,特此聲明。
編程解決問題的步驟
- 分析問題:分析問題的計算部分,想清楚
- 划分邊界:划分問題的功能邊界,規划IPO
- 設計算法:設計問題的求解算法,關注算法
- 編寫程序:編寫問題的計算程序,編程序
- 調試測試:調試程序使正確運行,運行調試
- 升級維護:適應問題的升級維護,更新完善
代碼示例1——溫度轉換
溫度轉換
需求
兩種溫度體系的轉換
攝氏度轉為華氏度
華氏度轉為攝氏度
問題分析
划分邊界
- 輸入:帶華氏或攝氏標志的溫度值
- 輸出:根據溫度標志選擇適當的溫度轉換算法
輸入輸出格式設置
標識放在溫度后面,F標識華氏度,C表示攝氏度
設計算法
\(C=(F-32)/1.8\)
\(F=C*1.8+32\)
代碼
#實例代碼1.1 溫度轉換 TempStr = input("請輸入帶有符號的溫度值") if TempStr[-1] in ['F','f']: C=(eval(TempStr[0:-1])-32)/1.8 print("轉換后的溫度是{:.2f}C".format(C)) elif TempStr[-1] in ['C','c']: F = 1.8*eval(TempStr[0:-1])+32 print("轉換后的溫度是{:.2f}F".format(F))
舉一反三
溫度數值與溫度標識之間關系的設計可以改變
標識放在溫度數值之前
TempStr = input("請輸入帶有符號的溫度值") if TempStr[0] in ['F','f']: C=(eval(TempStr[1:])-32)/1.8 print("轉換后的溫度是{:.2f}C".format(C)) elif TempStr[0] in ['C','c']: F = 1.8*eval(TempStr[1:])+32 print("轉換后的溫度是{:.2f}F".format(F))
貨幣轉換、長度轉換、重量轉換、面積轉換......
強縮進
python 與C++,java在代碼塊的划分是不一樣的,C++,java使用{}來區分代碼塊。而python使用縮進來區分代碼塊,增強了代碼的可讀性
注釋
- 單行注釋:單行注釋以#開頭
- 多行注釋:多行注釋以‘’’(3個單引號)開頭和結尾
命名與保留字
變量命名:
- python語言允許采用大寫字母,小寫字母、數字、下划線_ 和漢字等字符及其組合對變量進行命名。
- 但名字的首字母不能是數字,中間不能出現空格。
- 標識符對大小寫敏感
- 變量名不能與python的保留字相同
保留字
def | import | from | as |
---|---|---|---|
False | True | None | |
if | elif | else | async |
for | while | break | continue |
try | except | finally | return |
and | not | or | is |
assert | with | raise | in |
del | global | nonlocal | yiled |
pass | class | lambda | await |
字符串
-
創建,python中使用引號‘’創建字符串,不支持單字符類型,單字符在python中也是作為一個字符串來使用
-
訪問字符,python使用方括號[]來訪問字符串
- 正向遞增序號,最左側字符為0,向右遞增,最右側字符序號為L-1
- 反向遞減序號,最右側字符序號為-1,想做依次遞減,最左側字符序號為-L
-
區間訪問(切片),采用[N:M]格式,表示字符串從N到M(不包含M)的子字符串,其中,N和M為字符串的索引序號,可以混合使用正序和逆序序號
-
字符串連接 +
-
判斷字符串是否包含給定字符 in not in
-
格式化輸出 類似於C語言中的sprintf函數 %f 格式化浮點數字,可指定小數后的精度
列表 [ ]
列表是最常用的Python數據類型,它可以作為一個方括號內的逗號分隔值出現。列表的數據項不需要具有相同的類型。創建一個列表,只要把逗號分隔的不同的數據項使用方括號括起來即可。
分支
- 使用保留字 if elif else
- 每個保留字所在行最后存在一個冒號(😃,語法的一部分。冒號及后續縮進用來表示后續語句與條件的所屬關系
輸入輸出 input print
-
input():從控制台獲得用戶輸入的函數
-
print():以字符形式向控制台輸出結果的函數
eval()
eval(<字符串>) 能夠以Python表達式的方式解析並執行字符串,並將結果輸出。eval()函數將去掉字符串的兩個引號,將其解釋為一個變量。
作用:
-
處理數字
單引號、雙引號,eval()函數都能將其解釋為int類型;三引號解析為str類型。
-
處理字符串類型的字符串
對於eval()括號中的字符串(非數字),如果字符串帶的是雙引號或單引號都會引起NameError,這是因為eval()函數在處理字符串時會去掉兩個引號。正確應該使用一個單引號包含一個雙引號組成的三引號來包含字符串。
input 和 eval 結合使用
-
獲得用戶輸入的數字
value = eval ( input ( "請輸入數字:") )
-
獲得用戶輸入的字符串
Str = eval ( ' input ("請輸入字符串") ')
思考與練習
2.6 回聲程序
問題描述:
請用一行代碼·編寫一個回聲程序,將用戶輸入的內容直接打印出來
問題分析:
獲取用戶輸入:input函數;輸出:print函數
代碼:
print(input())
2.7 試想一下,為什么Python的命名不能以數字開頭
這是為了區分變量和常量。在變量命名可以以數字開頭的情況下,無法區分以下內容是定義的變量還是常量:01,2E10。這會在編譯的時候造成二義性。所以規定在命名變量的時候不能以數字開頭。
其實,編譯器或者解釋器都會有一個詞法分析器。詞法分析器在判斷一個單詞是否以數字開頭,如果是以數字開頭則把他當作數字常量處理,否則當作普通單詞處理。這樣子可以提高詞法分析器的效率
代碼示例2——Python蟒蛇繪制
#示例代碼2.1
import turtle
turtle.setup(650,350,200,200)
turtle.penup() #筆抬起
turtle.fd(-250)
turtle.pendown() #筆落下
turtle.pensize(25) #筆的寬度
turtle.pencolor("purple") #筆的顏色
turtle.seth(-40) #前進方向
for i in range(4):
turtle.circle(40,80)
turtle.circle(-40,80)
turtle.circle(40,80/2)
turtle.fd(40)
turtle.circle(16,180)
turtle.fd(40*2/3)
import
import引用函數庫
-
import < 庫名 >
此時,程序可以調用庫名中的所有函數,使用庫中函數的格式如下:
<庫名>.<函數名>(<函數參數>)
-
from <庫名> import <函數名,函數名,...,函數名>
from <庫名> import * *是通配符,表示所有函數
此時,調用該庫的函數時不再需要使用庫名,直接使用如下格式:
<函數名>(<函數參數>)
循環
-
while
while 判斷條件: 執行語句
-
for
for iterating_var in sequence: statements
range()函數
turtle庫
1.繪圖坐標體系
turtle庫繪制圖形有一個基本框架:一個小海龜在坐標系中爬行,其爬行軌跡形成了繪制圖形。
-
turtle.setup(width,height,startx,starty) : 設置主窗體的大小和位置
width:窗口的寬度,如果值是整數,表示像素值;如果值是小數,表示窗口寬度與屏幕比例
height:窗口的高度,如果值是整數,表示像素值;如果值是小數,表示窗口寬度與屏幕比例
startx:窗口左側與屏幕左側的像素距離,如果值是None,窗口位於屏幕水平中央
starty:窗口頂部與屏幕頂部的像素距離,如果值是None,窗口位於屏幕中央
turtle絕對坐標系
turtle空間坐標系
turtle 角度坐標系
絕對角度
海龜角度
2.畫筆控制函數
-
turtle.penup() 別名 turtle.up() :抬起畫筆,之后移動畫筆不繪制形狀
-
turtle.pendown() 別名 turtle.down(): 落下畫筆,之后移動畫筆將繪制形狀
-
turtle.pensize(width) 別名 turtle.width(): 設置畫筆寬度 ,當無參數時返回當前畫筆寬度
-
turtle.pencolor(colorstring) 或turtle.pencolor(r,g,b) : 設置畫筆顏色, 當無參數時返回當前畫筆顏色
參數 colorstring :表示顏色的字符串; (r,g,b):顏色對應的RGB顏色
3.形狀繪制函數
-
turtle.fd(distance) 別名 turtle.forward(distance) :向海龜當前行進distance距離
-
turtle.seth(to_angle) 別名 turtle.setheading(to_angle) :設置小海龜當前方向為to_angle,該角度是絕對方向角度值
-
turtle.circle(radius,extern=None) : 根據半徑radius繪制extent角度的弧形
參數 ,radius : 弧形半徑,值為正數,半徑在小海龜左側;當值為負數時,半徑在小海龜右側。
extern: 繪制弧形的角度,當不設置參數或參數設置為None,繪制整個圓形
函數的封裝
通過保留字def定義的函數是自定義函數。
思考與練習
2.8 請修改示例代碼2.1中第8行,將“purple”變為”violet” ,觀察程序運行結果的變化。
蟒蛇的顏色發生變化,但是我搜了一下,發現purple和violet在知乎上有着一個很好的回答
https://www.zhihu.com/question/21888107
代碼:
# 練習2.8 蟒蛇繪制 改變顏色 import turtle turtle.setup(650,350,200,200) turtle.penup() #筆抬起 turtle.fd(-250) turtle.pendown() #筆落下 turtle.pensize(25) #筆的寬度 turtle.pencolor("violet") #筆的顏色 turtle.seth(-40) #前進方向 for i in range(4): turtle.circle(40,80) turtle.circle(-40,80) turtle.circle(40,80/2) turtle.fd(40) turtle.circle(16,180) turtle.fd(40*2/3)
2.9 請修改示例代碼2.1中第10行代碼,將range(4)變為range(5),觀察程序運行結果的變化。
發現蟒蛇的身體相比原來長了一節
代碼:
# 練習2.9 蟒蛇繪制 改變蟒蛇長度 import turtle turtle.setup(650,350,200,200) turtle.penup() #筆抬起 turtle.fd(-250) turtle.pendown() #筆落下 turtle.pensize(25) #筆的寬度 turtle.pencolor("purple") #筆的顏色 turtle.seth(-40) #前進方向 for i in range(5): turtle.circle(40,80) turtle.circle(-40,80) turtle.circle(40,80/2) turtle.fd(40) turtle.circle(16,180) turtle.fd(40*2/3)
2.10 請球蓋示例代碼2.1中的第4行和第6行代碼,在兩行的最前面增加注釋符號,即將這兩行變成注釋語句,觀察程序結果的變化
海龜首先從原點繪制一條黑線到指定位置
# 練習2.10 蟒蛇繪制 改變海龜起落 import turtle turtle.setup(650,350,200,200) #turtle.penup() #筆抬起 turtle.fd(-250) #turtle.pendown() #筆落下 turtle.pensize(25) #筆的寬度 turtle.pencolor("purple") #筆的顏色 turtle.seth(-40) #前進方向 for i in range(4): turtle.circle(40,80) turtle.circle(-40,80) turtle.circle(40,80/2) turtle.fd(40) turtle.circle(16,180) turtle.fd(40*2/3)
2.11 請使用turtle庫中的turtle.fd()函數繪制一條直線
代碼:
# 練習2.11 繪制直線 import turtle turtle.fd(500)
2.12 請使用turtle庫中的turtle.circle()函數繪制一個完整的圓
問題分析:
turtle.circle(radius)函數繪制圓, radius為圓的半徑
代碼:
# 2.12 繪制完整的圓 import turtle turtle.circle(100)
2.13 請使用turtle庫函數繪制一個包含9個同心圓的靶盤
問題分析:
同心圓,圓心位置相同,圓的半徑不一樣,
代碼:
# 2.13 繪制同心圓 import turtle radius=10 turtle.circle(10) for i in range(1,10): turtle.penup() turtle.seth(-90) turtle.fd(10) radius+=10 turtle.seth(0) turtle.pendown() turtle.circle(radius)
程序練習題
2.1 實例1的修改。改造實例代碼1.1,采用eval(input(<提示內容>))替換現有的輸入部分,並使輸出的溫度值為整數
問題分析:
輸出結果不包含小數
代碼:
#練習2.1 示例1溫度轉換的修改 TempStr = eval('input("請輸入帶有符號的溫度值")') if TempStr[-1] in ['F','f']: C=(eval(TempStr[0:-1])-32)/1.8 print("轉換后的溫度是{:.0f}C".format(C)) elif TempStr[-1] in ['C','c']: F = 1.8*eval(TempStr[0:-1])+32 print("轉換后的溫度是{:.0f}F".format(F))
2.2 匯率兌換程序。按着溫度轉換程序的設計思路,編寫一個美元和人民幣的雙向兌換程序。
需求:
貨幣轉換,人民幣與美元之間的轉換
- 人民幣轉為美元
- 美元轉為人民幣
問題分析
划分邊界
- 輸入:帶美元符號或人民幣符號的數字
- 輸出:根據貨幣標志選擇適當的轉換算法
輸入輸出格式
使用貨幣的國際標准符號CNY ,USD
算法設計
1美元=6.6116人民幣
1人民幣=0.1512美元
代碼
#練習2.2 匯率兌換程序 MoneyStr = input("請輸入帶有符號的錢數:") #print(MoneyStr[-3:]) #print(MoneyStr[0:-3]) if MoneyStr[-3:] =='USD': C=eval(MoneyStr[0:-3])*6.6116 print("兌換{:.2f}人民幣CNY".format(C)) elif MoneyStr[-3:] =='CNY': U = eval(MoneyStr[0:-3])*0.1512 print("兌換{:.2f}美元USD".format(U))
2.3 實例2的修改。改造示例代碼2.1,繪制一條彩色蟒蛇,及在繪制Python蟒蛇的每個小段時,畫筆的繪制顏色會發生改變。提示:將畫筆顏色控制函數放在蟒蛇繪制函數附近。
設計:
把顏色改變的代碼放在繪制圖形的循環之中
顏色可以使用(r,g,b),改變r,g,b的數值就可以改變顏色。顏色可以根據循環變量i改變,也可以通過隨機數來改變。
也可以設置一個列表存放不同的color單詞,根據i從列表中選擇
代碼:
#練習2.3 示例2蟒蛇繪制 的修改 import turtle turtle.setup(650,350,200,200) turtle.penup() #筆抬起 turtle.fd(-250) turtle.pendown() #筆落下 turtle.pensize(25) #筆的寬度 turtle.seth(-40) #前進方向 for i in range(4): turtle.pencolor((255-i*40),(32+i*10),(100+i*24)) #筆的顏色 turtle.circle(40,80) turtle.circle(-40,80) turtle.circle(40,80/2) turtle.fd(40) turtle.circle(16,180) turtle.fd(40*2/3)
2.4 等邊三角形的繪制。使用turlte庫中的turtle.fd()函數和turtle.seth()函數繪制一個等邊三角形。
分析:等邊三角形的角度為60度,設置turtle相應的前進方向
代碼:
#練習2.4 繪制等邊三角形 import turtle turtle.fd(100) turtle.seth(120) turtle.fd(100) turtle.seth(240) turtle.fd(100)
反思:
turtle設置方向可以根據絕對坐標也可以根據相對坐標
import turtle for i in range(3): turtle.fd(100) turtle.left(120)
2.5 疊加三角形的繪制。使用turtle庫中的turtle.fd()函數和tuetle.seth()函數繪制一個疊加等邊三角形。
分析:疊加三角形相當於三個三角形的疊加,可以將繪制一個正三角形的操作封裝在函數中
代碼;
#練習2.5 繪制疊加三角形 import turtle def Tri(): turtle.seth(0) turtle.fd(100) turtle.seth(120) turtle.fd(100) turtle.seth(-120) turtle.fd(100) Tri() turtle.fd(100) Tri() turtle.seth(0) turtle.fd(100) Tri()
反思:
可以設置相對坐標
疊加三角形還可以看做是大三角形中嵌套小三角形
#練習2.5 繪制疊加三角形 import turtle #先繪制大三角形 turtle.seth(0) for i in range(3): turtle.fd(200) turtle.left(120) turtle.left(60) turtle.fd(100) #再繪制小三角形 turtle.seth(0) for i in range(3): turtle.fd(100) turtle.right(120)
2.6 無角正方形的繪制。利用turle庫函數繪制一個沒有角的正方形。
分析:沒有角的效果可以通過控制海龜升起和降落來實現
代碼:
#練習2.6 繪制沒有角的正方形 import turtle def Line(): turtle.penup() turtle.fd(20) turtle.pendown() turtle.fd(60) turtle.penup() turtle.fd(20) for i in range(4): turtle.seth(90*i) Line()
2.7六芒星的繪制。利用turle庫函數繪制一個六芒星。
分析:六邊形可以看做是兩個大正三角形疊加的結果,而且兩個大三角形僅在初始角度相差60度;
代碼:
#練習2.7 繪制六邊形 import turtle def Tri(i): turtle.seth(0+i) turtle.fd(300) turtle.seth(120+i) turtle.fd(300) turtle.seth(240+i) turtle.fd(300) Tri(30) turtle.seth(30) turtle.fd(200) turtle.seth(270) turtle.fd(100) Tri(90)
反思:可以采用相對角度來繪制三角形
#練習2.7 繪制六邊形 import turtle def Tri(): turtle.fd(300) turtle.left(120) turtle.fd(300) turtle.left(120) turtle.fd(300) turtle.left(30) #六芒星擺放的角度 Tri() turtle.left(120) turtle.fd(200) turtle.right(120) turtle.fd(100) turtle.left(180) Tri()
2.8 正方形螺旋線的繪制。利用turle庫函數繪制一個正方形螺旋線。
分析:正方形螺旋形是個邊長不斷變大的正方形,只有兩條邊是相同長度的
代碼:
#練習2.7 繪制正方形螺旋線 import turtle def Squ(angle,length): turtle.seth(0+angle) turtle.fd(length) turtle.seth(90+angle) turtle.fd(length) for i in range(20): if i % 2 == 1 : Squ(90,i*10) turtle.seth(270) Squ(270,(i+1)*10)
反思:
使用相對坐標
#練習2.7 繪制正方形螺旋線 import turtle def Squ(length): turtle.left(90) turtle.fd(length) turtle.left(90) turtle.fd(length) for i in range(20): Squ(i*10)
2.9 自定義Python蟒蛇繪制。
Python123練習
練習程序設計題
練習1
1 溫度轉換
問題描述:和課上講解示例相同
代碼:
TempStr = eval('input()') if TempStr[-1] in ['F','f']: C=(eval(TempStr[0:-1])-32)/1.8 print("{:.2f}C".format(C)) elif TempStr[-1] in ['C','c']: F = 1.8*eval(TempStr[0:-1])+32 print("{:.2f}F".format(F)) else: print("輸入格式錯誤")
2 Hello World
問題描述:輸出Hello World
代碼:
#輸出Hello World print("Hello World")
3 數字形式轉換 1
問題描述:獲得用戶輸入的一個正整數輸入,輸出該數字對應的中文字符表示。
0到9對應的中文字符分別是:零一二三四五六七八九
問題分析: 讀取用戶的輸入,可以設置一個列表,輸入根據列表來一一對應進行轉換
代碼:
#數字形式轉換 Zhong = ["零","一","二","三","四","五","六","七","八","九"] Shu = ["0","1","2","3","4","5","6","7","8","9"] Cin = input() Cout = "" for i in range( len(Cin) ): if Cin[0] in Zhong: for j in range(10): if Cin[i] == Zhong [j]: Cout = Cout + Shu[j] else: for j in range(10): if Cin[i] == Shu [j]: Cout = Cout + Zhong[j] print(Cout)
反思:
讀題錯誤,只要求輸入正整數來獲得中文字符輸出
參考代碼:
template = "零一二三四五六七八九" s = input() for c in s: print(template[eval(c)], end="")
4.溫度轉換二
問題描述:
要求如下:
(1) 輸入輸出的攝氏度采用大寫字母C開頭,溫度可以是整數或小數,如:C12.34指攝氏度12.34度;
(2) 輸入輸出的華氏度采用大寫字母F開頭,溫度可以是整數或小數,如:F87.65指華氏度87.65度;
(3) 不考慮異常輸入的問題,輸出保留小數點后兩位;
(4) 使用input()獲得測試用例輸入時,不要增加提示字符串。
主要區別是溫度表現形式不一樣
代碼:
#溫度轉換2 TempStr = input() if TempStr[0] == 'F': C=(eval(TempStr[1:])-32)/1.8 print("C{:.2f}".format(C)) elif TempStr[0] == 'C': F = 1.8*eval(TempStr[1:])+32 print("F{:.2f}".format(F))
參考代碼:
#TempConvert.py TempStr = input() if TempStr[0] in ['F']: C = (eval(TempStr[1:]) - 32)/1.8 print("C{:.2f}".format(C)) elif TempStr[0] in ['C']: F = 1.8*eval(TempStr[1:]) + 32 print("F{:.2f}".format(F)) else: print() #不輸入任何錯誤提示
練習2
1 蟒蛇繪制
問題描述:
與課上講解實例相同
代碼:
#示例代碼2.1 import turtle turtle.setup(650,350,200,200) turtle.penup() #筆抬起 turtle.fd(-250) turtle.pendown() #筆落下 turtle.pensize(25) #筆的寬度 turtle.pencolor("purple") #筆的顏色 turtle.seth(-40) #前進方向 for i in range(4): turtle.circle(40,80) turtle.circle(-40,80) turtle.circle(40,80/2) turtle.fd(40) turtle.circle(16,180) turtle.fd(40*2/3)py
2.繪制正方形
問題描述:
繪制正方形
代碼:
import turtle for i in range(4): turtle.fd(100) turtle.left(90)
3 繪制正六邊形
問題描述:繪制正六邊形
代碼:
#練習2.7 繪制正六邊形 import turtle for i in range(6): turtle.fd(100) turtle.left(60)
4 繪制疊加形狀
問題描述:
代碼:
#TwoRoundDraw.py import turtle as t Color = ["black","red","green","orange","blue","violet","yellow","gold","grey"] t.pensize(2) for i in range(9): t.pencolor(Color[i]) t.fd(150) t.left(80) #720/9
測試1
1 Hello World的條件輸出
問題描述:
獲得用戶輸入的一個整數,參考該整數值,打印輸出"Hello World",要求:
如果輸入值是0,直接輸出"Hello World"
如果輸入值大於0,以兩個字符一行方式輸出"Hello World"(空格也是字符)
如果輸入值小於0,以垂直方式輸出"Hello World"
我的解答:
Cin = eval(input()) H = "Hello World" Length = len( H ) if Cin == 0 : print("Hello World") elif Cin > 0 : for i in range(Length+1): if ( i % 2 ) == 1: print ( H[i-1:i+1]) else: for j in range(Length): print ( H[j] )
參考答案:
n = eval(input()) if n == 0: print("Hello World") elif n > 0: print("He\nll\no \nWo\nrl\nd") else: for c in "Hello World": print(c)
反思:
python 的for 循環是有着 類似java的迭代器的功能
\n表示換行
2 數值運算
問題描述:
獲得用戶輸入的一個字符串,格式如下:
M OP N
其中,M和N是任何數字,OP代表一種操作,表示為如下四種:+, -, *, /(加減乘除)
根據OP,輸出M OP N的運算結果,統一保存小數點后2位。
注意:M和OP、OP和N之間可以存在多個空格,不考慮輸入錯誤情況。
我的解答:
cin = input() length = len(cin) index=0 for i in range(length): if cin[i] != " " and (not cin [i].isnumeric() and cin[i] != "-" and cin[i] != "." and cin[i] !="x"): index = index+i M = eval(cin[0:index]) OP = cin[index] N = eval(cin[index+1:length+1]) if OP == "+": print('%.2f'%(M+N)) elif OP == "-": print('%.2f'%(M - N)) elif OP == "*": print('%.2f'%(M * N)) elif OP == "/": print('%.2f'%(M / N))
參考答案:
s = input() print("{:.2f}".format(eval(s)))
反思:
可能是受之前的編程思想限制了,感覺自己就像是個白痴
測試2
1 繪制八邊形
問題描述:
使用turtle庫,繪制一個八邊形
參考代碼:
import turtle as t t.pensize(2) for i in range(8): t.fd(100) t.left(45)
2 繪制八角星
問題描述:
使用turtle庫,繪制一個八角圖形。
代碼參考:
import turtle as t t.pensize(2) for i in range(8): t.fd(150) t.left(135)