有服務(wù)器可以做網(wǎng)站嗎站長(zhǎng)工具是什么意思
目錄
1.函數(shù)相關(guān)術(shù)語
2.函數(shù)類型分類
3.棧
4.位置參數(shù)和關(guān)鍵字參數(shù)
5.默認(rèn)參數(shù)
6.局部變量和全局變量
7.返回多個(gè)值
8.懷孕函數(shù)
9.匿名函數(shù)
10.可傳遞任意個(gè)數(shù)實(shí)參的函數(shù)
11.函數(shù)地址與函數(shù)接口
12.內(nèi)置函數(shù)修改與函數(shù)包裝
1.函數(shù)相關(guān)術(shù)語
函數(shù)的基本概念有函數(shù)頭,函數(shù)名,形參和實(shí)參,函數(shù)體,如下圖所示
- 參數(shù)是可選的,也就是說函數(shù)可以不包含參數(shù),比如 def main():
- 使用 return result 返回語句來返回一個(gè)值,函數(shù)為帶返回值的函數(shù)。
- 不使用 return 語句,函數(shù)為不帶返回值的函數(shù)。不用 return 的函數(shù),python 默認(rèn)函數(shù)末尾加上了一個(gè) return None,就是說返回了一個(gè) None,空值。
2.函數(shù)類型分類
def myfunc(a, b):result = 0for i in range(a, b + 1):result += ireturn result
def main():print("月滿則虧")print("水滿則溢")print("花滿則衰")print("愛滿則癡")main() # 執(zhí)行 main()
def nprint(n):for i in range(n):print("xxxxxx")print(nprint(2))
3.棧
示例代碼
def func(Data1, Data2):Data3 = Data1 * Data2return Data3ret = func(1, 2)
對(duì)于語句ret = func(1, 2),func在調(diào)用時(shí)會(huì)產(chǎn)生一個(gè)棧,實(shí)參傳遞給形參,以及函數(shù)體內(nèi)部的變量激活記錄都會(huì)逐步記錄在棧中(稱為"壓入棧"),函數(shù)調(diào)用完畢,這些記錄會(huì)逐步從棧中清除出去("出棧")。
棧的特點(diǎn):"后進(jìn)先出"。就是最后進(jìn)來的激活記錄先被彈出堆棧。
4.位置參數(shù)和關(guān)鍵字參數(shù)
調(diào)用函數(shù)時(shí),實(shí)參的值傳遞給形參,這個(gè)過程叫做值傳遞。值傳遞有多種方式,比如按默認(rèn)位置,或者使用關(guān)鍵字參數(shù)。比如下面這個(gè)例子中f函數(shù)有3個(gè)關(guān)鍵字參數(shù):x,y,z。
def f(x, y, z):return (x + y) / z# 使用位置參數(shù)調(diào)用函數(shù)
print(f(1, 2, 3)) # 1.0# 使用關(guān)鍵字參數(shù)調(diào)用函數(shù)
print(f(z=2, y=3, x=5)) # 4.0# 同時(shí)使用位置參數(shù)和關(guān)鍵字參數(shù)
print(f(7, z=3, y=2)) # 3.0
注意:調(diào)用函數(shù)時(shí),位置參數(shù)在左邊,關(guān)鍵字參數(shù)在右邊。
5.默認(rèn)參數(shù)
# 非默認(rèn)值參數(shù)必須在默認(rèn)值參數(shù)之前
def f(x, y=1, z=2):return x + y + zprint(f(1, 1, 1)) # 3
print(f(y=1, x=2, z=3)) # 6
print(f(1, z=3)) # 5
6.局部變量和全局變量
x = 1
y = 1
z = 1def f(x):global yx = 2y = 2z = 2f(100)
print(x) # 1
print(y) # 2
print(z) # 1
在以上代碼中:
- 一開始定義了x和y,它們是全局變量。
- 然后定義了一個(gè)函數(shù)f,形參有x,注意這里的x為函數(shù)的形參名,跟前面那個(gè)全局變量x不是同一個(gè)
- 函數(shù)體內(nèi)部先使用了global y語句,它的作用是函數(shù)內(nèi)部等會(huì)如果有y的調(diào)用,則y調(diào)用的是全局變量那個(gè)y。
- x = 2語句是一個(gè)賦值語句,注意這條賦值語句的x不是全局變量那個(gè)x,是形參變量x,因此全局變量那個(gè)x的值不會(huì)發(fā)生改變,仍為1
- y = 2語句:由于global y的作用,這里的y是全局變量的那個(gè)y,因此全局變量y的值會(huì)變成2
- z = 2語句:由于沒有g(shù)lobal z語句,這里的z是函數(shù)內(nèi)部產(chǎn)生的局部變量,因此這里的賦值語句不會(huì)對(duì)全局變量那個(gè)z造成影響。
7.返回多個(gè)值
def sort(n1, n2):if n1 < n2:return n1, n2return n2, n1print(sort(2, 3)) # (2, 3)
a, b = sort(3, 2)print(a) # 2
print(b) # 3def func(num1, num2):return num1 + num2, num1 - num2x = func(2, 3)
print(type(x)) # <class 'tuple'>
8.懷孕函數(shù)
懷孕函數(shù)就是函數(shù)內(nèi)部又定義了一個(gè)函數(shù)。
def Test():def TestX():print("hello world")for i in range(3):TestX()Test()
9.匿名函數(shù)
匿名函數(shù)就是函數(shù)的簡(jiǎn)潔表達(dá),使用關(guān)鍵字 lambda 實(shí)現(xiàn)。
# 例子1
myfunc = lambda a, b: a + b
print(myfunc(2, 3)) # 5# 例子2(用來裝逼)
ret = (lambda a, b: a * b)(4, 5)
print(ret) # 20
(lambda data: print(data))("hello world") # hello world
10.可傳遞任意個(gè)數(shù)實(shí)參的函數(shù)
在Python中,可以創(chuàng)建一個(gè)函數(shù),它可以接收任意數(shù)量的實(shí)參。這通過使用星號(hào)表達(dá)式()實(shí)現(xiàn)。星號(hào)運(yùn)算符有兩種形式:單星號(hào)(*)和雙星號(hào)(**)。
①單星號(hào)(*):將實(shí)參列表轉(zhuǎn)換為元組。
def mysum(*data):print(type(data)) # <class 'tuple'>ret = 0for x in data:ret += xreturn retprint(mysum(1, 2)) # 3
print(mysum(1, 2, 5, 7)) # 15
②雙星號(hào)(**):將字典轉(zhuǎn)換為關(guān)鍵字參數(shù)。
def mysum(**data):print(type(data)) # <class 'dict'>ret = 0for key in data:ret += data[key]print(key, data[key])return retprint(mysum(a=2, b=2, c=5, d=7)) # 這里用等號(hào),等號(hào)左邊為關(guān)鍵字,右邊為值print(mysum(x=2, y=3)) # 這里用等號(hào),等號(hào)左邊為關(guān)鍵字,右邊為值
③同時(shí)使用單星號(hào)(*)和雙星號(hào)(**):函數(shù)可以接收任意數(shù)量的實(shí)參,并且可以是以上兩種類型。
def print_args_kwargs(*args, **kwargs):print(args)print(kwargs)print_args_kwargs(1, 2, 3, a=1, b=2, c=3)
# 輸出: (1, 2, 3) {'a': 1, 'b': 2, 'c': 3}
11.函數(shù)地址與函數(shù)接口
函數(shù)的本質(zhì)是一個(gè)地址,可函數(shù)名賦值來實(shí)現(xiàn)相同功能
def myadd(num1, num2):return num1 + num2print(id(myadd)) # 2363817237224
print(type(myadd)) # <class 'function'>go = myadd # 注意軟件規(guī)范不允許這樣賦值,不然容易出問題
print(id(go), id(myadd)) # id 會(huì)相同
print(type(go), type(myadd)) # 類型都是函數(shù)ret = go(1, 2)
print(ret) # 3
函數(shù)名賦值實(shí)現(xiàn)函數(shù)的調(diào)用和定義的分離,實(shí)現(xiàn)函數(shù)接口,搭建框架。
# 函數(shù)的定義
def add(x, y):return x + y - 1# 函數(shù)的定義
def minus(x, y):return x - y + 10# 函數(shù)調(diào)用框架
def work(func_name, num1, num2):value = func_name(num1, num2)print(value)for i in range(value):print("hello world")return value + 1# 函數(shù)調(diào)用
work(add, 1, 2)# 函數(shù)調(diào)用
work(minus, 3, 4)
運(yùn)行結(jié)果
2
hello world
hello world
9
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
12.內(nèi)置函數(shù)修改與函數(shù)包裝
修改內(nèi)置函數(shù)
import osdef myprint(mystr):os.system("echo ---------------")if mystr.find("python is handsome.") != -1:os.system("echo " + mystr)else:os.system("echo " + "python is handsome!")os.system("echo " + mystr)print = myprint # 切換函數(shù)的地址
print("hello world")
print("Full love leads to madness")
運(yùn)行結(jié)果
---------------
python is handsome!
hello world
---------------
python is handsome!
Full love leads to madness
- 加密 or 保護(hù)費(fèi)
- 還可以給函數(shù)的使用加密
- 每次調(diào)用都要輸入密碼才行
示例代碼
import os# 備份原來的函數(shù)地址
backossystem = os.system# 等價(jià)的調(diào)用
# backossystem("notepad")# 需要收費(fèi)的系統(tǒng)
def system_check(mystr):if mystr.find("A") != -1:backossystem(mystr)else:print("請(qǐng)開通會(huì)員否則 " + mystr + " 無法執(zhí)行")# 修改內(nèi)置函數(shù)地址
os.system = system_check
os.system("echo hello world")
運(yùn)行結(jié)果
請(qǐng)開通會(huì)員否則 echo hello world 無法執(zhí)行
end