Elements-of-Python_03_LanguageFeature
- 2020 年 12 月 7 日
- 筆記
- About Python, Python
(內容包括Python語法概述,流程式控制制,條件表達式)
1 Python語法
1.1 Python的特點
Python是一種完全面向對象的、解釋性的、可移植的、開源的腳本編程高級語言,具有豐富的庫,允許邊寫邊執行。他完全支援繼承、重載,強大的第三方模組涵蓋科學計算、人工智慧、機器學習、Web開發、資料庫介面、圖形系統等多個領域。有Web開發、爬蟲開發、運維開發、數據挖掘、人工智慧等多個方向。
1.2 基本語法規則
雖然Python語法簡單,但也有如下基本規則:
- ①從頭到尾,逐個語句執行
- ②注釋#、空白行、文檔字元串(三引號)會直接被忽略
- ③自動檢測語句邊界,語句邊界由書寫者的語句縮進形成(同一級別的語句的縮進必須相同)
- ④複合語句(子句,clause):由首句、冒號、下一行開始相同縮進的程式碼塊組成
- ⑤通常一句一行,也允許但不建議一行多句或一句多行。
一句多行: 續行符\可以續行接著寫,小中大括弧中的內容可以直接換行寫;
一行多句:分號隔開,或直接在冒號後面寫。
1.3 幾種常見語句
2 流程式控制制語句
一項任務可以被變成一個流程,而描述這個流程就可以用自然語言、流程圖、偽程式碼、程式程式碼等多種形式表示,自然語言是最簡單的,流程圖是最直觀的,程式程式碼是唯一可以被電腦識別運行的。
2.1 流程圖
2.1 分支語句if
上圖是完整的if分支語句:
【書寫時:在if後加一個邏輯運算式①,冒號結尾,下一行縮進,程式碼塊①中書寫此邏輯運算式①成立後要完成的語句塊①;之後寫在上以邏輯運算不成立的前提下,另一個邏輯運算式②,冒號結尾下一行縮進,程式碼塊②中書寫此邏輯運算式②成立後要完成的語句塊②,以此類推。最後寫else:,是上面n-1個clause都不滿足時,執行的語句塊n。】即,列出每種情況,和滿足情況下要做的事。
【執行時:先判斷邏輯運算式①,滿足就執行語句塊①並結束判斷,不滿足就判斷邏輯運算式②,②滿足就執行語句塊②並結束判斷,以此類推,如果都不滿足,就執行else後的語句塊n,並結束】即,從上到下執行,一旦滿足某個結果,直接運行此語句塊並結束判斷。
一些說明:
1.Python中沒有switch-case語句;
2.邏輯運算式可以用邏輯運算符連接,可以選擇加或不加小括弧;
3.條件和語句塊用縮進來體現,所有語句塊間的縮進距離應一致;中止一行就是中止一個語句(無需額外分號);中止縮進就是中止一個程式碼塊(程式碼塊無需大括弧包裹);
4.if後可以沒有else或者elif(關鍵字elif就是else if的簡寫)。如果有else,就一定會執行某一分支的語句塊;
5.所有分支中,最多執行一個分支的語句塊,執行後,結束整個判斷。
關於else懸掛:
如果前面有好多個if嵌套在一起(雖然可以去避免嵌套,做成elif),怎麼知道else屬於哪個if呢? 很好辦!你只需要看else的開頭和一個if對齊,它就是哪個if的else。
關於if的例子:
#解一元二次方程的根
s = input("請依次輸入二次項、一次項、常數項,用空格分隔:\n>>>")
a,b,c = [eval(k) for k in s.split(" ")]
delta = b*b-4*a*c
if delta==0 :
x1 = x2 = -0.5*b/a
elif delta>0 :
x1 = -0.5*b/a + 0.5*delta**0.5/a
x2 = -0.5*b/a - 0.5*delta**0.5/a
else :
x1 = complex(-0.5*b/a,0.5*(-delta)**0.5/a)
x2 = x1.conjugate()
print(f"一元二次方程的兩個解:\nx1 = {x1}\nx2 = {x2}")
2.2 交互循環while
和if判斷一樣,while也會對邏輯表達式做判斷,如果判斷結果為真,就會進入循環,直到邏輯表達式不在成立,(或被中斷)。
while的句式:
也就是說,【只要滿足條件,就在循環體Loop中不斷執行循環體語句塊,除非有break、continue命令或者不再滿足條件才會跳出】
#按位取出數字的值
num = eval(input("請輸入數字:\n>>>"))
a = []
i = 0
flag = False
if num < 0:
num = -num
flag = True
while num - (10**(i)) >= 0 :
print((10**(i)))
a.append(int(num//10**i%10))
i += 1
#注意:循環前要把循環變數初始一下,循環體中要使循環變數離結束的條件更近
if flag :
a.append("-")
elif a == [] :
a = [0]
print(a)
2.3 序列迭代for
相比與while循環,由於有range函數,for循環的使用更加便捷。
把變數在某迭代器中遍歷一遍,遍歷每個元素時都執行循環體語句塊。
#斐波那契數列前n項輸出
num2,num1 = 0,1
for i in range(15): #循環變數只用作計數
num1,num2 = num1+num2,num1
print(num1,end="\t")
#n以內的素數
print(2,end = "\t")
for i in range(3,500,2): #循環用作循環體語句塊的變數
flag = True
for j in range(2,int(pow(i,0.5)+1)):
if i%j == 0 :
flag = False
break
if flag :
print(i,end = "\t")
幾點注意:
- for和while的區別: for在循環次數固定且可以直接表示時使用,while在終止條件明確且次數尚不確定時使用
- for和while循環體語句中,不能定義新變數,只能把原有變數重新賦值,所以定義中間變數需要在循環體外
- for循環的循環變數i的值,從迭代器中逐個收到,循環體中賦值只在本次循環中生效,甚至直接del i也不會報錯
- 減少循環次數可以提高運行效率(如除了2以外的素數都是奇數,將偶數參與循環判斷素數就是浪費;再比如高中學的數列求和直接用,1到100的和就不要循環了。)
#複利:周定投計算
annual_rate = eval(input("請輸入平均年化利率:"))
if annual_rate>=1 :
annual_rate /= 100
weekly_rate = (1+annual_rate)**(1/52)-1
week_capital = float(input("請輸入周定投金額:"))
total_capital= amount = 0.0
stop_profit = int(input("請選擇止盈條件:1.按年止盈\t2.按獲利比率止盈\t3.按總金額止盈\n>>>"))
if stop_profit == 1 :
for i in range(1,25*52+1):
total_capital += week_capital
amount = amount*(1+weekly_rate) + week_capital
if (i%52 == 0) : print(f"第{i//52:2d}年,本金{total_capital:>9.2f},賬戶總額{round(amount,2):>9.2f},盈利比{(amount-total_capital)/total_capital:.2%}。")
elif stop_profit == 2 :
stop_rate = eval(input("請輸入想要的獲利比率:"))
i = 0
if stop_rate>1 :
stop_rate /= 100
while ((amount-total_capital)/(total_capital+0.1) < stop_rate):
i += 1
total_capital += week_capital
amount = amount*(1+weekly_rate) + week_capital
else :
print(f"第{i//52:2d}年第{i%52:2d}周,盈利比{(amount-total_capital)/total_capital:.2%},本金{total_capital:>9.2f},賬戶總額{round(amount,2):>9.2f}。")
elif stop_profit == 3 :
would_amount = eval(input("請輸入想要的總金額:"))
i = 0
while (amount <= would_amount):
i += 1
total_capital += week_capital
amount = amount*(1+weekly_rate) + week_capital
else :
print(f"第{i//52:2d}年第{i%52:2d}周,總額達到{round(amount,2):>9.2f},盈利比{(amount-total_capital)/total_capital:.2%},本金{total_capital:>9.2f}。")
2.3.1 for循環下標提取
在for循環對字元串、列表或元組進行遍歷的時候,我們往往用for i in list對列表中的元素進行讀取,如果我們在讀取元素的時候同時想要得到其下標,可以創建一個循環次數計數變數x=0,並且在每次循環之後自加來達到效果。另一種快捷的方法就是使用內置函數enumerate(iter)來實現這種功能。
如: for i,name in enumerate(representativesList): 這樣的話,i就是這個元素的下標,name就是此下表對應的元素的內容。
2.4 break和continue
break和continue是打斷原有循環體的一種方式,不同的是,continue直接跳入下一次循環,break跳出這一循環體(但不會跳出更高層的循環)。也就是說:
continue直接進入下一次循環,
break直接跳出本循環體。
另外,python中沒有goto,雖然可以用第三方庫做出goto的效果,但是if加goto效果和while是一模一樣的。
2.5 三種條件表達式
和C語言的三目運算符(CONDITION?A:B)一樣,Python也有自己的條件運算符,又根據列表中數據無類型相同的限制和邏輯運算符有邏輯短路一說,總結了三種條件表達式:
解釋如下:
法①:這個方法就類似C語言的 (? :)運算符,是一個簡易的判斷,在A if CONDITION else B中,如果condition成立,則執行A,不然執行B。
法②:這個方法利用列表可以存下不同類型的數據,因為之前說過,False就是0,True是1,可以參加運算。所以condition的情況就代表了列表的第0和第1個元素。
法③:利用的是邏輯短路。
Extra1.1 (番外篇) 常見數列求和公式
如果您覺得Tom寫得不錯或者不好,歡迎批評或點贊
。