真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python全棧開發(fā)之函數(shù)有什么用-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)Python全棧開發(fā)之函數(shù)有什么用的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

成都創(chuàng)新互聯(lián)主要從事做網(wǎng)站、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)祁陽,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

No.1 函數(shù)介紹

所謂函數(shù),就是把具有獨(dú)立功能的代碼塊組織為一個小模塊,在需要的時候調(diào)用

函數(shù)的使用有兩個步驟:
1、定義函數(shù)
2、調(diào)用函數(shù)

函數(shù)的作用,代碼重用,提高開發(fā)效率

No.2 定義和調(diào)用

定義函數(shù)的格式如下:

def 函數(shù)名():

    函數(shù)封裝的代碼

def是英文define的縮寫

函數(shù)名稱應(yīng)該能夠表達(dá)函數(shù)封裝代碼的功能,方便后續(xù)的調(diào)用

函數(shù)名稱的命名應(yīng)該符合標(biāo)識符的命名規(guī)則

函數(shù)調(diào)用:

通過函數(shù)名()即可完成函數(shù)的調(diào)用

No.3 普通參數(shù)

def func(name): # name是形式參數(shù)
    print(name) # 函數(shù)體

func('kernel') # 執(zhí)行函數(shù),'kernel'是實(shí)參

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

定義了默認(rèn)參數(shù)后,在函數(shù)調(diào)用時不再需要傳入,默認(rèn)參數(shù)放在最后面

def info(name,age,country='China') # name,age是普通參數(shù),country是默認(rèn)參數(shù)
    print('name:',name)
    print('age:',age)
    print('國家:',country)

info('kernel',21) # 調(diào)用時,沒有傳入country,就使用默認(rèn)參數(shù)

No.5 關(guān)鍵參數(shù)

正常情況下,給函數(shù)傳遞參數(shù)需要按照定義的順序,不想按順序就要使用關(guān)鍵參數(shù),但是關(guān)鍵參數(shù)必須放在普通參數(shù)之后

def info(name,age,country='China') # name,age是普通參數(shù),country是默認(rèn)參數(shù)
    print('name:',name)
    print('age:',age)
    print('國家:',country)
info(age=21,name='kernel') # 使用關(guān)鍵參數(shù),可以不按照順序

No.6 元素和字典拆包

*args

def demo(*args):
    print(args) # ('kernel', 21, '山東')
demo("kernel",21,"山東")

**kargs

def demo(**kwargs):
    print(kwargs) # {'name': 'kernel', 'age': 21, 'address': '山東'}
demo(name="kernel",age=21,address="山東")

No.7 遞歸函數(shù)

特點(diǎn):

函數(shù)內(nèi)部調(diào)用自己

函數(shù)內(nèi)部的代碼是相同的,只是參數(shù)不同,處理結(jié)果不同

當(dāng)參數(shù)滿足一個條件時,函數(shù)不再執(zhí)行

栗子
data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
def binary_search(dataset,find_num):
    if len(dataset) >1:
        mid = int(len(dataset)/2)
        if dataset[mid] == find_num:  #find it
            print("找到數(shù)字",dataset[mid])
        elif dataset[mid] > find_num :# 找的數(shù)在mid左面
            print("找的數(shù)在mid[%s]左面" % dataset[mid])
            return binary_search(dataset[0:mid], find_num)
        else:# 找的數(shù)在mid右面
            print("找的數(shù)在mid[%s]右面" % dataset[mid])
            return binary_search(dataset[mid+1:],find_num)
    else:
        if dataset[0] == find_num:  #find it
            print("找到數(shù)字啦",dataset[0])
        else:
            print("沒的分了,要找的數(shù)字[%s]不在列表里" % find_num)
binary_search(data,66)

No.8 函數(shù)的可變參數(shù)和不可變參數(shù)

在函數(shù)中,針對參數(shù)使用賦值語句,會不會影響函數(shù)調(diào)用時的實(shí)參呢?

不會,只要針對參數(shù)使用賦值語句,無論是可變類型還是不可變類型,都會在函數(shù)修改參數(shù)的引用,不會影響到外部變量的引用

