Python函數之返回值、作用域和局部變量


一、函數返回值

  說到返回值,相信大家肯定都認識,沒錯,就是return。

  所謂返回值可以這樣理解:函數外部的代碼要想獲取函數的執行結果,就可以在函數里用return語句把結果返回。

  那具體怎么用呢?接着往下看: 

#!/usr/bin/env python3 #-*- coding:utf-8 -*- # write by congcong

# return 表示一個程序的結束,他可以返回任意的元素,列表或字典
def stu_info(name,age,course): print(name,age,course) if age > 18: return True else: return False stu_return = stu_info('hope',19,'life') print(stu_return) # 輸出:True

def stu_info(name,age,course): print(name,age,course) return 'good','work'
    return 0 #不執行
 stu_return = stu_info('hope',19,'life') print(stu_return) #輸出 ('good', 'work') ,中間逗號分隔時返回轉為元組,第二個連續return不執行

 注意:

  1、函數在執行過程中只要遇到return語句,就會停止執行並返回結果,so 也可以理解為 return 語句代表着函數的結束。

  2、如果未在函數中指定return,那這個函數的返回值為None。

 怎么樣,這回不敢小看我了吧!

 

二、作用域

  作用域(scope),程序設計概念,通常來說,一段程序代碼中所用到的名字並不總是有效/可用的,而限定這個名字的可用性的代碼范圍就是這個名字的作用域。

  還可以結合函數這么理解:

      python中函數就是一個作用域,局部變量放置在其作用域中代碼完成后,作用域便生成了,作用域鏈向上查找。

  看代碼:

# -*-coding:utf-8-*-
 age = 21
def func1(): age = 19
    print('func1輸出:',age) # 輸出:19
    def func2(): print('func2輸出:',age) # 輸出:19
    return func2  # 返回函數名
 val = func1()  # 調用func1並將返回值賦給變量val,val = func2
print(val)  # 輸出:<function func1.<locals>.func2 at 0x000002CE667298C8>
val() # 等於調用func2,返回函數定義處執行
print('全局輸出:',age)  # 輸出:21

 

三、函數局部變量和全局變量

  定義:

    在函數中定義的變量稱為局部變量,在程序的一開始定義的變量稱為全局變量。

  區別:

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

    2、當全局變量與局部變量同名時,在定義局部變量的函數內,局部變量起作用;在其它地方全局變量起作用。

  注意:

    在函數內部,可以引用全局變量;如果全局和局部都有一個變量,函數查找,由內而外,局部沒有,再到全局找

  看實例:

#-*- coding:utf-8 -*-
 name_out = 'daydayup'

def change_name(): # name_in = 'dayup' # 局部變量
    # print('內部-》',name_in,id(name_in)) #內部定義時,優先調用,此時輸出:dayup 1997485691096
    print(name_out) # 內部未定義時,便調用函數外面的
 change_name() print('外部-》',name_out,id(name_out)) #輸出:外部-》 daydayup 1997485709552

  再看一個關於函數內部修改列表的實例:

#!/usr/bin/env python3 #-*- coding:utf-8 -*- # write by congcong
'''''' names = ['dream','hope','life'] #整體修改無法實現,但刪除可以實現
def change_name(): # del names[1] # 此處會報錯,不能使用del刪除列表元素,如此會修改全局變量names
    names = ['Dream','Poem'] # 整體賦值並未修改全局,除非用global聲明names
    print(names)  #輸出:['Dream', 'Poem']
 change_name() print(names)  #輸出:['dream', 'hope', 'life']


#修改內部元素,可以實現,例如列表,字典,集合,元祖中的列表,類,對象等,但數字,字符串,不行
def change_name(): names[-1] = 'poem'
    print(names)  #輸出:['dream', 'hope', 'poem']
 change_name() print(names) #輸出:['dream', 'hope', 'poem']

  那么函數里只能定義局部變量嗎?

  當然,但是一般不推薦使用,只能說慎用。看下面的實例:

#-*- coding:utf-8 -*-
 name = 'life'
def change_name(): global name     #定義全局變量
    name = 'poem'
    print('函數里面-》',name) #輸出:函數里面-》 poem
 change_name() print('函數外面-》',name) #輸出:函數外面-》 poem

   在函數里修改了全局變量,當函數有很多個的時候,就會很蒙逼了(再次友情提示)。

 

 

  

 


免責聲明!

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



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