概念高階用法
"""
語法:關鍵字 函式名(引數列表):
函式體引數順序:
位置引數: a, b, c
未知數量位置引數, *args, 接收進函式內的型別為 tuple
關鍵字引數: key=none
未知關鍵字引數, **kwargs, 接收進函式內的型別為 dict
"""# 順序: 位置引數 -> *args -> 關鍵字引數 -> **kwargs
deffunc
(a,*args, b=
none
,**kwargs)
(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)
(args, kwargs)
t =(1,
2,3)
d =a(t, d)
# ((1, 2, 3), ) {}, 並未將 dict 中的鍵值對作為關鍵字引數傳入
a(*t,
**d)
# (1, 2, 3)
作用域
取值順序
載入順序
"""
區域性命名空間, 列印該區域性空間的所有變數
全域性命名空間, 無論放在**, 只列印全域性的, 不列印區域性的
"""defx()
: i =
20print
(locals()
)# 結果:
(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__"
(x()
)#(100, 2000)
"""
內層函式對外層函式的非全域性變數進行引用, 就是閉包
可以使用 __closeure__ 進行判斷, 如果是, 則返回乙個記憶體位址, 如果不是, 則返回為空
"""def
func_outside()
:# 這個是外層函式的非全域性變數
x =10# 這個就是內層函式
deffunc_inside()
:# 這裡對外層變數 x 進行引用, 不需要做任何操作
nonlocal x
# 執行內層函式
b()# 通過__closure__方法判斷
(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
(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
(i)funcb(l)
二分查詢演算法"""
省/市 -> 區 -> 地名 -> 公司名
"""menu =
,'朝陽':,
'東城':,
},'山東':,
}def
choose_menu
(d):
# 判斷是否在無法展開的子選單(因為只有最末端為 list 型別)
iftype
(d)==
list
("查詢結果為 %s"
%str
(list
(d))
)else
:# 展示選單
for i in d:
(i, end=
" ")
# 拿到查詢選項
k =input
("input: "
)# 判斷如果選項在選單中, 且選單內容不為空
if k in d and
len(d[k])!=
0:choose_menu(d[k]
)else
("查詢結果為空"
)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中的索引
(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 二 關於函式形預設引數 注 假如函式是有形參的...