def demo(num, num_list):
    print("start")
    # 賦值語句
    num = 200
    num_list = [4,5,6]
    print("id=%d,num=%d"%(id(num),num))
    print("id=",id(num_list),"num_list=",num_list)
    print("end")

gl_num = 100 # id=1875081376,gl_num=100
gl_list = [1,2,3] # id= 2164478175240 gl_list [1, 2, 3]
print("id=%d,gl_num=%d"%(id(gl_num),gl_num)) # id=1875084576,num=200
print("id=",id(gl_list),"gl_list",gl_list) # id= 2164477982152 num_list= [4, 5, 6]
demo(gl_num, gl_list)
print("id=%d,gl_num=%d"%(id(gl_num),gl_num)) # id=1875081376,gl_num=100
print("id=",id(gl_list),"gl_list",gl_list) # id= 2164478175240 gl_list [1, 2, 3]

如果傳遞的參數(shù)是可變類型,在函數(shù)內(nèi)部,使用方法修改了數(shù)據(jù)的內(nèi)容,同樣會影響到外部的數(shù)據(jù)

def demo(name_list):
    name_list.append('end')
    print(name_list)
name_list = ['kernel']
print("id=",id(name_list),"name_list",name_list) # id= 1980496082376 name_list ['kernel']
demo(name_list)
print("id=",id(name_list),"name_list",name_list) # id= 1980496082376 name_list ['kernel', 'end']
demo(name_list)
print("id=",id(name_list),"name_list",name_list) # id= 1980496082376 name_list ['kernel', 'end','end']
我們發(fā)現(xiàn),外部變量的數(shù)據(jù)已經(jīng)被改變了,但是它的引用一直沒有改變
再看一個栗子
def demo(name_list=[]):
    name_list.append('end')
    print(name_list)
demo() # ['end']
demo() # ['end', 'end'] 
demo() # ['end', 'end', 'end']
demo() # ['end', 'end', 'end', 'end']
這不是我們想要的結(jié)果,那怎么辦呢?
我們只需要將形參改成一個不可變類型就可以了
def demo(name_list=None):
    name_list = []
    name_list.append('end')
    print(name_list)
demo() # ['end']
demo() # ['end']
demo() # ['end']
demo() # ['end']

No.9 高階函數(shù)

滿足下列條件之一就可以稱為高階函數(shù)

  • 存在一個參數(shù)為函數(shù)

  • 函數(shù)的返回值中存在函數(shù)

map函數(shù)

map函數(shù)是Python內(nèi)置的高階函數(shù),它接收一個函數(shù)和一個可迭代對象,并將函數(shù)作用在可迭代對象的每個元素上,返回一個map對象

def func(x):
    return x * x

r = map(func,range(10))
print(list(r)) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

reduce函數(shù)

reduce函數(shù)也是Python內(nèi)置的高階函數(shù),同樣它接收一個函數(shù)和一個可迭代對象,但是函數(shù)必須要接收兩個參數(shù),reduce對可迭代對象的每個對象調(diào)用函數(shù),并返回最終結(jié)果

栗子1
from functools import reduce
def func(x,y):
    return x * y

r = reduce(func,range(1,10))
print(r)
調(diào)用過程func(func(func(func(func(func(func(func(1,2),3),4),5),6),7),8),9)
栗子2
from functools import reduce
def func(x,y):
    return x * y

r = reduce(func,range(1,10),10)
print(r)
調(diào)用過程func(func(func(func(func(func(func(func(func(1,10),2),3),4),5),6),7),8),9)

filter函數(shù)

filter函數(shù)也是Python內(nèi)置的高階函數(shù),同樣它接收一個函數(shù)和一個可迭代對象,函數(shù)的作用是對每個元素進(jìn)行判斷,返回True和False,filter根據(jù)判斷結(jié)果自動過濾掉不符合條件的元素

def func(x):
    if x % 2 == 0:
        return x

r = filter(func,range(10))
print(list(r))

lambda函數(shù)

沒有函數(shù)名

單條語句

語句的執(zhí)行結(jié)果就是返回值

