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

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

六、函數(shù)的基本使用

一、認(rèn)識(shí)函數(shù)

創(chuàng)新互聯(lián)建站企業(yè)建站,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),專(zhuān)注于網(wǎng)站建設(shè)技術(shù),精于網(wǎng)頁(yè)設(shè)計(jì),有多年建站和網(wǎng)站代運(yùn)營(yíng)經(jīng)驗(yàn),設(shè)計(jì)師為客戶打造網(wǎng)絡(luò)企業(yè)風(fēng)格,提供周到的建站售前咨詢(xún)和貼心的售后服務(wù)。對(duì)于成都做網(wǎng)站、網(wǎng)站建設(shè)中不同領(lǐng)域進(jìn)行深入了解和探索,創(chuàng)新互聯(lián)在網(wǎng)站建設(shè)中充分了解客戶行業(yè)的需求,以靈動(dòng)的思維在網(wǎng)頁(yè)中充分展現(xiàn),通過(guò)對(duì)客戶行業(yè)精準(zhǔn)市場(chǎng)調(diào)研,為客戶提供的解決方案。

1 什么是函數(shù)
    函數(shù)就是具備某一功能的工具


2 為什么要用函數(shù)
    1  程序的組織結(jié)構(gòu)不清晰,可讀性差
    2  代碼冗余
    3  可擴(kuò)展性差

