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