日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

第四篇 函数

發(fā)布時(shí)間:2024/10/12 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第四篇 函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一.函數(shù)的定義

# 函數(shù)的定義def 函數(shù)名(形參):'''文檔字符串函數(shù)功能:函數(shù)參數(shù):函數(shù)返回值'''function_bodyreturn [expression]# 函數(shù)的使用 函數(shù)名(實(shí)參) # 1. 函數(shù)的定義 def sayHello(name):print("你好,{},很高興再次見到你".format(name))return "{}來北京看我了".format(name)#函數(shù)的調(diào)用 print(sayHello("dali"))# 輸出 你好,dali,很高興再次見到你 dali來北京看我了

?

# 2. 函數(shù)可以沒有參數(shù) def Hello():a= 3+4return aprint(Hello())#輸出 7

?

# 3. 定義一個(gè)變量,給變量的賦值是個(gè)函數(shù)名,就相當(dāng)于把這個(gè)變量變成一個(gè)函數(shù)了def sayHello2(name):print("你好,{},很高興再次見到你".format(name))return 1 message = sayHello2 print(message("xiaochengzi"))# 輸出 你好,xiaochengzi,很高興再次見到你 1

二.函數(shù)的參數(shù)

1. 必備參數(shù) 或者 位置參數(shù)

位置參數(shù)的特點(diǎn):必須要給它傳值,位置在最前面,定義了幾個(gè)位置參數(shù),調(diào)用函數(shù)的時(shí)候就必須傳幾個(gè)參數(shù),否在會(huì)報(bào)錯(cuò)

# x,y 是位置參數(shù),位置參數(shù)就是必須參數(shù),函數(shù)調(diào)用時(shí)不能缺少 def add(x,y):return x+yprint(add(2,3)) #5 # 錯(cuò)誤示例 def add(x,y):return x+yprint(add(2)) # TypeError: add() missing 1 required positional argument: 'y'

2. 默認(rèn)參數(shù)

如果不想給某個(gè)參數(shù)傳值,但是參數(shù)個(gè)數(shù)還不減少,那可以在函數(shù)聲明時(shí)設(shè)置默認(rèn)參數(shù),就是給某個(gè)參數(shù)一個(gè)默認(rèn)值,

如果不傳值,函數(shù)調(diào)用時(shí),默認(rèn)就用的是設(shè)置的默認(rèn)參數(shù),如果傳值了,函數(shù)調(diào)用時(shí)就用的是傳的值

特點(diǎn):默認(rèn)參數(shù)的位置,一定要放到所有的位置參數(shù)的后面

# # j 定義時(shí)就給了個(gè)默認(rèn)參數(shù),如果j不傳值,就默認(rèn)取0, 默認(rèn)參數(shù)一定要放在所有參數(shù)的最后面 def add1(i,j=0):return i+jprint(add1(3)) # 3

3. 不定長(zhǎng)參數(shù)

如果函數(shù)聲明時(shí),還不能確定到底會(huì)有多少個(gè)參數(shù),可以定義不定長(zhǎng)參數(shù)

特點(diǎn):1) 不定長(zhǎng)參數(shù)用*args表示, 2) *args的類型是元組 3)它的位置必須在默認(rèn)參數(shù)后面

def add2(x,y=0,*args):print(args)return x + yprint(add2(2)) # 輸出 () # 此時(shí)x=2,y =0, *args沒有傳參,是個(gè)空元組 2print(add2(4,5)) #輸出 () # 此時(shí)x=4,y =5, *args沒有傳參,是個(gè)空元組 9print(add2(1,3,5,7,9)) # 輸出 (5, 7, 9) # 此時(shí)x=1,y =3, *args是個(gè)元組,其值是(5,7,9) 4 def add2(x,y=0,*args):print(args)return x + y + sum(args) # 使用參數(shù),要去掉*號(hào)print(add2(1,3,5,7,9))#輸出 (5, 7, 9) 25

4. 關(guān)鍵字參數(shù)

如果想傳的參數(shù)是字典,就可以用關(guān)鍵字參數(shù)

特點(diǎn):關(guān)鍵字參數(shù) **kargs ,其類型是字典,必須最最后面,以 a = 1的形式傳參

def add4(x,y,*args,**kwargs):print(kwargs)return x + y + sum(args) + sum(kwargs.values())print(add4(1,3,3,4,5,a=1,b=5,c=5,d=-5))# 輸出 {'a': 1, 'b': 5, 'c': 5, 'd': -5} # 此時(shí),x=1,y=3, args=(3,4,5),kwargs = {'a': 1, 'b': 5, 'c': 5, 'd': -5}22

5. 形參與實(shí)參

?

?

三.函數(shù)的作用域

函數(shù)作用域的尋找順序:Local -> enclosing->global -> build-in

1. L(Local)局部作用域