name_list = ['kernel','alex','qiyue','hobby','eric','aomikee']
r = sorted(name_list)
print(r)
r = sorted(name_list,key=lambda x:len(x))
print(r)

No.10 函數(shù)閉包

內(nèi)部函數(shù)

def outer():
    print('outer is running。。。')
    def inner():
        print('inner is running。。。')
    inner()
outer()
outer is running。。。
inner is running。。。
內(nèi)部函數(shù)inner存在于outer函數(shù)作用域內(nèi)部,所以如果在outer外部區(qū)域調(diào)用inner函數(shù)就會報(bào)錯

關(guān)于閉包

def outer():
    x = 10
    y = 10
    def inner():
        print(x+y)
    return inner

fun = outer()
fun() # 20
如果試圖在一個內(nèi)部函數(shù)里對外部函數(shù)的變量進(jìn)行引用,這就是Python的閉包,由于閉包基于內(nèi)部函數(shù),所以閉包同樣不能在外部進(jìn)行調(diào)用

修改外部函數(shù)的變量

def outer():
    x = 10
    y = 10
    def inner():
        x = x + 1
        print(x+y)
    return inner

fun = outer()
fun() # UnboundLocalError: local variable 'x' referenced before assignment

因?yàn)殚]包是基于內(nèi)部函數(shù)的,所以說將會啟動Python解釋器的屏蔽機(jī)制,這時候Python解釋器就認(rèn)為x是內(nèi)部函數(shù)的局部變量,我們此舉正是試圖對不存在的變量進(jìn)行修改操作,所以報(bào)在定義之前引用錯誤,那么,怎么解決這個問題呢

Python2

如果外部函數(shù)作用域的變量是可變類型的,那么它就不會被Python解釋器屏蔽掉
def outer():
    x = [10]
    y = 10
    def inner():
        x[0] = x[0] + 1
        print(x[0]+y)
    return inner

fun = outer()
fun() # 21

Python3

使用nonlocal關(guān)鍵字
def outer():
    x = [10]
    y = 10
    def inner():
        nonlocal x
        x = x + 1
        print(x+y)
    return inner

No.11 作用域

塊級作用域

想想下面的程序會運(yùn)行成功嗎?為什么?

for i in range(10):
    pass

print(i) # 9
代碼執(zhí)行成功,在Java/C#等強(qiáng)類型語言中,執(zhí)行上面的語言會提示i沒有定義,而在Python中確是可以執(zhí)行的,那是因?yàn)镻ython中沒有塊級作用域,代碼內(nèi)的變量,外部可以調(diào)用

局部作用域

def say_hello():
    name = 'kernel'
    print('hello ',name)

print(name) # NameError: name 'name' is not defined
運(yùn)行報(bào)錯,name變量只在函數(shù)中起作用,所以全局是無法調(diào)用的

作用域鏈

Python存在作用域鏈,首先從自己的作用域找,如果沒有就去一級一級的往上找,如果沒有找到就報(bào)錯

name = "Alex"
def f1():
    name = "Eric"
    def f2():
        name = "Kernel"
        print(name)
    f2()

f1() # Kernel

栗子

name = "kernel"
def f1():
    print(name)

def f2():
    name = "eric"
    f1()

f2() # Kernel
為什么會輸入Kernel而不是eric呢?
那是因?yàn)楹瘮?shù)在未執(zhí)行時,作用域鏈就已經(jīng)形成了,所以f1會去全局變量中找name這個變量而不是f2
r = ([lambda :x for x in range(10)])

print(type(r))
for i in r:
    print(type(i))
    print(i())
返回的結(jié)果是一個列表類型,列表的每個元素是一個函數(shù),所有的函數(shù)運(yùn)行出來都是9,為什么呢?
那是因?yàn)楹瘮?shù)在沒有執(zhí)行的時候,內(nèi)部代碼是不會執(zhí)行的

感謝各位的閱讀!關(guān)于“Python全棧開發(fā)之函數(shù)有什么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


網(wǎng)頁題目:Python全棧開發(fā)之函數(shù)有什么用-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://weahome.cn/article/coodgs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部