Python學習 之 函式

2021-08-31 15:57:25 字數 4559 閱讀 8784

概念高階用法

"""

語法:關鍵字 函式名(引數列表):

函式體引數順序:

位置引數: a, b, c

未知數量位置引數, *args, 接收進函式內的型別為 tuple

關鍵字引數: key=none

未知關鍵字引數, **kwargs, 接收進函式內的型別為 dict

"""# 順序: 位置引數 -> *args -> 關鍵字引數 -> **kwargs

deffunc

(a,*args, b=

none

,**kwargs)

:print

(a, args, b, kwargs)

func(1,

2,3,b=

10,***=

"女",tips=

"提示"

)# 1 (2, 3) 10

# 特殊用法: 傳參時使用 * 或 **, 將元組或字典打散, 再傳參

x =(2

,3) y =

d(1,

*x,b=10,

**y)

# 1 (2, 3) 10

""" 可以使用 * 打散 list 和 tuple, 用 ** 打散 dict 進行傳參 """

defa

(*args,

**kwargs)

:print

(args, kwargs)

t =(1,

2,3)

d =a(t, d)

# ((1, 2, 3), ) {}, 並未將 dict 中的鍵值對作為關鍵字引數傳入

a(*t,

**d)

# (1, 2, 3)

作用域

取值順序

載入順序

""" 

區域性命名空間, 列印該區域性空間的所有變數

全域性命名空間, 無論放在**, 只列印全域性的, 不列印區域性的

"""defx()

: i =

20print

(locals()

)# 結果:

print

(globals()

)# 結果:

if __name__ ==

"__main__"

: x(

)

# 全域性變數

a =10

b =20

defx()

:# global 關鍵字宣告函式 x 內部使用全域性變數 a

global a

a =100# 修改了全域性變數

# 定義乙個區域性變數 b, 這個和全域性變數不衝突, 當函式執行完成後會銷毀

b =200defy(

):# nonlocal 關鍵字宣告函式 y 內部使用區域性變數 b

nonlocal b

b =2000

# 修改了區域性變數

# 呼叫內部的方法

y()# 將 a, b 返回, 驗證結果

return a, b

if __name__ ==

"__main__"

:print

(x()

)#(100, 2000)

"""

內層函式對外層函式的非全域性變數進行引用, 就是閉包

可以使用 __closeure__ 進行判斷, 如果是, 則返回乙個記憶體位址, 如果不是, 則返回為空

"""def

func_outside()

:# 這個是外層函式的非全域性變數

x =10# 這個就是內層函式

deffunc_inside()

:# 這裡對外層變數 x 進行引用, 不需要做任何操作

nonlocal x

# 執行內層函式

b()# 通過__closure__方法判斷

print

(b.__closure__)

if __name__ ==

"__main__"

: a(

)# 結果是乙個記憶體位址, 所以它是閉包

"""

用於定義簡單的函式邏輯

多配合其他函式使用

lambda 函式的語法示例:

lambda i: i * 2

lambda i: true if i % 2 == 0 else false

"""# 定義 lambda 表示式

r =lambda x: x*

2# 執行函式, 正常傳參r(2

)# 配合其他函式使用, 也有示例

r =filter

(lambda x:

false

if x %2==

0else

true

)print

(list

(r))

"""

常用於反推和遞推的模型

反推: 已知最後乙個的資訊, 反推第乙個的資訊

遞推: 從第乙個一直向後, 直到滿足條件

內部一定有乙個 if 判斷, 用於結束遞迴

"""# 1. 第乙個人比第二個人大 2 歲, 第二個人比第三個人大 2 歲, 第三個人 18 歲, 問第乙個人多大

# 引數理解為總數(遞迴深度)

deffunca

(n):

# n 為 1 時, 拿到最後乙個的確切資訊, 並返回

if n ==1:

return

18# 需要回溯(根據下層資料計算上層資料), 需要 return

# 呼叫本身, 深度-1,並且處理不同深度的資料差異

else

:return funca(n-1)

+2print

(funca(3)

)# 2. 依次列印所有元素

l =[1,

[2,[

3,[4

,[5,

[6,7

]]]]

]]deffuncb

(l):

for i in l:

iftype

(i)==

list

: funcb(i)

else

:print

(i)funcb(l)

**選單
"""

省/市 -> 區 -> 地名 -> 公司名

"""menu =

,'朝陽':,

'東城':,

},'山東':,

}def

choose_menu

(d):

# 判斷是否在無法展開的子選單(因為只有最末端為 list 型別)

iftype

(d)==

list

:print

("查詢結果為 %s"

%str

(list

(d))

)else

:# 展示選單

for i in d:

print

(i, end=

" ")

# 拿到查詢選項

k =input

("input: "

)# 判斷如果選項在選單中, 且選單內容不為空

if k in d and

len(d[k])!=

0:choose_menu(d[k]

)else

:print

("查詢結果為空"

)choose_menu(menu)

二分查詢演算法
def

find_num

(l, num, start=

0, end=

none):

# 因為是有序演算法, 先確定邊界

if num < l[0]

or num > l[-1

]:return

"超出有序數列範圍"

# 如果未傳start和end引數, 則設定為整個列表

ifnot end:

end =

len(l)

# 如果索引是相鄰的且起始位置不為0, 那麼可以判定這個數字不在數列中

if end-start ==

1and start !=0:

return

"找不到這個數字"

# 計算中間值

mid =

(start+end)//2

if num == l[mid]

:return mid

elif num > l[mid]

:return find_num(l,num,mid,end)

elif num < l[mid]

:return find_num(l,num,start,mid)

l =[10,

20]# 找 10 在列表l中的索引

print

(find_num(l,10)

)

Python學習之函式

0 引論 函式是實現 復用的主要途徑之一,而且函式的使用也可以使得程式更加容易理解,更加規範化。程式很多時候並不是給計算機的,而是給人看的。這裡總結一下python中的函式的應用 1 函式 首先python中的函式的格式是怎樣的。def 函式名 形參 函式體 下面是乙個計算fibonacci數列的函...

python學習之函式

抽象 斐波那契數列 fibs 0,1 for i in range 10 print fibs fibs 0,1 i 2 while i 20 i 1 print fibs 使用callable判斷函式是否可以呼叫 import math x 1 y math.sqrt print callable...

python學習之函式

一 函式 注 當乙個函式名字由兩個單詞組成的時候 第二個單詞的首字母大寫 統一 當我們定義乙個函式的時候 用def語句 def 函式名 引數列表,可以沒有引數 比如 i 1j 2 def add a,b return a b print add i,j 二 關於函式形預設引數 注 假如函式是有形參的...