變量是在函數(shù)內(nèi)定義的

a = 3 # 全局作用域def scope():a = 5 # 局部作用域print(a)scope()# 輸出 5

?

2. E(Enclosing)閉包函數(shù)外的函數(shù)中

見后面閉包的介紹

?

3.G (Global)全局作用域

變量是在函數(shù)外定義的,是整個(gè)文件的

a = 3def scope():print(a)scope() #輸出 3

4. B(Built-in) 內(nèi)建作用域

Python 自帶的,預(yù)留的一些變量,函數(shù)名等

Python自帶的不太適合舉例說明

作用域的查找順序是先局部,后全局,最后再內(nèi)建,如果都沒有該變量,就會(huì)報(bào)錯(cuò)

def scope():print(a)scope()# NameError: name 'a' is not defined

5. 作用域有兩個(gè)函數(shù):Locals() 和 globals()

a = 3def scope():a = 5print(globals()) # 輸出 {'__name__': '__main__', '__doc__': '\n作用域生效機(jī)制\n局部 閉包函數(shù)外的函數(shù)中 全局 內(nèi)建\n\n', '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10511a470>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/qiaoersun/Documents/千萬別刪/測(cè)試/Codes/testfanStudyPractice/lesson02/作用域.py', '__cached__': None, 'a': 3, 'scope': <function scope at 0x10529bd08>}

暫時(shí)還沒弄明白

四.閉包(_closure_)

閉包的特點(diǎn):

1. 閉包函數(shù)必須有內(nèi)嵌函數(shù)

2. 內(nèi)嵌函數(shù)需要引用嵌套函數(shù)的變量

3. 閉包函數(shù)必須返回內(nèi)嵌函數(shù)

閉包的作用:

1. Python閉包就是裝飾器(或叫修飾器)

2. 在不改原有函數(shù)任何內(nèi)容的情況下,給原有函數(shù)增加功能

def greeting(name):'''1.在greeting函數(shù)中內(nèi)嵌了一個(gè)greet函數(shù)2.greeting函數(shù)的返回值是一個(gè)函數(shù)greet'''def greet():print(name)return greet # 函數(shù)的返回值是greet函數(shù)# 定義一個(gè)func變量,調(diào)用greeting函數(shù),因?yàn)間reeting函數(shù)的返回值是greet,而greet也是個(gè)函數(shù),所以就相當(dāng)于func是個(gè)函數(shù) # 此時(shí)只是返回了greet,greet函數(shù)并沒有被調(diào)用,所以也不會(huì)有任何返回值 func = greeting('老劉')# 那么再調(diào)用func這個(gè)函數(shù)就等于是調(diào)用的下面的部分 '''def greet():print(name) ''' func() # 輸出 老劉 # greeting()其實(shí)就是greet函數(shù),那么也可以用下面的方式調(diào)用 greeting("小貓")() # 輸出 小貓

對(duì)閉包函數(shù)的公式總結(jié)

def greeting(name):# 1. greeting函數(shù)里內(nèi)嵌,嵌套了一個(gè)greet函數(shù) --> 滿足了:閉包函數(shù)必須有內(nèi)嵌函數(shù)a = 5def greet():# 2.在內(nèi)嵌函數(shù)里引用了嵌套函數(shù)(greeting)的變量:a 和 name, 這個(gè)變量必須是內(nèi)嵌函數(shù)外層已經(jīng)定義的,不能是全局變量---># 滿足了:內(nèi)嵌函數(shù)必須要引用嵌套函數(shù)的變量print(name)print(a)# 3. greeting函數(shù)里返回了一個(gè)內(nèi)嵌函數(shù)greet--->滿足了:函數(shù)必須返回內(nèi)嵌函數(shù)return greet # 注意此處不能返回greet()# 4. 由上面3點(diǎn)的同時(shí)滿足,才使得greeting成為一個(gè)閉包函數(shù)# 5. 閉包函數(shù)的調(diào)用,在上面已經(jīng)有了,此處略

在Python里閉包其實(shí)就是裝飾器

五.裝飾器

?裝飾器的作用:就是為已經(jīng)存在的對(duì)象添加額外的功能

?裝飾器的應(yīng)用場(chǎng)景:插入日志,性能測(cè)試,事務(wù)處理,緩存,權(quán)限校驗(yàn)等等

示例:計(jì)算一個(gè)函數(shù)執(zhí)行用了多長(zhǎng)時(shí)間

