python語言程序設計基礎
部分截圖來自 北京理工大學 嵩天 的python基礎設計課程的ppt,僅做個人筆記使用,特此聲明。
三 基本數據類型
數字類型
-
整數類型 與數學中整數概念一致,可正可負,沒有取值范圍限制
四種進制表示形式:十進制,二進制,八進制,十六進制
-
浮點數類型 與數學中實數概念一致
帶有小數及小數的數字,浮點數間運算存在不確定尾數
round(x,d): 對x四舍五入,d是小數截取位數
浮點數可以采用科學記數法表示
-
復數類型 與數學復數的概念一致。
在python中,虛數的復數部分通過后綴“j”或”J”來表示,例如 12.3 +4j
復數類型中實數部分和虛數部分的數值都是浮點類型。對於復數,可以用z.real 和 z.imag來分別獲得它的虛數部分和實數部分。
擴展關系:整數 -> 浮點數 -> 復數
整數和浮點數混合運算,輸出結果是浮點數;整數和浮點數與復數混合運算,輸出結果是復數
思考與練習
python浮點數精度問題
[只有1%的人搞懂過Python 浮點數陷阱_web開發與Python-CSDN博客](https://blog.csdn.net/meiguanxi7878/article/details/94658009?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduend~default-2-94658009.nonecase&utm_term=python 浮點用什么表示&spm=1000.2123.3001.4430)
(4條消息) 從0.1加0.2不等於0.3談Python浮點數的前世今生_Python作業輔導員 - 天元浪子【許向武】-CSDN博客
python進制轉換
(4條消息) Python進制轉換詳細介紹_Wonderful-CSDN博客_python進制轉換
python 數字的格式化輸出
Python 中如何實現數字的格式化輸出? (pythonf.cn)
3.2 Python語言中整數1010的二進制,八進制和十六進制表示分別是什么?
| 進制 | 數值 | 實現代碼 |
|---|---|---|
| 十進制 | 1010 | print(f'{1010:d}') |
| 二進制 | 0b1111110010 | print(f'{1010:#b}') |
| 八進制 | 0o1762 | print(f'{1010:#o}') |
| 十六進制 | 0o3f2 | print(f'{1010:#x}') |
3.3 Python語言中-77.的科學記數法是什么?4.3e-3的十進制表示是什么?
| 結果 | 實現代碼 |
|---|---|
| -7.700000e+01 | print(f'{-77.:e}') |
| 0.004300 | print(f'{(4.3e-3):f}') |
3.4 復數2.3e+3-1.3e-3j的實部和虛部分別是什么?用什么方法提取一個復數的實部和虛部?
| 代碼 | 結果 | 含義 |
|---|---|---|
| print(2.3e+3-1.34e-3j) | (2300-0.00134j) | 運算結果 |
| print(2.3e+3-1.34e-3j.real) | 2300.0 | 實部 |
| print((2.3e+3-1.34e-3j).imag) | -0.00134 | 虛部,注意要加一個小括號給虛數 |
數字類型的操作
內置的數值運算操作符
| 操作符及使用 | 描述 |
|---|---|
| \(+\) | 加 |
| \(-\) | 減 |
| \(*\) | 乘 |
| \(/\) | 除,10/3結果是3.3333 |
| \(//\) | 整數除,x與y的整數商 10//3 結果是3 |
| % | 求余數,求模,10%3結果是1 |
| x**y | 冪函數運算 |
內置的數值運算函數
| 函數及使用 | 描述 |
|---|---|
| abs(x) | 絕對值,復數的絕對值是二維坐標位置到原點的距離 |
| divmod(x,y) | 商余,(x//y,x%y),同時輸出商和余數 |
| pow(x,y[,z]) | 冪余,(x**y)%z,[..]表示參數z可以省略 |
| round(x[,d]) | 四舍五入,d是保留小數位數,默認值為0 |
| \(max(x_1,x_2,\cdots,x_n)\) | 最大值,返回\(x_1,x_2,\cdots,x_n\)中的最大值,n不限 |
| \(min(x_1,x_2,\cdots,x_n)\) | 最小值,返回\(x_1,x_2,\cdots,x_n\)中的最小值,n不限 |
內置的數字類型轉換函數
| 函數及使用 | 描述 |
|---|---|
| int(x) | 將x變成整數,舍棄小數部分 |
| float(x) | 將x變成浮點數,增加小數部分 |
| complete(x) | 將x變成復數,增加虛數部分 |
思考與練習
python運算符優先級與結合性
當一個表達式中出現多個運算符時,Python 會先比較各個運算符的優先級,按照優先級從高到低的順序依次執行;
當遇到優先級相同的運算符時,再根據結合性決定先執行哪個運算符:如果是左結合性就先執行左邊的運算符,如果是右結合性就先執行右邊的運算符。
3.5 思考各操作運算符的優先級,計算下列表達式
| 表達式 | 運算順序 | 結果 |
|---|---|---|
| \(30-3**2+8//3**2*10\) | \(30-(3^2)+[8//(3^2)]*10\) | 21 |
| 3*4**2/8% 5 | \([3*(4^2)/8 ]mod 5\) | 1.0 |
| 2 ** 2 ** 3 | \(2^{2^3}=2^{8}\) | 256 |
| (2.5+1.25j)*4j/2 | \(\frac{(2.5+1.25j)*4j}{2}\) | (-2.5+5j) |
3.6 請將下列數學表達式用Python程序寫出來,並運算結果
| 數學表達式 | Python代碼 | 結果 |
|---|---|---|
| \(\frac{z^4+7-3*4}{5}\) | print((2* *4+7-3 * 4)/5) | 2.2 |
| \((1+3^2)* (16mod7)/7\) | print((1+3**2)*(16%7)/7) | 2.857142857142857 |
3.7 假設x=1 ,x*=3+5 **2的運算結果是什么
| 表達式 | 運算順序 | 結果 |
|---|---|---|
| x*=3+5 **2 | \(x=\{x *[ 3+(5^{2})]\}\) | 28 |
模塊1: math庫
表3.5 math庫中的數學常數 共4個
| 常數 | 數學表示 | 描述 |
|---|---|---|
| math.pi | \(\pi\) | 圓周率,值為3.141592565358979 |
| math.e | \(e\) | 自然對數,值為2.718281828459045 |
| math.inf | $ \infty $ | 正無窮大,負無窮大為- math.inf |
| math.nan | 非浮點數標記,NAN(not a Number) |
表3.6 math庫的數值表示函數 共16個
| 函 數 | 數學表示 | 描述 |
|---|---|---|
| math.fabs(x) | $ | x |
| math.fmod(x,y) | \(x \% y\) | 返回x與y的模 |
| math.fsum([x,y,...]) | \(x+y+\cdots\) | 浮點數精確求和 |
| math.ceil(x) | \(\lceil x \rceil\) | 向上取整,返回不小於x的最小整數 |
| math.floor(x) | \(\lfloor x \rfloor\) | 向下取整,返回不大於x的最小整數 |
| math.factorial(x) | \(x !\) | 返回x的階乘,如果x是小數或負數,返回ValueRrror |
| math.gcd(a,b) | 返回a與b的最大公約數 | |
| math.frexp(x) | \(x = m * 2^e\) | 返回(m,e),當x=0,返回(0,0) |
| math.ldexp(x,i) | \(x * 2^i\) | 返回\(x * 2^i\)運算值,mth.frexp(x)函數的反運算 |
| math.modf(x) | 返回x的小數和整數部分 | |
| math.trunc(x) | 返回x的整數部分 | |
| math.copysign(x,y) | $ | x |
| math.isclose(a,b) | 比較a和b的相似性,返回True或False | |
| math.isfinite(x) | 當x為無窮大,返回True,否則,返回False | |
| math.isinf(x) | 當x為正數或負數無窮大,返回False;否則,返回True | |
| math.isnan(x) | 當x是NaN,返回True;否則,返回False |
表3.7 math庫的冪對數函數 共8個
| 函數 | 數學表示 | 描述 |
|---|---|---|
| math.pow(x,y) | \(x^y\) | 返回x的y次冪 |
| math.exp(x) | \(e^x\) | 返回e的x次冪,e是自然對數 |
| math.xpml(x) | \(e^x-1\) | 返回e的x次冪減1,e是自然對數 |
| math.sqrt(x) | \(\sqrt x\) | 返回x的平方根 |
| math.log(x,[base]) | \(log_{base}x\) | 返回x的對數值,只輸入x時,返回自然對數,即\(ln x\) |
| math.log1p(x) | \(ln(1+x)\) | 返回1+x 的自然對數值 |
| math.log2(x) | \(log x\) | 返回x的2對數值 |
| math.log10(x) | \(log_{10}x\) | 返回x的10對數值 |
表3.8 math庫的三角運算函數 共16個
| 函數 | 數學表示 | 描述 |
|---|---|---|
| math.degrees(x) | 角度x的弧度轉角度值 | |
| math.radians(x) | 角度x的角度轉弧度 | |
| math.hypot(x,y) | \(\sqrt{x^2+y^2}\) | 返回(x,y)坐標到原點(0,0)的距離 |
| math.sin(x) | \(sin(x)\) | 返回x的正弦函數值,x是弧度值 |
| math.cos(x) | \(cos(x)\) | 返回x的余弦函數值,x是弧度值 |
| math.tan(x) | \(tan(x)\) | 返回x的正切函數值,x是弧度值 |
| math.asin(x) | \(arcsin(x)\) | 返回x的反正弦函數值,x是弧度值 |
| math.acos(x) | \(arcos(x)\) | 返回x的反余弦函數值,x是弧度值 |
| math.atan(x) | \(arctan(x)\) | 返回x的反正切函數值,x是弧度值 |
| math.atan2(y,x) | \(arctan(y/x)\) | 返回y/x的反正切函數值,x是弧度值 |
| math.sinh(x) | \(sinh(x)\) | 返回x的雙曲正弦函數值 |
| math.cosh(x) | \(cosh(x)\) | 返回x的雙曲余弦函數值 |
| math.tanh(x) | \(tanh(x)\) | 返回x的雙曲正切函數值 |
| math.asinh(x) | \(arcsinh(x)\) | 返回x的反雙曲正弦函數值 |
| math.acosh(x) | \(cosh(x)\) | 返回x的雙曲余弦函數值 |
| math.atanh(x) | \(tanh(x)\) | 返回x的雙曲正切函數值 |
表3.9 math庫的高等特殊函數 4個
| 函數 | 數學表達 | 描述 |
|---|---|---|
| math.erf(x) | \(\frac{2}{\sqrt{\pi}}\int_{0}^{x}{e^{-t^2}dt}\) | 高斯誤差函數,應用於概率論、統計學等領域 |
| math.refc(x) | \(\frac{2}{\sqrt{\pi}}\int_{x}^{\infty}{e^{-t^2}dt}\) | 余補高斯誤差函數,math.erfc(x)=1 - math.erf(x) |
| math.gamma(x) | \(\int_{0}^{\infty}{x^{t-1}e^{-x}dx}\) | 伽馬函數(Gamma),也叫歐拉第二積分函數 |
| math.lgamma(x) | \(ln (gamma(x))\) | 伽馬函數的自然對數 |
思考與練習
round函數
round函數,對浮點數進行近似取值,保留幾位小數,第一個參數是一個浮點數,第二個參數是保留的小數位數,可選,如果不寫的話默認保留到整數。python3.5的doc中,文檔為"values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice." 如果距離兩邊一樣遠,會保留到偶數的一邊。比如round(0.5)和round(-0.5)都會保留到0,而round(1.5)會保留到2。
除非對精確度沒什么要求,否則盡量避開用round()函數。近似計算我們還有其他的選擇:
- 使用math模塊中的一些函數,比如math.ceiling(天花板除法)。
- python自帶整除,python2中是/,3中是//,還有div函數。
- 字符串格式化可以做截斷使用,例如 "%.2f" % value(保留兩位小數並變成字符串……如果還想用浮點數請披上float()的外衣)。
- 數字的格式化輸出, 例如f'{2.501:.2f}' 具體參考上文
- 當然,對浮點數精度要求如果很高的話,請用decimal模塊
3.8 請利用math庫運行下面語句,獲得計算結果
-
math.sin(2*math.pi)
代碼
print(math.sin(2*math.pi))結果 \(-2.4492935982947064e-16\)
進行格式化輸出
print(f'{math.sin(2*math.pi):f}')結果 \(-0.000000\)
分析:在數學中sin(2pi)應該為0,但是math庫進行的是浮點數運算,得到的結果無限接近於0,進行浮點數格式化輸出結果就是-0.000,這個負號也蠻有意思,因為計算結果是負數,所以格式化之后依然是負數
-
math.floor(-2.5 )
代碼
print(math.floor(-2.5))floor是向下取整,結果是-\(-3\)
-
math.ceil(3.5+math.floor(-2.5))
代碼
print(math.ceil(3.5+math.floor(-2.5)))ceil是向上取整,結果是\(1\)
-
round(math.fabs(-2.5))
代碼
print(round(math.fabs(-2.5)))round函數 結果是\(2\)
-
math.sqrt(math.pow(2,4))
代碼
print( math.sqrt(math.pow(2,4)) )結果是\(4.0\),math模塊計算的結果是浮點數,pow計算冪方,sqrt開平方
-
math.log(math.e)
代碼:
print( math.log(math.e) )結果是\(1\)
-
math.gcd(12,9)
代碼
print( math.gcd(12,9) )結果是\(3\),gcd計算最大公約數
-
math.fmod(36,5)
代碼
import math print( math.fmod(36,5) )fmod 求模運算
3.9 利用math庫將47度角轉化為弧度制,並將結果賦值給一個變量
代碼
rad = math.radians(47)
print(rad)
3.10 利用math庫將\(\frac{\pi}{7}\)的弧度值轉為角度值,並將結果賦值給一個變量
代碼
deg = math.degrees(math.pi/7)
print(deg)
代碼示例3—— 天天向上的力量
示例代碼3.1
問題描述:
一年265天,以第一天的能力值為基數,記為1.0,當好好學習時能力值相比前一天提高千分之一,當沒有學習時的能力值比前一天下降千分之一,每天努力和每天放任,一年下來的能力值相差多少呢?
分析:
天天向上是\((1+0.001)^{365}\),放任或向下的力量是\((1-0.001)^{365}\)
代碼:
import math dayup = math.pow((1.0+0.001),365) #提高0.001 daydown = math.pow((1.0-0.001),365) #放任0.001 print("向上:{:.2f},向下{:.2f}.".format(dayup,daydown))
示例代碼3.2
問題描述:
一年365天,如果好好學習時能力值相比前一天提高千分之五,當放任時相比前一天下降千分之五,效果相差多少呢?
分析:
天天向上是\((1+0.005)^{365}\),放任或向下的力量是\((1-0.005)^{365}\)
代碼:
import math day_up = math.pow(1.0+0.005,365) #每天提高0.005 day_down = math.pow(1.0-0.005,365) #每天減少0.005 print("向上: {:.2f}, 向下: {:.2f}。".format(day_up,day_down))
代碼示例3.3
問題描述:
一年365天,如果好好學習時能力值相比前一天提高百分之一,當放任時相比前一天下降百分之一,效果相差多少呢?
分析:
天天向上是\((1+0.01)^{365}\),放任或向下的力量是\((1-0.01)^{365}\)
我們發現上面的代碼除了每天努力的大小不一樣,代碼其余部分是完全相同的。我們可以使用dayFactor這個變量來表示這個值,來提高代碼的重新使用性。
代碼:
import math dayFactor = 0.01 day_up = math.pow((1.0+dayFactor),365) #每天提高dayFactor day_down= math.pow((1.0-dayFactor),365) #每天放任dayFactor print("向上: {:.2f}, 向下:{:.2f} 。".format(day_up,day_down))
代碼示例3.4
問題描述:
一年365天,一周5個工作日,如果每個工作日都很努力,可以提高百分之一,僅在周末放松一下,能力值下降百分之一,效果如何呢?
分析:
使用循環實現,被7整除,余數為1到5認為是工作日,努力程度應該為\(1+dayFactor\),余數為6,0認為是休息日,努力程度應為\(1-dayFactor\)
代碼:
import math day_up, dayFactor = 1.0, 0.01 for i in range(365): if i % 7 in [0,6]: day_up = day_up *(1-dayFactor) else: day_up = day_up *(1+dayFactor) print("向上5天向下2天的力量: {:.2f}。".format(day_up))
代碼示例3.5
問題描述:
如果對示例代碼3.4的結果感到意外,那么自然會有如下疑問:每周工作5天,休息兩天,休息日水平下降0.01,工作日要努力到什么程度,一年后的水平才能與每天努力百分之一取得的效果一樣呢?
分析:
我門采用最最簡單的方法,暴力嘗試。我門發現,暴力嘗試的每一次都需要使用前面寫過的函數體,所以我們可以通過保留字def定義一個求解的函數,這樣將增強代碼的可讀性
代碼:
#代碼示例 天天向上3.5 import math def dayUP(dayFactor): day_up = 1.0 for i in range(365): if i % 7 in [0,6]: day_up = day_up * (1.0 - 0.01) else: day_up = day_up * (1.0 + dayFactor) return day_up dayFactor = 0.01 while(dayUP(dayFactor)<37.78): dayFactor += 0.001 print("每天努力參數是: {:.3f}。".format(dayFactor))
思考與練習
3.12 一年365天,初始水平為1.0,每工作一天水平增加N,不工作時水平不下降,一周連續工作4天,請編寫程序運行結果並填寫下表:
| N | 0.001 | 0.002 | 0.003 | 0.004 | 0.005 | 0.006 | 0.007 | 0.008 | 0.009 | 0.01 |
|---|---|---|---|---|---|---|---|---|---|---|
| 年終值 | 1.231 | 1.515 | 1.865 | 2.294 | 2.822 | 3.470 | 4.267 | 5.246 | 6.447 | 7.922 |
代碼
#思考與練習 3.12
import math
def dayUP(dayFactor):
day_up = 1.0
for i in range(365):
if i % 7 in [1,2,3,4]:
day_up = day_up * (1.0 + dayFactor)
return day_up
dayFactor = [0.001,0.002,0.003, 0.004 ,0.005 , 0.006, 0.007 , 0.008 ,0.009 ,0.01]
for i in dayFactor:
print(f'{dayUP(i):.3f}')
3.13 一年365天,初始水平為1.0,每工作一天水平增加N,不工作時水平不下降,一周連續工作5天,請編寫程序運行結果並填寫下表:
| N | 0.001 | 0.002 | 0.003 | 0.004 | 0.005 | 0.006 | 0.007 | 0.008 | 0.009 | 0.01 |
|---|---|---|---|---|---|---|---|---|---|---|
| 年終值 | 1.297 | 1.681 | 2.179 | 2.823 | 3.657 | 4.737 | 6.133 | 7.938 | 10.723 | 13.291 |
代碼
#思考與練習 3.13
import math
def dayUP(dayFactor):
day_up = 1.0
for i in range(365):
if i % 7 in [1,2,3,4,5]:
day_up = day_up * (1.0 + dayFactor)
return day_up
dayFactor = [0.001,0.002,0.003, 0.004 ,0.005 , 0.006, 0.007 , 0.008 ,0.009 ,0.01]
for i in dayFactor:
print(f'{dayUP(i):.3f}')
3.14 一年365天,初始水平為1.0,每工作一天水平增加N,不工作時水平不下降,一周連續工作6天,請編寫程序運行結果並填寫下表:
| N | 0.001 | 0.002 | 0.003 | 0.004 | 0.005 | 0.006 | 0.007 | 0.008 | 0.009 | 0.01 |
|---|---|---|---|---|---|---|---|---|---|---|
| 年終值 | 1.367 | 1.869 | 2.554 | 3.489 | 4.764 | 6.504 | 8.876 | 12.110 | 16.517 | 22.521 |
代碼
#思考與練習 3.14
import math
def dayUP(dayFactor):
day_up = 1.0
for i in range(365):
if i % 7 in [0,1,2,3,4,5]:
day_up = day_up * (1.0 + dayFactor)
return day_up
dayFactor = [0.001,0.002,0.003, 0.004 ,0.005 , 0.006, 0.007 , 0.008 ,0.009 ,0.01]
for i in dayFactor:
print(f'{dayUP(i):.3f}')
3.15 一年360天,初始水平為1.0,以每個月30天計算,在每個月初連續十天里,每工作一天水平增加N,該月其他時間工作與否都不增加水平值 ,請編寫程序運行結果並填寫下表:
| N | 0.001 | 0.002 | 0.003 | 0.004 | 0.005 | 0.006 | 0.007 | 0.008 | 0.009 | 0.01 |
|---|---|---|---|---|---|---|---|---|---|---|
| 年終值 | 1.127 | 1.271 | 1.433 | 1.615 | 1.819 | 2.050 | 2.310 | 2.602 | 2.930 | 3.300 |
代碼
#思考與練習 3.15
import math
def dayUP(dayFactor):
day_up = 1.0
for i in range(360):
if i % 30 in [0,1,2,3,4,5,6,7,8,9]:
day_up = day_up * (1.0 + dayFactor)
return day_up
dayFactor = [0.001,0.002,0.003, 0.004 ,0.005 , 0.006, 0.007 , 0.008 ,0.009 ,0.01]
for i in dayFactor:
print(f'{dayUP(i):.3f}')
字符串類型及操作
字符串的表示
-
單引號字符串:‘單引號表示,可以使用“雙引號”作為字符串的一部分’
-
雙引號字符串:“雙引號表示,可以使用‘單引號’作為字符串的一部分”
-
三引號字符串:“‘三引號表示可以使用“雙引號”
‘單引號’
也可以換行
“’‘
print('單引號表示,可以使用"雙引號"作為字符串的一部分')
print("雙引號表示,可以使用'單引號'作為字符串的一部分")
print('''三引號表示可以使用"雙引號'
'單引號'
也可以換行
''')
-
訪問字符,python使用方括號[]來訪問字符串
- 正向遞增序號,最左側字符為0,向右遞增,最右側字符序號為L-1
- 反向遞減序號,最右側字符序號為-1,想做依次遞減,最左側字符序號為-L
-
區間訪問(切片),采用[N:M]格式,表示字符串從N到M(不包含M)的子字符串,其中,N和M為字符串的索引序號,可以混合使用正序和逆序序號.如果表示中M或N索引缺失,則表示字符串把開始或結束索引值設置為默認值.
切片訪問完整形式應該為[開始:結束:步長],省略步長為1
基本的字符串操作符 5個
| 操作符 | 描述 |
|---|---|
| x + y | 連接兩個字符串x和y |
| x * n 或 n * x | 復制n次字符串x |
| x in s | 如果x是s的子串,返回True,否則返回False |
| str[i] | 索引,返回第i個字符 |
| str[M:N] | 切片,返回索引第M到N的子串,其中不包含N |
print("Python語言"+"程序設計")
name = "Python語言"+"程序設計"+"基礎"
print(name)
print("Good"* 3)
print("Python語言"in name)
print('Y' in "Python語言")
微實例3.1 獲取星期字符串
描述:程序讀入一個表示星期幾的數字(1~7),輸出對應的星期字符串名稱。
例如,輸入3,返回”星期三”
代碼:
#微實例3.1 weekStr = "星期一星期二星期三星期四星期五星期六星期日" weekID = eval(input("請輸入星期數字(1~7):")) pos = (weekID-1)*3 print(weekStr[pos:pos+3])思考:微實例3.1通過在字符串中截取適當子串實現星期名稱的查找。問題關鍵是找出子串的剪切位置。因為每個星期的縮寫都是3個字符組成,所以較容易。使用字符串作為查找表的缺點是,所剪切的子字符串長度必須相同。
代碼:
#微實例3.1改進,采用列表 week= ["星期一","星期二","星期三","星期四","星期五","星期六","星期日"] weekID = eval(input("請輸入星期數字(1~7):")) pos = (weekID-1) print(week[pos])
特殊的格式化控制字符
| 控制字符 | 含義 |
|---|---|
| \a | 蜂鳴,響鈴 |
| \b | 回退,向后退一格 |
| \f | 換頁 |
| \n | 換行,光標移動到下行首頁 |
| \r | 回車,光標移動到本頁首行 |
| \t | 水平制表 |
| \v | 垂直制表 |
| \0 | NULL 什么都不做 |
內置的字符串處理函數 6個
| 函數 | 描述 |
|---|---|
| len(x) | 返回字符串x的長度,也可以返回其他組合數據類型元素的個數 |
| str(x) | 返回任意類型x所對應的字符形式 |
| chr(x) | 返回Unicode編碼x對應的單字符 |
| ord(x) | 返回單字符對應的Unicode編碼 |
| hex(x) | 返回整數x對應十六進制數的小寫形式字符串 |
| oct(x) | 返回整數x對應八進制的小寫形式字符串 |
微實例3.2 凱撒密碼
描述:凱撒面貌是古羅馬大帝凱撒對軍事情報加密的算法,它采用了替換方法對信息中的每一個英文字符循環替代為字母表序列中該字符后面的第三個字符
加密 : \(C=(P+3)mod 26\)
解密:\(P=(C-3)mod26\)
代碼:
#微實例 凱撒加密 plaintext = input("請輸入明文:") ciphertext="" for p in plaintext: if ord("a")<=ord(p) <=ord("z"): ciphertext = ciphertext+ chr( ord("a") + (ord(p)-ord("a")+3)%26 ) print(ciphertext)#微實例 凱撒解密 ciphertext = input("請輸入密文:") plaintext="" for p in ciphertext: if ord("a") <= ord(p) <= ord("z"): plaintext = plaintext + chr( ord("a") + ( ord(p)-ord("a")-3)%26 ) print(plaintext)
內置的字符串處理方法 16個
| 方法 | 描述 |
|---|---|
| str.lower() | 返回字符串str的副本,全部字符小寫 |
| str.upper() | 返回字符str的副本,全部字符大寫 |
| str.islower() | 當str所有字符都是小寫時。返回True,否則返回False |
| str.isprintable() | 當str所有字符都是可打印的,返回True,否則返回False |
| str.isnumeric() | 當str所有字符都是數字,返回True,否則返回False |
| str.isspace() | 當str所有字符都是空格,返回True,否則返回False |
| str.endswith(suffix,[start,[end]]) | str[start:end] 以suffix 結尾返回True,否則返回False |
| str.stratswith(prefix,[start,[end]]) | str[start:end] 以prefix開頭返回True,否則返回False |
| str.split(seq=None,maxspilt=-1) | 返回一個列表,由str根據seq分割的部分構成 |
| str.count(sub,[,start[,end]]) | 返回str[start:end]中sub子串出現的次數 |
| str.replace(old,new[,count]) | 返回字符串str的副本,在其左側和右側去掉chars中列出的字符 |
| str.center(width[,fillchar]) | 字符串居中函數 |
| str.strip([cjhars]) | 返回字符串str的副本,在其左側和右側去掉charz中列出的字符 |
| str.zfill(width) | 返回字符串str的副本,長度為width,不足部分在左側添0 |
| str.format() | 字符串的格式化輸出 |
| str.join(iterable) | 返回一個新的字符串,由組合數據類型iterable變量的每個元素組成,元素間用str分割 |
思考與練習
3.16 s=“hello” t=”world” ,s+=t,則s,s[-1],s[2:8],s{::3},s{-2::-1}分別表示什么
| 表達式 | 結果 |
|---|---|
| s | helloworld |
| s[-1] | d |
| s[2:8] | llower |
| s[::3] | hlod |
| s[-2::-1] | lrowolleh |
s[2:8]完整的形式應該是s[2:8:1],分別對應着[開始: 結尾: 步長]
s[::3]完整形式為s[0:10:3]
s[-2::-1]完整形式為[-2:-11:-1],從倒數第二個開始,按着步長為-1,從-2,逐步長前進,及 -2,-3,-4,...,-10,-11
3.17 判斷題 :Python中“4”+”5”的結果為“9”
錯誤,“4”,“5”是字符串類型,+含義為連接,結果為“45”
3.18
3.19 s=“Python String”,寫出下列操作的輸出結果:
| 表達式 | 結果 |
|---|---|
| s.upper() | PYTHON STRING |
| s.lower() | python string |
| s.find('i') | 10 |
| s.replace('ing','gni') | Python Strgni |
| s.split() | ['Python', 'String'] |
3.20 下列表達式錯誤的是()
A。 ’abcd’ <‘ad’ B ‘abc’ <‘abcd’ C “<a” D ‘Hello’>‘hello’
字符串的比較是按着Unicode編碼來的
字符串類型的格式化
str.format()
由於我學習語言是從C++開始的,所以很不適應c語言的print風格,發現format輸出格式也可以通過之前
Python 中如何實現數字的格式化輸出? (pythonf.cn)介紹的f-string風格實現,這種風格更類似於C++的輸出形式,也就是直接在占位符中插入變量。
F-string
F-string 采用 {content:format} 的形式設置字符串格式,采用默認格式時則不需要指定 {:format}。其中 content 是替換並填入字符串的內容,可以是變量、表達式或函數等,format 是格式描述符。
對齊格式描述符
| 格式描述符 | 含義與作用 |
|---|---|
| < | 左對齊(字符串默認對齊方式) |
| > | 右對齊(數值默認對齊方式) |
| ^ | 居中 |
數字符號格式描述符
| 格式描述符 | 含義與作用 |
|---|---|
| + | 負數前加負號(-),正數前加正號(+) |
| - | 負數前加負號(-),正數前不加任何符號(默認) |
| (空格) | 負數前加負號(-),正數前加一個空格 |
寬度與精度格式描述符
| 格式描述符 | 含義與作用 |
|---|---|
| width | 整數width指定寬度 |
| 0width | 整數width指定寬度,開頭的0指定高位用0補足寬度 |
| width.precison | 整數width指定寬度,整數precision指定顯示精度 |
基本格式類型
| 使用變量類型 | 格式描述符 | 含義與作用 |
|---|---|---|
| 字符串 | s | 普通字符串類型 |
| 整數 | b | 二進制整數類型 |
| 整數 | c | 字符類型,按unicode編碼將整數轉換為對應字符 |
| 整數 | d | 十進制整數類型 |
| 整數 | o | 八進制整數類型 |
| 整數 | x | 十六進制整數格式(小寫字母) |
| 整數 | X | 十六進制整數格式(大寫字母) |
| 整數、浮點數、復數 | e | 科學記數格式,以e表示*10^ |
| 整數、浮點數、復數 | E | 與e等價,但以E表示& 10^ |
| 整數、浮點數、復數 | f | 定點數格式,默認精度(precision)是6 |
| 整數、浮點數、復數 | F | 與f等價,但將nan和inf換成NAN和INF |
| 整數、浮點數、復數 | g | 通用格式,小數用f,大數用e |
| 整數、浮點數、復數 | G | 與G等價,但小數用F,大數用E |
| 整數、浮點數、 | % | 百分比格式,數字自動乘上100后按f格式排版,用加%后綴 |
千位分隔符格式描述符
| 格式描述符 | 含義與作用 |
|---|---|
| , | 使用,作為千位分隔符 |
若不指定‘,’ ,則f-strin不使用任何千位分隔符,此為默認設置。‘,’僅用於十進制整數、浮點數和復數,對於浮點數和復數,只分割小數點前的數位。
數字顯示格式描述符
| 格式描述符 | 含義與作用 |
|---|---|
| # | 切換數字顯示方式,切換進制 |
number = 1234
#轉為16進制
print(f'{number:x}')
print(f'{number:X}')
print(f'{number:#x}')
print(f'{number:#X}')
實例4:文本進度條
print()
-
默認情況下,print()函數在輸出結尾出會自動產生一個‘\n’,即換行符,從而讓光標自動移動到下一行行首。
-
在print()函數中跟換參數end的默認值為‘’,即每次使用print()函數輸出是不換行。此時系統光標還停留在上一次輸出的行尾。
print("1") print("2") print("1",end='') print("2",end='') print("3") print("4")
簡單的開始
實例代碼
問題描述:
基本思想是按着任務執行百分比將整個任務划分為100個單位,每執行N%輸出一次進度條。每一行輸出包括進度百分比,代表已經完成的部分(**)和未完成的部分(..)的兩種字符,以及一個跟隨完成度前進的小箭頭。調用Python標准時間庫time,使用time.sleep(t)函數將當前程序暫時掛起ts.
代碼:
#實例代碼4.1 簡單的開始 import time scale = 10 print("------執行開始------") for i in range(scale+1): a,b = '**' * i , '..'*(scale-i) c = (i/scale)*100 print(f'%{c:^3.0f}[{a}->{b}]') time.sleep(0.1) print("-------執行結束-------")
單行動態刷新
描述:只在一行匯總改變進度比例,與上個實例相比,區別在於原地輸出和動態輸出,其基本思想是將每一次進度條輸出都固定在同一行,並不斷用新生成的字符串覆蓋之前的輸出,形成進度條不斷刷新的動態效果。這種方法稱為“單行動態刷新”
代碼:
#實例代碼4.2 import time for i in range(101): print(f'\r{i:2}%',end="") time.sleep(0.05)
帶刷新的文本進度條
描述:將前兩小節程序合並。
為了進一步提高用戶體驗,在文本進度條中增加運行時間的監控,這里采用time庫中的time.clock()函數。
time.clock()函數一般多次使用,第一次調用時為計時開始,統一程序中第二次及后續調用時返回與第一次計時之間的時間差,單位為秒。該函數主要用於統計程序運行時間,增加用戶體驗。
代碼:
#實例代碼4.3 import time scale = 50 print("執行開始".center(scale//2,'-')) t = time.clock() for i in range(scale+1): a = '*' * i b = '-' * (scale-i) c = (i/scale) * 100 t = t - time.clock() print(f'\r{c:^3.0f}%[{a}->{b}]{-t:.2f}s',end='') time.sleep(0.05) print("\n"+"執行結束".center(scale//2,'-'))
程序練習題
3.1 重量計算。月球上物體的體重是在地球上的16.5%,假如你在地球上每年增加0.5kg,編寫程序輸出未來十年你在地球和月球上的體重狀況。
#3.1 體重計算
nowKG = eval(input("請輸入你現在的體重(kg)"))
for i in range(10):
nowKG+=0.5
print(f'{i+1}年后, 地球:{nowKG:.2f}, 月球:{nowKG*0.165:.2f}')
3.2 天天向上續。盡管每天堅持,但人的能力發展並不是無限的,它符合特定模型。假設能力增長符合如下帶有平台期的模型:以7天為一個周期,連續學習三天能力值不變,從第四天開始至第七天每天能力增長為前一天的1%,如果7天中有1天間斷學習,則周期從頭算起。請編程回答,如果初始能力值為1,連續學習365天后能力值是多少?
#3.2 天天向上續
ability = 1.0
for i in range(365):
if(i % 7 in [0,1,2] ):
ability = ability
else :
ability *= 1.01
print(ability)
3.3 天天向上續。采用程序練習題3.2的能力增長模型,如果初始能力值為1,固定每10天休息一天,365天后能力值是多少?如果每15天休息一天呢?
#3.3 天天向上續
ability = 1.0
for i in range(365):
if(i % 10 in [1,2,3] ):
ability = ability
elif (i % 10 in [4,5,6,7] ):
ability *= 1.01
elif (i % 10 in [8,9,0] ):
ability = ability
print(ability)
3.4 回文數判斷。設n是一任意自然數,如果n的各位數字反向排列所得自然數與n相等,則n被稱為回文數。從鍵盤輸入一個5位數字,請編寫程序判斷這個數字是不是回文數。
#回文數判斷
import math
number = input()
length = len( number )
flag=""
for i in range(math.trunc(length/2)):
if (number[0+ i] != number[length-(i+1)]):
flag+="F"
break
else:
flag+="T"
print(flag)
3.5 田字格的輸出。使用print()函數輸出如圖所示的田字格。
def a():
for i in range(11):
if i%5 == 0 :
print("+ - - - - + - - - - +")
else :
print("| | |")
a()
3.6 文本進度條。仿照實例4,打印如下形式的進度條。
import time
print("Starting",end='')
for i in range(10):
print(f'.',end='')
time.sleep(0.5)
print("Done!")
3.7 文本風格。將如下程序段存為文件,在控制台終端(如W新動物是的cmd.exe)運行改程序,觀察輸出結果。更改print()函數的參數,例如,去掉end的賦值,再觀察運行結果。
while True:
for i in ["/","-","|","\\","|"]:
print ("%s\r" % i ,end ='')
運行之后打開了記事本
3.8 小巧而精致的第三方進度條庫tqdm。tqdm是一個快速、擴展性強的進度條工具庫。tqdm是一個第三方庫,首先需要安裝,然后才能使用。請讀者安裝,運行如下程序,觀察運行結果。
# 程序練習題3.8
from tqdm import tqdm
from time import sleep
for i in tqdm(range(1,100)):
sleep(0.01)
Python123
1 實例3:天天向上的力量
這是"實例"題,與課上講解實例相同,請作答檢驗學習效果。
#代碼示例 天天向上3.5
import math
def dayUP(dayFactor):
day_up = 1.0
for i in range(365):
if i % 7 in [0,6]:
day_up = day_up * (1.0 - 0.01)
else:
day_up = day_up * (1.0 + dayFactor)
return day_up
dayFactor = 0.01
while(dayUP(dayFactor)<37.78):
dayFactor += 0.001
print("工作日的努力參數是: {:.3f}".format(dayFactor))
2 實例4:文本進度條
這是"實例"題,與課上講解實例相同,請作答檢驗學習效果。
import time
scale = 50
print("執行開始".center(scale//2,'-'))
start = time.perf_counter()
for i in range(scale+1):
a = '*' * i
b = '.' * (scale - i)
c = (i/scale)*100
dur = time.perf_counter() - start
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end='')
time.sleep(0.1)
print("\n"+"執行結束".center(scale//2,'-'))
3 三次方格式化3
獲得用戶輸入的一個數字,可能是整數或浮點數,a,計算a的三次方值,並打印輸出。
輸出結果采用寬度20個字符、居中輸出、多余字符采用減號(-)填充。
如果結果超過20個字符,則以結果寬度為准。
輸入示例
10輸出示例
--------1000--------代碼:
import math Cin = eval(input()) a =pow(Cin,3) print(f'{a:-^20}')
4 星號三角形
讀入一個整數N,N是奇數,輸出由星號字符組成的等邊三角形,要求:
第1行1個星號,第2行3個星號,第3行5個星號,依次類推,最后一行共N的星號。
輸入示例 輸出示例 示例1 3 * *** 代碼:
# 星號三角形 n = eval(input()) for i in range(1,n+1,2): a = '*' * i print( f'{a:^{n}}' )
5 凱撒密碼
對於原文字符P,其密文字符C滿足如下條件:C=(P+3) mod 26
上述是凱撒密碼的加密方法,解密方法反之,即:P=(C-3) mod 26
假設用戶可能使用的輸入包含大小寫字母azAZ、空格和特殊符號,請編寫一個程序,對輸入字符串進行愷撒密碼加密,直接輸出結果,其中空格不用進行加密處理。使用input()獲得輸入。
代碼:
#凱撒密碼 plaintext = input() ciphertext="" for p in plaintext: if 'a'<= p <= 'z': ciphertext += chr( ord('a') + ( (ord(p)-ord('a')) +3 )%26 ) elif 'A'<= p <= 'Z': ciphertext += chr( ord('A') + ( (ord(p)-ord('A')) +3)%26 ) else : ciphertext += p print(ciphertext)
