~~函數基礎(二):返回值&作用域~~


進擊のpython

***** # 函數的返回值和作用域

上文我們講到了函數的基礎——參數的相關問題

舉的例子也都是帶有print的函數定義

但是有個問題就出現了:我不想打印這個函數處理后的參數

我想拿到這個參數然后做后續的事情

我應該怎么辦呢?


  • 返回值

    這就需要一個關鍵字 return 來解決這個問題了

    return:回來 回去 返回 帶回……(又學個英語單詞)

    那我們就能看出來,這個詞的意思就是從函數當中把參數拿回來的意思

    對吧!

    那么原先的函數我就可以這么寫:

    def func(x, y, z):
        a = "輸入的三個數為%s,%s,%s" % (x, y, z)
        return a
    
    
    func(1, 2, 3)
    print(func(1, 2, 3))
    

第一個執行了func()函數,返回了a,但是沒有打印出來

第二個執行了func()函數,返回了a,打印了出來

這樣 我想打印出來就打印出來,我不想打印就不打印,就很舒服!


很簡單的一個小知識點

但是卻有一個小陷阱!

函數執行過程中,遇到了 return 那就不執行接下來的語句,直接退出函數。

(想想還有哪個像這個??循環里的break)

給你舉個例子:

def func(x, y, z):
    a = "輸入的三個數為%s,%s,%s" % (x, y, z)
    return a
    print("這句話執行不出來")


print(func(1, 2, 3))

明白了吧!


當然 有的時候也不一定要指定返回值,那我們看看這東西會返回什么

def func(x, y, z):
    a = "輸入的三個數為%s,%s,%s" % (x, y, z)
    # return a
    # print("這句話執行不出來")


print(func(1, 2, 3))

OK,那我們大概可以知道了,沒有指定返回值,那就返回None!
那要是有多個返回值呢?

def func(x, y, z):
    a = x * 2
    b = y * 3
    c = z * 4
    return a, b, c


print(func(1, 2, 3))
(2, 6, 12)

┗|`O′|┛ 嗷~~!

當有多個返回值的時候,返回的是個元組!

但是奧!切記!!return是終止函數!!但是不會終止循環!

lst = [1, 2, 3, 4, 5]


def func():
   for i in lst:
        print(i)
        return


print(func())
1
None

懂我意思吧!湊弟弟!


  • 作用域

    說作用域那可就是相當抽象了

    作用域就相當於你能夠行使權利的區域

    你的員工卡高級,你就能去公司更高層的辦公室

    你的員工卡低級,那你就只能在你的一畝三分地呆着了

    員工卡就類比成程序中的變量

    那怎么設置程序中“員工卡”的等級呢?

    這就是函數的作用域了


    話不多說,直接上代碼:(1.1)

    name = "jevious"
    
    
    def change():
        print(name)
    
    
    change()
    

    我在 change() 函數中調用這個name,能調用嗎?

    執行了!可以!會輸出這個 jevious

    那我可以修改這個變量嗎?

    name = "jevious"
    
    
    def change():
        name = "poddy"
        print(name)
    
    
    change()
    

    打印的是什么呢?(自己試試 打印的是 poddy)

    那,這真的將name變量修改了嗎?(1.2)

    name = "jevious"
    
    
    def change():
        name = "poddy"
        print(name)
    
    
    change()
    print(name)
    

兩個結果,說明name沒有被修改

那是怎么回事呢?

不賣關子,直接 tell you

在函數外面的name 是全局變量

在函數內部的name 是局部變量

當函數在自己一片區域里發現到自己需要的變量就用自己的變量(1.2)

當函數在自己區域里沒有找到想要的變量就去外面找需要的變量(1.1)

所以說,在局部不能修改全局的變量

看到的修改其實只是在局部新建了變量

怎么驗證呢?python給我們提供了兩種方法

localsglobals

name = "jevious"


def change():
    name = "poddy"
    age = "22"
    print(locals())  # 局部變量
    print(globals())  # 全局變量


change()
print(name)

下面的你不用都看,因為全局的比較多,但是你會在里面找到'name': 'jevious'

但是你卻找不到age的任何信息


  • 總結

    知識點就有點雜,慢慢積累被:

    1、在函數中定義的是局部變量,在程序一開始定義的是全局變量

    2、全局變量的作用域是整個程序,局部變量作用域是定義該變量的函數

    3、變量的查找順序是局部變量>全局變量

    4、當全局變量與局部變量同名時,在函數里,局部起作用;在其他地方,全局起作用

    5、在函數里不能直接修改全局變量


    就有艮的,就想在函數中定義全局變量

    global

    用這個關鍵字,先聲明,再賦值,這樣就是全局的了

    # name = "jevious"
    
    
    def change():
        global name
        name = "poddy"
        age = "22"
        print(locals())  # 局部變量
        print(globals())  # 全局變量
    
    
    change()
    print(name)
    
    

    自己打印結果,我可不想像你這么艮,而且也不建議這么使用

    那你丫非得這么艮?那你開心就好!


其實不光是以上的需求,有的時候,我們還需要在函數里調用全局變量然后進行修改

很明顯,根據上面的理論,直接修改是不行的

所以我們可以聲明一個全局變量,再進行修改

a = 10


def func():
    global a
    a += 1
    print(a)
    return a


func()

這樣就對a進行了修改

但是不一定需求這么簡單,我現在想調用函數里面的參數可以直接調用

那我要是想修改呢?

那就需要一個局部聲名了 nonlocal

但是注意奧,這個方法只能在局部里找參數,如果局部沒有就報錯

根本不往全局看

a = 10


def func():
    nonlocal a
    a += 1
    print(a)
    return a


func()
SyntaxError: no binding for nonlocal 'a' found
a = 10


def foo():
    a = 20

    def func():
        nonlocal a
        a += 1
        print(a)
        return a


foo()

因為在上一個局部里有a這個參數,找到了,就不會報錯!


*這沒啥用*
*但你別艮*


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM