PYTHON 學習筆記2 流程控制工具以及函式定義、匿名函式
前言
在上一節的學習中。已經介紹了幾種基本型別。包括字串的定義,以及字串中索引、切片、字串拼接的使用方法。以及基本的整形資料運算。一些之前都沒有了解過的運算子、比如 **
乘方 //
整數除法等。這一節,我們將學習最基本的流程控制工具,比如
- if 條件判斷
- for 迴圈
- while 迴圈
if-elif-else 判斷
num = int(input("輸入一個數字 :")) if num > 10: print("input > 10") elif num >=5: print("input >= 5") else: print("input < 5")
多重判斷 if-elif 以及最終所有條件都不滿足的時候,執行的else
輸入一個數字 :7
input >= 5
while 迴圈
while 迴圈也算是一種常見的迴圈方式,這種迴圈一般要在迴圈體類結束迴圈,或者通過條件的方式讓其結束。並不能無限迴圈下去。
a,b = 0,1
while a < 100 :
print(a,end=',')
a,b = b,a+b
print("迴圈結束")
a < 100
作為條件體,若滿足條件返回true ,則執行迴圈體
while-else
while-else 則是在條件塊不滿足的時候,只會執行一次的程式碼塊:
a,b = 0,1
while a < 100 :
print(a,end=',')
a,b = b,a+b
else:
print("條件不滿足")
print("跳出迴圈")
break 與 continue
- break 則停止所有迴圈
- continue 則跳出本次迴圈
- 但不會在迴圈被 break 語句終止時被執行
a = 0 while a < 100 : a=a+1 if a % 2 != 0 : continue print("偶數",a)
通過 continue
關鍵詞來跳過一些不需要的迴圈
a = 0
while a < 100 :
a=a+1
if a == 33:
break
print(a)
列印到33後,通過break 直接結束掉迴圈
for 迴圈
for in 一般用於List 列表的遍歷。
>>> words = ['a','abc','abcd']
>>> for item in words :
print(item,len(item))
a 1
abc 3
abcd 4
- item 用於表示當前項
- len() 函式用於計算字串的長度
for-else
for i in range(10):
print(i)
else:
print("迴圈結束")
else 則是在迴圈結束後(不滿足條件後)執行的程式碼塊,
當迴圈被break
終止後,則不會再執行else 的內容
range() 函式
range() 函式則是為了生成指定範圍內的自然數,
range(5, 10)
5, 6, 7, 8, 9
# 這裡的3 則表示步進
range(0, 10, 3)
0, 3, 6, 9
# 步進也可以是複數
range(-10, -100, -30)
-10, -40, -70
pass
pass 語句什麼也不做。當語法上需要一個語句,但程式需要什麼動作也不做時,可以使用它。
while True:
pass
print('a')
print("end")
定義函式 def
def fib(n):
result = []
a,b = 0,1
while a<n :
result.append(a)
a,b = b,a+b
return result
print("fib start")
print(fib(100))
這裡我們通過定義一個函式,無需指定其返回型別,這個函式fib(n)
則是打印出0——n 範圍內的斐波那契數列。若是一個無返回型別呢?
- 若函式內部不帶有
return
則會返回一個None
def demo():
print("no return")
print(demo())
----------------------
no return
None
在函式被呼叫時,實際引數(實參)會被引入被呼叫函式的本地符號表中;因此,實參是通過 按值呼叫 傳遞的(其中 值 始終是物件 引用 而不是物件的值)
當一個函式呼叫另外一個函式時,將會為該呼叫建立一個新的本地符號表。
預設值定義法
def other(a,b=5):
for i in range(b):
print(i,"-",a)
other(10)
-------------------------
0 - 10
1 - 10
2 - 10
3 - 10
4 - 10
定義這個函式是為了理解預設值的用法,若不傳入第二個列印次數,則預設使用5次,而傳入的話,按照指定次數列印。
關鍵詞引數
關鍵詞函式是為了更加形象的說明傳入的這個引數所在的位置以及引數的具體用法,若一個函式有四五個引數,一次性傳入這麼多引數,難免讓人看得眼花繚亂,若使用key=value
的方式傳入
def other(a,b=5):
for i in range(b):
print(i,"-",a)
other(a=111,b=3)
--------------------
0 - 111
1 - 111
2 - 111
但不能同時使用兩種方式,要麼直接使用引數,要麼使用關鍵詞引數
特殊函式
預設情況下,函式的引數傳遞形式可以是位置引數或是顯式的關鍵字引數
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
----------- ---------- ----------
| | |
| Positional or keyword |
| - Keyword only
-- Positional only
通過 /
與 *
來確定函式的傳遞方式
/
後方的引數既可以用位置引數 或者是 關鍵詞引數
/
前方的引數必須是位置引數
*
後方的引數只能使用關鍵字引數
# 基本形式
def standard_arg(a):
print(a)
# 僅限位置
def pos_only_arg(a,/):
print(a)
# 僅限關鍵字引數
def kwd_only_arg(*,a):
print(a)
def combined_example(pos_only, /, standard, *, kwd_only):
print(pos_only, standard, kwd_only)
- 基本形式:可以傳遞任意形式
standard_arg('hello')
standard_arg(a ='hello')
-----------------------
hello
hello
- 僅限位置引數
pos_only_arg('world')
#以下形式會報錯
#pos_only_arg(a='world')
- 僅限關鍵字引數
kwd_only_arg(a='python')
# 以下形式會報錯,不可使用
#kwd_only_arg('python')
- 雙重形式
combined_example('hello',standard='world',kwd_only='python')
combined_example('hello','world',kwd_only='python')
----------------------
hello world python
hello world python
這裡注意其 /
與 *
所在的位置傳遞引數即可
Lambda 表示式
Lambda函式可以在需要函式物件的任何地方使用。它們在語法上限於單個表示式。從語義上來說,它們只是正常函式定義的語法糖。與巢狀函式定義一樣,lambda函式可以引用所包含域的變數:
def create_fun(n):
return lambda x:x+n
f = create_fun(50)
print(f(1))
------------------
51
簡單的解釋一下:我們通過定義一個函式create_fun
需要傳入一個n
的引數,而後我們通過return
關鍵字返回一個 lambda
匿名函式,這個匿名函式需要傳入一個x
作為引數,在匿名函式的函式體內,將外層函式傳入的n
與匿名函式自己的引數x
做一個相加。
f = create_fun(50)
已經建立了一個匿名函式,並且賦值給 f,現在 f 就是一個匿名函式,可以傳參,通過f(1)
呼叫匿名函式後,1其實就是匿名函式的引數 x, 做一個相加後,則返回的就是 51
小結
通過本節的學習,我們已經瞭解到有關程式碼流程的控制、通過 if-elif-else 在不同的條件下執行不同的程式碼。兩種不同的迴圈方式 for / while 以及如何定義一個函式,包括函式的返回值以及給函式傳入引數的時候,需要注意的傳參方式,位置傳參
以及key=value
形式傳參