''' 閉包的作用: 1. 在Python閉包就是裝飾器(或叫修飾器) 2. 在不改原有函數(shù)任何內(nèi)容的情況下,給原有函數(shù)增加功能利用閉包實(shí)現(xiàn)修飾器 '''''' 1. 計(jì)算原有函數(shù)wait()的執(zhí)行時(shí)間,但是不能改wait()函數(shù)的任何代碼 2. add()函數(shù),把a(bǔ)dd()執(zhí)行結(jié)果寫入一個(gè)文件,不能改變add()函數(shù)的任何值 '''import time import random''' 解決辦法:用閉包的方式解決,那么就要把原來已經(jīng)存在的功能,即函數(shù)作為參數(shù)傳遞給閉包,此處形參用func代替 閉包一定是寫在原還是的前面的 ''' # 2.用閉包的方式不改變?cè)a的情況下,新增計(jì)算時(shí)間的功能 def decorator(func):def wrapper():startTime = time.time()result = func()endTime = time.time()print("測(cè)試結(jié)束,花費(fèi)時(shí)間{}秒".format(endTime-startTime))return result # 上面已經(jīng)執(zhí)行過了result,這里為什么還要再返回一下result?不返回會(huì)有什么影響?return wrapper''' wait函數(shù)是已經(jīng)存在的一段代碼,假設(shè)有一萬行,突然有個(gè)需求,要在wait上加一個(gè)功能,計(jì)算wait函數(shù)執(zhí)行需要花多長(zhǎng)時(shí)間 如果直接在wait函數(shù)上改,可能會(huì)引起其他bug,第二你也懶得看wait的代碼,一個(gè)好的解決辦法就是使用閉包,用裝飾器來解決 這個(gè)問題 '''# 1. 已有的功能 def wait():w = random.randint(5,10)print(w)time.sleep(w)print("執(zhí)行wait完畢,用了{(lán)}秒".format(w))# 3. 調(diào)用閉包,獲取執(zhí)行結(jié)果 a = decorator(wait) # 相當(dāng)于a 就是 wrapper函數(shù)里 a() # 再調(diào)用wrapper函數(shù), 就能得到計(jì)算的結(jié)果# 輸出 9 執(zhí)行wait完畢,用了9秒 測(cè)試結(jié)束,花費(fèi)時(shí)間9.005208253860474秒

上面利用閉包寫好了修飾器,但是閉包的使用不是像上面那樣通過a = decorator(wait)()的方式使用的,而是通過在原有函數(shù)的上面加@閉包函數(shù)名的方式使用

import time import random# 2.用閉包的方式不改變?cè)a的情況下,新增計(jì)算時(shí)間的功能 def decorator(func):def wrapper():startTime = time.time()result = func()endTime = time.time()print("測(cè)試結(jié)束,花費(fèi)時(shí)間{}秒".format(endTime-startTime))return result return wrapper# 3.通過@閉包函數(shù)名的方式,實(shí)現(xiàn)裝飾器 @decorator # 1. 已有的功能 def wait():w = random.randint(5,10)print(w)time.sleep(w)print("執(zhí)行wait完畢,用了{(lán)}秒".format(w))# 4. 直接調(diào)用原函數(shù)就可以實(shí)現(xiàn)功能 wait()# 輸出 10 執(zhí)行wait完畢,用了10秒 測(cè)試結(jié)束,花費(fèi)時(shí)間10.002923727035522秒

?

# 示例2''' 已知:現(xiàn)有add函數(shù) 需求:add函數(shù)執(zhí)行結(jié)果寫到一個(gè)文件里去 '''def writeAddtoFile(func): # 閉包的參數(shù)func,將來傳的就是原有的功能函數(shù)add,這是永遠(yuǎn)不變的,套路,固定寫法;外面的函數(shù)傳函數(shù)名def wrapper(a,b): # 內(nèi)嵌函數(shù)的參數(shù),接受的是原函數(shù)add的參數(shù),這也是永遠(yuǎn)不變的,套路,固定寫法;里面的函數(shù)傳的才是參數(shù)result = func(a,b)with open("add.txt",'a',encoding='utf-8') as f:f.write(str(result)+"\n") # 換行寫入,要在寫入的內(nèi)容后面 加 +"\n" f.close()return wrapper@writeAddtoFile def add(x,y):return x+yadd(5,8) add(3,5) add(1,1) # 固定寫法 def deco(func): # 固定寫法,這里的func將來接收的是adddef wrapper(*args, **kargs): # 固定寫法:這里的參數(shù)將來接收的時(shí)候 add函數(shù)的a 和 b 兩個(gè)參數(shù)result = func(args, kargs) # 新功能在內(nèi)嵌函數(shù)里寫return resultreturn wrapper # 固定寫法;要把內(nèi)嵌的函數(shù)返回def add(a,b):pass

練習(xí):輸入某年某月某日,判斷這一天是這一年的第幾天?