3 如何用函數(shù)
    函數(shù)的使用必須遵循的原則:先定義,后調(diào)用
        修理工事先準(zhǔn)備工具的過(guò)程即函數(shù)的定義
        修理工遇到應(yīng)用場(chǎng)景拿來(lái)工具就用即函數(shù)的調(diào)用

    語(yǔ)法:
        def 函數(shù)名(參數(shù)1,參數(shù)2,...):
            """
            文檔注釋
            """
            code1
            code2
            code3
            ......
            return 返回值

        def:定義函數(shù)的關(guān)鍵字
        函數(shù)名: 就相當(dāng)于一個(gè)變量名,指向函數(shù)的內(nèi)存地址,
                注意:函數(shù)的內(nèi)存地址()就可以出發(fā)函數(shù)體代碼的執(zhí)行

        參數(shù): 參數(shù)是函數(shù)的調(diào)用者為函數(shù)體代碼傳值的媒介,在python中函數(shù)的參數(shù)無(wú)需聲明類(lèi)型
        """文檔注釋""" : 推薦寫(xiě)上
        代碼塊:就是函數(shù)體功能的具體實(shí)現(xiàn)
        return 返回值 :函數(shù)體代碼塊運(yùn)行的成果


    函數(shù)的使用分為兩個(gè)階段:
        定義階段: 只檢測(cè)語(yǔ)法,不執(zhí)行代碼
        調(diào)用階段:運(yùn)行函數(shù)體代碼
            def foo():
                xxx
                print(

# 先定義

def foo():
    print("from foo")

# 后調(diào)用

# 定義時(shí)無(wú)參,意味著調(diào)用時(shí)也無(wú)需傳入?yún)?shù)

print(foo)
foo()

# 先定義

def bar(x,y):
    print(x)
    print(y)

# 后調(diào)用

# 定義時(shí)無(wú)參,意味著調(diào)用時(shí)也必須傳入?yún)?shù)

bar('a',2)

# 定義無(wú)參函數(shù):當(dāng)函數(shù)體的代碼邏輯不依賴(lài)任何傳入的值就能執(zhí)行,就不需要定義參數(shù)

def print_msg():
    print('='*50)
    print('welecome.....'.center(50,' '))
    print('='*50)
print_msg()
print_msg()
-----------------------------------------------------------------
==================================================
                  welecome.....                   
==================================================
==================================================
                  welecome.....                   
==================================================

#定義有參函數(shù):當(dāng)函數(shù)體的代碼邏輯依賴(lài)于外部調(diào)用者傳入的值才能執(zhí)行,必須定義參數(shù)用來(lái)接收外部傳入的值

def max2(x,y):
    # x=1
    # y=3
    if x > y:
        print(x)
    else:
        print(y)
max2(1,4)
---------------------------------
4

# 定義階段

def foo():
    print('from foo')
    bar()
def bar():
    print('from bar')

# 調(diào)用階段

foo()

# 定義階段

def foo():
    print('from foo')
    bar()

# 調(diào)用階段

foo()
def bar():
    print('from bar')

二、定義函數(shù)的三種形式

1 無(wú)參函數(shù)

def foo():
    print('from foo')
foo()

2 有參函數(shù)

def bar(x,y):
    print(x,y)
bar(1,2)

3 空函數(shù)

def func():
    pass

三、調(diào)用函數(shù)的三種形式

1 #語(yǔ)句形式

def foo():
    print('from foo')
foo()

2 表達(dá)式形式

def foo(x,y):
    res = x + y
    return res

res=foo(1,2) #表達(dá)式形式
res1=foo(1,2)*100
print(res1)

3 可以當(dāng)作參數(shù)傳給另外一個(gè)函數(shù)

def max2(x,y):
    if x > y:
        return x
    else:
        return y
res=max2(max2(1,2),3)
print(res)

四、函數(shù)的返回值

#一 函數(shù)的返回值需要注意:
#1 返回值沒(méi)有類(lèi)型限制
#2 返回值沒(méi)有個(gè)數(shù)限制
#  返回1個(gè)值:調(diào)用函數(shù)拿到的結(jié)果就是一個(gè)值
#  返回多個(gè)值:調(diào)用函數(shù)拿到的結(jié)果就是一個(gè)元組
#  返回0個(gè)值,或者不寫(xiě)return:調(diào)用函數(shù)拿到的結(jié)果就是None

#二 return關(guān)鍵字:return是函數(shù)結(jié)束的標(biāo)志,函數(shù)內(nèi)可以有多個(gè)return,但只要執(zhí)行一次,整個(gè)函數(shù)就結(jié)束

def f1():
    print('first')
    return 1
    print('second')
    return 2
    print('third')
    return 3
res=f1()
print(res)
----------------------------------------
first
1

def foo():
    count=1
    while True:
        print(count)
        if count == 3:
            return
        count+=1
foo()
------------------------------------------------------
1
2
3

def bar():
    pass
def foo():
    return [1,2],1,1.3,{'x':1},bar
res=foo()
print(res)
----------------------------------------------------------------
([1, 2], 1, 1.3, {'x': 1}, )

def func():
    print('from foo')
    # return

res=func()
print(res)
----------------------------------------------------------------------------
from foo
None

五、函數(shù)參數(shù)的使用

#函數(shù)的參數(shù)分為兩大類(lèi):
#1 形參: 指的是在定義函數(shù)階段括號(hào)內(nèi)指定變量名,即形參本質(zhì)就是"變量名"

#2 實(shí)參: 指的是在調(diào)用函數(shù)階段括號(hào)內(nèi)傳入的值,即實(shí)參本質(zhì)就是"值"

# 形參與實(shí)參的關(guān)系:在調(diào)用函數(shù)時(shí),會(huì)將實(shí)參(值)賦值(綁定)給形參(變量名),
# 這種綁定關(guān)系在函數(shù)調(diào)用時(shí)臨時(shí)生效,在調(diào)用結(jié)束后就失效了

def foo(x,y): # x=1 y=2
    # x=1
    # y=2
    print(x,y)
foo(1,2)

# 形參與實(shí)參的具體分類(lèi)
# 一 位置參數(shù)
# 1.1 位置形參: 在定義函數(shù)階段按照從左到右的順序依次定義的形參,稱(chēng)之為位置形參
# 注意:但凡按照位置定義的形參,必須被傳值,多一個(gè)不行,少一個(gè)也不行(一一對(duì)應(yīng))

def foo(x,y):
    print(x,y)
foo(1,2)

# 1.2 位置實(shí)參: 在調(diào)用函數(shù)階段按照從左到右的順序依次傳入的值,稱(chēng)之為位置實(shí)參
# 注意:但凡按照位置定義的實(shí)參,會(huì)與形參一一對(duì)應(yīng)

二 關(guān)鍵字參數(shù)
#關(guān)鍵字實(shí)參: 在調(diào)用函數(shù)階段,按照key=value的形式指名道姓地為形參傳值
#注意:
#1. 可以完全打亂順序,但仍然能指名道姓為指定的形參傳值
#2. 可以混合使用位置實(shí)參與關(guān)鍵字實(shí)參,但是必須注意:
#    2.1 位置實(shí)參必須放到關(guān)鍵字實(shí)參前面
#    2.2 不能對(duì)一個(gè)形參重復(fù)賦值

def foo(name,age):
    print(name,age)
foo('egon',18)
foo(18,'egon')
foo(age=18,name='egon')
foo('egon',age=18)

# 三 默認(rèn)參數(shù)
#默認(rèn)參數(shù):指的是在定義函數(shù)階段,就已經(jīng)為某個(gè)形參賦值了,改形參稱(chēng)之為有默認(rèn)值的形參,簡(jiǎn)稱(chēng)默認(rèn)形參
#注意:
#1. 在定義階段就已經(jīng)被賦值,意味著在調(diào)用階段可以不用為其賦值
#2. 位置形參應(yīng)該放到默認(rèn)形參前面
#3. 默認(rèn)參數(shù)的值在函數(shù)定義階段就已經(jīng)固定死了
#4. 默認(rèn)參數(shù)的值通常應(yīng)該是不可變類(lèi)型

def foo(x,y=2):
    print(x,y)
foo(1)
foo(1,3)
foo(y=3,x=1)
----------------------------
1 2
1 3
1 3

-

m=10              ## 必須要放在上面才可以被賦值到
def foo(x,y=m):
    print(x,y)

m=20                 #定義時(shí)不能定義在函數(shù)后面,否則會(huì)報(bào) m 沒(méi)有定義
foo(1)
-------------------------
1 10
def register(name,hobby,l=[]):
    l.append(hobby)
    print('%s 的愛(ài)好為 %s' %(name,l))

register('yxx','不洗澡')
register('egon','read')
-----------------------------
yxx 的愛(ài)好為 ['不洗澡']
egon 的愛(ài)好為 ['不洗澡', 'read']

def register(name, hobby, l=None):
    if l is None:
        l=[]
    l.append(hobby)
    print('%s 的愛(ài)好為 %s' % (name, l))

register('yxx', '不洗澡',[])
register('egon', 'read',[])
--------------------------------------------------
yxx 的愛(ài)好為 ['不洗澡']
egon 的愛(ài)好為 ['read']

# 位置形參vs默認(rèn)形參
# 對(duì)于大多情況下傳的值都不相同的,應(yīng)該定義成位置形參
# 對(duì)于大多情況下傳的值都相同的,應(yīng)該定義成默認(rèn)形參

def register(name,age,sex='男'):
    print(name,age,sex)
register('李鐵蛋',18,)
register('劉二丫',19,'女')

# 四 可變長(zhǎng)度的參數(shù)
# 站在實(shí)參的角度,參數(shù)長(zhǎng)度可變指的是在調(diào)用函數(shù)時(shí),傳入的實(shí)參值的個(gè)數(shù)不固定
#而實(shí)參的定義方式無(wú)法兩種:位置實(shí)參,關(guān)鍵字實(shí)參,對(duì)應(yīng)著形參也必須有兩種解決方案*與**,類(lèi)分別應(yīng)對(duì)溢出的位置實(shí)參與關(guān)鍵字實(shí)參
 
#1. 在形參中帶*:會(huì)將調(diào)用函數(shù)時(shí)溢出位置實(shí)參保存成元組的形式,然后賦值*后的變量名

def foo(x,y,*z): #z=(3,4,5,6)
    print(x,y,z)
foo(1,2,3,4,5,6)

# 2. 在實(shí)參中帶*: 但凡在實(shí)參中帶*星的,在傳值前都先將其打散成位置實(shí)參,再進(jìn)行賦值

def foo(x,y,*z): #z=(3,4,5,6)
    print(x,y,z)
foo(1,*[2,3,4,5,6]) # foo(1,2,3,4,5,6)
#
def foo(x,y,z):
    print(x,y,z)
foo(*(1,2,3)) #foo(1,2,3)
foo(*'abc')  #foo('a','b','c')

# 3. 在形參中帶**:會(huì)將調(diào)用函數(shù)時(shí)溢出關(guān)鍵字實(shí)參保存成字典的形式,然后賦值**后的變量名

def foo(x,y,**z): #z={'z':3,'a':1,'b':2}
    print(x,y,z)
foo(1,y=2,a=1,b=2,c=3)
foo(1,2,**{"r":4,'g':9}) # 正確的
------------------------------------------
1 2 {'a': 1, 'b': 2, 'c': 3}
1 2 {'r': 4, 'g': 9}
# 錯(cuò)誤方式:
# foo(1,2,{"r":4,'g':9})  # 錯(cuò)誤的  #不能直接接收以字典的形式,可以是以關(guān)鍵字傳入例如:(a=1,b=2),或是將字典的形式打散 例如: **{"a":1,'b':2}

# 4. 在實(shí)參中帶**: 但凡在實(shí)參中帶**星的,在傳值前都先將其打散成關(guān)鍵字實(shí)參,再進(jìn)行賦值

def foo(x,y,**z): #z={'a':100,'b':200}
    print(x,y,z)
foo(1,**{'a':100,'b':200,'y':111}) #foo(1,b=200,a=100,y=111)
---------------------------
1 111 {'a': 100, 'b': 200}

def foo(x,y,z):
    print(x,y,z)
foo(**{'y':111,'x':222,'z':333}) #foo(z=333,x=222,y=111)
------------------------------------
222 111 333

#5. 規(guī)范: 在形參中帶*與**的,*后的變量名應(yīng)該為args,**后跟的變量名應(yīng)該時(shí)kwargs

def foo(*args,**kwargs): #args=(1,2,3,4,5) kwargs={'a':1,'b':2,'c':3}
    print(args)
    print(kwargs)
foo(1,2,3,4,5,a=1,b=2,c=3)
------------------------------------
(1, 2, 3, 4, 5)
{'a': 1, 'b': 2, 'c': 3}

注意:

!!!!!!!!!!!當(dāng)我們想要將傳給一個(gè)函數(shù)的參數(shù)格式原方不動(dòng)地轉(zhuǎn)嫁給其內(nèi)部的一個(gè)函數(shù),應(yīng)該使用下面這種形式

def bar(x,y,z):
    print(x,y,z)

def wrapper(*args,**kwargs): #args=(1,2) kwargs={'z':3}
    bar(*args,**kwargs)
    #bar(*(1,2),**{'z':3})  #bar(1,2,z=3)
wrapper(1,2,z=3) # 雖然調(diào)用的是wrapper,但是要遵循的確是bar的參數(shù)標(biāo)準(zhǔn)
---------------------------------
1 2 3

五 命名關(guān)鍵字參數(shù): 放到*與**之間的參數(shù)稱(chēng)之為命名關(guān)鍵字參數(shù)
# 注意: 命名關(guān)鍵字參數(shù)必須按照key=value的形式傳值

def foo(x,y,*args,m,n,**kwargs): #args=(3,4,5,6,7,8)
    print(x,y) # 1,2
    print(args) #(3,4,5,6,7,8)
    print(m,n) #222,333
    print(kwargs)
foo(1,2,3,4,5,6,7,8,n=333,m=222,a=1,b=2)
--------------------------------
1 2
(3, 4, 5, 6, 7, 8)
222 333
{'a': 1, 'b': 2}

def foo(*,x=1,y):
    print(x)
    print(y)
foo(y=2222,x=1111)
foo(y=2222)
-----------------------------------
1111
2222
1
2222

def foo(x,y=1,*args,m,**kwargs):
    print(x)
    print(y)
    print(args)
    print(m)
    print(kwargs)
foo('from x',ars='tuple',m='from m',kw='from kw',ar='args')
-----------------------------------------
from x
1
()
from m
{'ars': 'tuple', 'kw': 'from kw', 'ar': 'args'}

作業(yè):

默寫(xiě):
    函數(shù)中參數(shù)的分類(lèi) 及其作用  位置 關(guān)鍵字  形參 實(shí)參 可變長(zhǎng)度參數(shù)
分類(lèi):形參,實(shí)參
作用:
位置:位置形參,位置實(shí)參
關(guān)鍵字:關(guān)鍵字實(shí)參: 在調(diào)用函數(shù)階段,按照key=value的形式指名道姓地為形參傳值

形參:指的是在定義函數(shù)階段括號(hào)內(nèi)指定變量名,即形參本質(zhì)就是"變量名"
實(shí)參:指的是在調(diào)用函數(shù)階段括號(hào)內(nèi)傳入的值,即實(shí)參本質(zhì)就是"值"
可變長(zhǎng)度參數(shù):
站在實(shí)參的角度,參數(shù)長(zhǎng)度可變指的是在調(diào)用函數(shù)時(shí),傳入的實(shí)參值的個(gè)數(shù)不固定,而實(shí)參的定義方式無(wú)法兩種:位置實(shí)參,關(guān)鍵字實(shí)參,對(duì)應(yīng)著形參也必須有兩種解決方案*與**,類(lèi)分別應(yīng)對(duì)溢出的位置實(shí)參與關(guān)鍵字實(shí)參

練習(xí)題:
    1.使用函數(shù)新的知識(shí)點(diǎn)繼續(xù)完善,優(yōu)化購(gòu)物車(chē)

    2.使用函數(shù)完成以下功能,數(shù)據(jù)格式如下
    [
        {“name”:”張無(wú)忌”,”number”,”sh01”,”math”:90,”english”:87,”chinese”:56},
        {“name”:”武則天”,”number”,”sh02”,”math”:40,”english”:97,”chinese”:67}....

    ]
    提供以下功能函數(shù)
        獲取指定學(xué)生的成績(jī)
        獲取指定學(xué)號(hào)的成績(jī)
        根據(jù)學(xué)生的學(xué)號(hào)修改姓名
        根據(jù)姓名修改指定學(xué)科的成績(jī)
        刪除指定學(xué)生及其成績(jī)

    3.博客作業(yè) http://www.cnblogs.com/linhaifeng/articles/7531972.html#_label5

拓展:
    ATM 參考博客

六、函數(shù)對(duì)像

1、函數(shù)是第一類(lèi)對(duì)象: 指的是函數(shù)名指向的值(函數(shù))可以被當(dāng)作數(shù)據(jù)去使用

def func(): # func=函數(shù)的內(nèi)地址
    print('from func')

print(func)  # 打印出 func=函數(shù)的內(nèi)地址

# 1. 可以被引用
age=10
x=age
print(x,age)
f=func
print(f)
f()

# 2. 可以當(dāng)作參數(shù)傳給另外一個(gè)函數(shù)
def bar(x):
    print(x)
bar(age)
bar(func)

# 3. 可以當(dāng)作一個(gè)函數(shù)的返回值
def bar(x):
    return x
res=bar(age)
print(res)
res=bar(func)
print(res)

# 4. 可以當(dāng)作容器類(lèi)型的元素
l=[age,func,func()]
print(l)

-------------------------------------------------------------------------------------------------------------------------------------------

def login():
    print('login')

def register():
    print('register')

def shopping():
    print('shopping')

def pay():
    print('pay')


def transfer():
    print('transfer')

func_dic={
    '1':login,
    '2':register,
    '3':shopping,
    '4':pay,
    '5':transfer
}
print(func_dic)

msg="""
0 退出
1 登陸
2 注冊(cè)
3 購(gòu)物
4 支付
5 轉(zhuǎn)賬
"""

while True:
    print(msg)
    choice=input('請(qǐng)輸入您的操作: ').strip()
    if choice == '0':break
    if choice == '1':
        login()
    elif choice == '2':
        register()
    elif choice == '3':
        shopping()
    elif choice == '4':
        pay()
    else:
        print('輸入錯(cuò)誤指令,請(qǐng)重新輸入')
    if choice in func_dic:
        func_dic[choice]()
    else:
        print('輸入錯(cuò)誤指令,請(qǐng)重新輸入')
        
#     拆分:
#    print(func_dic["1"]()) 
#    或者
#    f=func_dic["1"]
#    f()

七、函數(shù)嵌套

#  函數(shù)嵌套分為兩大類(lèi)

# 一: 函數(shù)的嵌套調(diào)用:在調(diào)用一個(gè)函數(shù)過(guò)程中,其內(nèi)部代碼又調(diào)用了其他函數(shù)

def bar():
    print('from bar')
def foo():
    print('from foo')
    bar()
foo()
--------------------------------------------------------------------
def max2(x,y):
    if x > y:
        return x
    elif x

#二:函數(shù)的嵌套定義:一個(gè)函數(shù)內(nèi)部又定義了另外一個(gè)函數(shù)

def outter():
    x=1
    print('from outter')
    def inner():
        print('from inner')
    print(x)
    print(inner)
    inner()
outter()
------------------------------------------------------------
from outter
1
.inner at 0x000001E5234C5510>
from inner
def f1():
    print('from f1')
    def f2():
        print('from f2')
        def f3():
            print('from f3')
        f3()
    f2()
f1()
-------------------------------------------
from f1
from f2
from f3
from math import pi
print(pi)

def circle(radius,action=0):
    """
    圓形相關(guān)運(yùn)算
    :param radius: 半徑
    :param action: 0代表求面積,1代表求周長(zhǎng)
    :return: 面積或者周長(zhǎng)
    """
    def area(radius):
        return pi * (radius ** 2)

    def perimiter(radius):
        return 2 * pi * radius

    if action == 0:
        res=area(radius)
    elif action == 1:
        res=perimiter(radius)
    return res
print(circle(10,0))
print(circle(10,1))
-----------------------------------------------
3.141592653589793
314.1592653589793
62.83185307179586


八、名稱(chēng)空間與作用域

1 什么是名稱(chēng)空間namespace
    名稱(chēng)空間就是用來(lái)存放名字與值內(nèi)存地址綁定關(guān)系的地方(內(nèi)存空間)

    age=18
    但凡查找值一定要通過(guò)名字,訪問(wèn)名字必需去查找名稱(chēng)空間


2 名稱(chēng)空間分為三大類(lèi)
    內(nèi)置名稱(chēng)空間:存放的是python解釋器自帶的名字
                例如:
                    len
                    max
                    print

    全局名稱(chēng)空間:存放的是文件級(jí)別的名字
            例如:以下名字中x\y\z\b\foo都會(huì)存放于全局名稱(chēng)空間中
            x=1
            y=2
            if x == 1:
                z=3

            while True:
                b=4
                break

            def foo():
                m=3

    局部名稱(chēng)空間:在函數(shù)內(nèi)定義的名字
            例如:
                foo內(nèi)的m這個(gè)名字一定是存放于一個(gè)局部名稱(chēng)空間中


    生命周期:
        內(nèi)置名稱(chēng)空間:在解釋器啟動(dòng)時(shí)則生效,解釋器關(guān)閉則失效
        全局名稱(chēng)空間:在解釋器解釋執(zhí)行python文件時(shí)則生效,文件執(zhí)行完畢后則失效
        局部名稱(chēng)空間:只在調(diào)用函數(shù)時(shí)臨時(shí)產(chǎn)生該函數(shù)的局部名稱(chēng)空間,改函數(shù)調(diào)用完畢則失效

    加載順序:
        內(nèi)置->全局->局部
    調(diào)用順序:(從當(dāng)前往外找,以下順序不變)
        局部-> 全局-> 內(nèi)置
    查找名字的順序:
        基于當(dāng)前所在位置往上查找
            假設(shè)當(dāng)前站在局部,查找順序:局部->全局->內(nèi)置
            假設(shè)當(dāng)前站在全局,查找順序:全局->內(nèi)置

# 案列一:

len=111
def foo():
    len=222
    print(len)
foo()
print('站在全局找len: ',len)
--------------------------------------
222
站在全局找len:  111
x=111
def f1():
    x=222
    def f2():
        def f3():
            x=444
            print(x)
        x=333
        f3()
    f2()
f1()
--------------------------------
444

# (******)名字的查找順序,在函數(shù)定義階段就已經(jīng)固定死了(即在檢測(cè)語(yǔ)法時(shí)就已經(jīng)確定了名字的查找順序),與函數(shù)的調(diào)用位置無(wú)關(guān),也就是說(shuō)無(wú)論在任何地方調(diào)用函數(shù),都必須回到當(dāng)初定義函數(shù)的位置去確定名字的查找關(guān)系#

# 案列二:

x=111
def outer():
    def inner():
        print('from inner',x) # x訪問(wèn)的是全局名稱(chēng)空間中x
    return inner
f=outer()
print(f)
x=222
# 因?yàn)榇a是從上往下讀,而在最后面的x=222時(shí)是因?yàn)橄茸x到x=111,后面再讀到x=222 所以最終取得的結(jié)果是 print('from inner',x) >>> from inner 222
f()
---------------------------------------------------
.inner at 0x00000204E1D45510>
from inner 222

# 案列三:

x=111
def outer():
    def inner():
        print('from inner',x) # x訪問(wèn)的時(shí)全局名稱(chēng)空間中x
    return inner

f=outer()

# x=222
def func():
    x=333        #與函數(shù)的調(diào)用位置無(wú)關(guān)
    f()

x=444
func()
----------------------------------------------
from inner 444

# 案列四:

# 都不對(duì)
x=111
def outer():
    def inner():
         x=11111          #      先定義,后調(diào)用
        print('from inner',x) # x是來(lái)自于當(dāng)前層的名字 ,能找到,但是先現(xiàn)定義,后調(diào)用
        x=2222222222       # 語(yǔ)法錯(cuò)誤,   而這里是x 沒(méi)有定義,后面再賦值,所以是語(yǔ)法錯(cuò)誤
    return inner

f=outer()

f()

# 作用域:
#域指的是范圍,作用域指的就是作用的范圍,分為兩種
# 全局作用域:包含的是內(nèi)置名稱(chēng)空間與全局名稱(chēng)空間中的名字
# 特點(diǎn):全局有效,全局存活

# 局部作用域:包含的是局部名稱(chēng)空間中的名字
# 特點(diǎn):局部有效,臨時(shí)存活

x=1
def foo():
    y=2
    print(x)
def bar():
    print(x)
foo()
bar()
-----------------------------
1
1

# global,nonlocal

x=1
def foo():
    x=2
foo()
print(x)
--------------------
1
l=[]
def foo():
    l.append(1)
    # l=33333
foo()
print(l)
-------------------------------
Unbound Local Error #(錯(cuò)誤的云地方)

#global:在局部聲明一個(gè)名字是來(lái)自于全局作用域的,可以用來(lái)在局部修改全局的不可變類(lèi)型

x=1
def foo():
    global x
    x=2
foo()
print(x)
---------------------------
2

#nonlocal:聲明一個(gè)名字是來(lái)自于當(dāng)前層外一層作用域的,可以用來(lái)在局部修改外層函數(shù)的不可變類(lèi)型

x=0
def f1():
    x=111
    def f2():
        # global x
        nonlocal x
        x=222
    f2()
    print(x)
f1()
print(x)
------------------------------
222
0

九、閉包函數(shù)

1 什么是閉包函數(shù)
    閉:指的是閉包函數(shù)是定義在一個(gè)函數(shù)內(nèi)部的函數(shù)
    包:該內(nèi)部函數(shù)包含對(duì)外層函數(shù)作用域名字的引用

    需要結(jié)合函數(shù)對(duì)象的概念將閉包函數(shù)返回到全局作用域去使用,從而打破函數(shù)的層級(jí)限制
    def outter():
        x=111
        def inner():
            print(x)
        return inner

    f=outter() #f=outter內(nèi)的inner

    # x=22222
    # f()
    def func():
        x=3333
        f()

    func()
2 為何要用閉包函數(shù)
    閉包函數(shù)提供了一種為函數(shù)體傳值的解決方案

3 如何用閉包函數(shù)

# 為函數(shù)體傳值的方式一:參數(shù)

def func(x,y):
    print(x+y)
func(1,2)
-------------------
3

# 為函數(shù)體傳值的方式二:閉包

def outter(x,y):
    # x=1
    # y=2
    def func():
        print(x+y)
    return func
f=outter(1,2)
f()
------------------
3

# 解決方案一:參數(shù)

# pip3 install requests

import requests
def get(url):
    response=requests.get(url)
    if response.status_code == 200:
        print(len(response.text))
get('https://www.baidu.com')
get('https://www.baidu.com')
get('https://www.baidu.com')
get('https://www.tmall.com')
get('https://www.tmall.com')
url1='https://www.baidu.com'
url2='https://www.tmall.com'
get(url1)
get(url1)
get(url1)
get(url2)
get(url2)
get(url2)

# 解決方案二:閉包

import requests
def outter(url):
    # url='https://www.baidu.com'
    def get():
        response=requests.get(url)
        if response.status_code == 200:
            print(len(response.text))
    return get

baidu=outter('https://www.baidu.com')
baidu()
baidu()
baidu()

tmall=outter('https://www.tmall.com')
tmall()
tmall()
tmall()


網(wǎng)頁(yè)標(biāo)題:六、函數(shù)的基本使用
網(wǎng)站URL:http://weahome.cn/article/psghjo.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部