python 中函數的返回值、做用域及名稱空間介紹

1、函數的返回值python

  函數外部代碼想要獲取函數的執行結果,就能夠在函數內部用return語句將結果返回。app

def student(name,age,country="China"):
    print(name,age,country)
    if age>30:
        return True
    else:
        return False

student_stus = student("lilei",33)
if student_stus:
    print("too old to be a student")
else:
    print("註冊成功")

  函數的返回值經過return語句進行返回,若是沒有return語句,則函數的返回值默認爲None,return語句能夠返回數字、字符串、列表元組等多種數據類型,返回多個值時,以元組的形式返回。函數在執行到return語句後,就會中止並返回結果,並表明函數已經結束。函數

2、全局變量和局部變量及其做用域學習

  看以下代碼:ui

name = "zhangsan"  # 定義全局變量
def change_name():
    name = "lisi"  #定義局部變量
    print("after change:",name)
change_name()
print("外邊的name:",name)
結果:
after change: lisi
外邊的name: zhangsan

  爲何在函數內部改變了name的值,在外邊print的時候卻沒有改變呢。由於這兩個name不是一個變量,一個是局部變量一個是全局變量。spa

  局部變量:在函數內部定義的變量稱爲局部變量,而在函數外程序剛開始就定義的變量稱爲全局變量。code

  做用域的概念:做用域指的是變量的做用範圍或有效範圍,局部變量的做用域是定義該變量的函數,而全局變量的做用域是整個程序。blog

  變量的查找順序是局部變量>全局變量,當全局變量與及局部變量同名時,在定義局部變量的函數內,局部變量起做用,在其餘地方全局變量起做用,因此在函數內部是沒法修改全局變量的。內存

name = "zhangsan"
name1 = "wangwu"
def change_name():
    name1 = "lisi"
    print(name, name1)  
change_name()
結果:zhangsan lisi  # name在change_name函數內部沒有,找不到,只能到函數外部找;而name1在change_name函數內部找到了,因此不會再到函數外部去找。

  如何在函數內部聲明全局變量呢作用域

name = "lisi"
def change_name():
    global name
    name = "wangwu"
    print("局部:",name)
change_name()
print("全局:",name)
結果:
局部: wangwu
全局: wangwu

  經過global 關鍵字能夠將局部變量聲明爲全局變量,這樣就能對其進行修改。

  傳遞列表、字典、集合等會發生什麼現象;

dic = {
    'name':'zhangsan',
    'age':18,
    'hobby':'study'
}
lis = ['lisi','wangwu']
def change_data(info,people):
    info['hobby']='學習'
    lis.append('zhangsan')
change_data(dic,lis)
print(dic,lis)
結果:
{'name': 'zhangsan', 'age': 18, 'hobby': '學習'} ['lisi', 'wangwu', 'zhangsan']

  從結果能夠看到,函數內部也將函數外部的字典和列表等全局變量改變了,這是爲何呢?由於程序只是把dic和lis的內存地址給了change_data函數,但dic和lis的元素均有本身的內存地址,把dic 和 lis比做魚缸,裏面的元素比做魚缸裏的魚,這個魚缸自己你不能變,可是裏面的魚能夠。至關於只是傳了一個對這個dic的引用關係給到函數的形參。這樣作是爲了節省內存空間,若是dic中的內容比較多,傳一次函數就要複製一份新的數據,那麼效率就過低了。

 3、名稱空間

  名稱空間,又稱name space,顧名思義就是存放名字的地方,存什麼名字呢,變量名。好比 x= 1, 數據1存放在內存裏,那麼名字x存放在哪裏呢?名稱空間正式存放名字x 與 1 綁定關係的地方。

  python裏面有不少名稱空間,他們相互之間互不干擾,不一樣空間中的兩個相同名字的變量之間沒有什麼聯繫。

  名稱空間有四種:Locals、Enclosing 、Global 和 Builtins

  locals: 函數內部的名稱空間,通常包括函數的局部變量以及形式參數。

  enclosing : 在嵌套函數中,外部函數的名稱空間,若fuc2嵌套在func1中,對func2來講,func1的名稱空間就是enclosing.

  globals: 當前模塊的空間,模塊就是一些py文件,也就是說,globals相似於全局變量。

  builtins: 內置模塊空間,也就是內置變量或者內置函數的名稱空間。

  不一樣的變量做用域不一樣,就是由這個變量所在的名稱空間決定的。

  不一樣名稱空間的做用域的查找順序:當程序引用某個變量名時,就會從當前名字空間開始搜索,搜索順序規則即是:LEGB。即locals ——>

enclosing ——>enclosing ——>globals ——>builtins。一層一層查找,找到了以後,便中止搜索,若是沒有找到,則拋出NameError的異常。

level = "L1"
n = 1
name = "zhangsan"
def func():
    level = "L2"
    n = 2
    print("func:", locals(), n)
    def outer():
        level = "L3"
        n = 3
        print("outer:", locals(), n)
        def inner():
            level = "L4"
            print("inner:", locals(), n, name)
        inner()
    outer()
func()
print('globals:', 'level:', level, 'n:', n, 'name:',name)
結果:
func: {'level': 'L2', 'n': 2} 2
outer: {'level': 'L3', 'n': 3} 3
inner: {'level': 'L4', 'n': 3} 3 zhangsan
globals: level: L1 n: 1 name: zhangsan
相關文章
相關標籤/搜索