import timedef calDay(date):'''輸入某個(gè)日期,計(jì)算是這一年的第幾天:param date::return:'''# 1. 先把輸入的日期格式化fenGefu = ['/','.','-','','']try:for i in date:if i in fenGefu:date=date.replace(i,'-')elif i == '':date=date.replace(i,"")# 2.利用time模塊函數(shù)得到forMatDate = time.strptime(date, '%Y-%m-%d')result = time.struct_time(forMatDate)# 3. 提取想要的結(jié)果返回days = result.tm_ydayreturn "{}是今年的地{}天".format(date, days)except Exception:print("您輸入的日期格式不對(duì),請(qǐng)檢查后重新輸入")date=input("請(qǐng)輸入年月日:")print(calDay(date))

?六.內(nèi)置函數(shù)

1. 類型轉(zhuǎn)換函數(shù)

bool , int , long ,float ,bytearray str, unicode, basestring,list tuple set,dict, frozenset, complex

2.文件IO

input, print, open,file, format

3. 數(shù)學(xué)運(yùn)算

abs,divmod, pow, sum, cmp, bin, oct, hex, chr, unichr, ord, max, min, round # 1. 求模求余 divmod(99,1) # (14,1)#2. 求冪 pow(2,3) $ 8# round()四舍五入, 有bug,慎用

?

4. 集合切片

len, range, iter, next, slice(切片), enumerate, sorted, reversed

?

data = ['a','b','c'] # enumerate 返回對(duì)象的下標(biāo) for i,v in enumerate(data):
print(i,v)

# 輸出

0 a
1 b
2 c

5. 高階函數(shù)

高階函數(shù):返回值是函數(shù),或者函數(shù)的參數(shù)是函數(shù)

any(任意一個(gè)滿足條件,返回True), all(所有滿足條件,返回TRUE), map,reduce, filter, zip

map,reduce,filter是Python里很常用的三個(gè)高階函數(shù)

map(func,iter):第一個(gè)參數(shù)是個(gè)函數(shù),第二個(gè)參數(shù)要是一個(gè)可迭代對(duì)象

# map的第一個(gè)參數(shù)是個(gè)函數(shù),第二個(gè)參數(shù)是個(gè)可迭代對(duì)象 # map的作用:對(duì)data數(shù)據(jù)里的每個(gè)元素,分別執(zhí)行函數(shù)pow # map的返回是個(gè)map對(duì)象,所以,map的兩種使用方法:1. 用list轉(zhuǎn)化, 2.用for循環(huán) data = [1,2,3,4,5,6,7,8,9] def pow(n):return n**n# map的第一個(gè)參數(shù)是個(gè)函數(shù),第二個(gè)參數(shù)是個(gè)可迭代對(duì)象 # map的作用:對(duì)data數(shù)據(jù)里的每個(gè)元素,分別執(zhí)行函數(shù)pow # map的返回是個(gè)map對(duì)象,所以,map的兩種使用方法:1. 用list轉(zhuǎn)化, 2.用for循環(huán)# 使用list獲取map的返回值 print(list(map(pow,data))) # 輸出 [1, 4, 27, 256, 3125, 46656, 823543, 16777216, 387420489]# map函數(shù)用for循環(huán)取結(jié)果 for p in map(pow,data):print(p)# 輸出 1 4 27 256 3125 46656 823543 16777216 387420489 # 還有更簡(jiǎn)單的,就是可以用lambda 匿名函數(shù),替換 pow函數(shù),就不用再定義上面的pow函數(shù)了print(map(lambda n: n**2, data))lambda 返回值:表達(dá)式

reduce(function,sequence): 第一個(gè)參數(shù)是個(gè)函數(shù),

reduce():折疊函數(shù),

# reduce函數(shù):折疊函數(shù) # 作用:類似于sum(), # 函數(shù)的運(yùn)行方式:data里的1和2先相加得到3,然后再用3+ data里的3,得到6,然后用6再加data里的4,依次類推,直到data的最后一個(gè)數(shù)from functools import reduce # reduce 在Python3里,要先導(dǎo)入才能使用 print(reduce(lambda x,y:x+y, data))
# 輸出 45

filter(func, iter):過濾器

作用:filter函數(shù)作為過濾器,挑選滿足條件的數(shù)據(jù)

# filter 函數(shù) # 作用:filter函數(shù)作為過濾器,挑選滿足條件的數(shù)據(jù) # 從data里挑選出奇數(shù) print(list(filter(lambda x:x % 2 !=0, data)))# 輸出 [1, 3, 5, 7, 9] # 從data里取出偶數(shù)print(list(filter(lambda x:x % 2 == 0, data )))# 輸出 [2, 4, 6, 8]

6. 反射與內(nèi)省

type, isinstance,issubclass,callable,staticmethod,classmethod,getattr, setattr, delattr,hasattr, super,dir,help,id,hash,object,__import__,compile,reload, repr,vars,locals,globals,eval,exec , execfile, property,memoryview

?

轉(zhuǎn)載于:https://www.cnblogs.com/victorm/p/11289624.html

總結(jié)

以上是生活随笔為你收集整理的第四篇 函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。