1 命名空間git
對於Python 來講命名空間一共有三種閉包
1 內置命名空間 —— Python 解釋器函數
就是Python 解釋器一啓動就可使用的名字,儲存在內置命名空間中。內置的名字在啓動解釋器的時候被加載進內存裏spa
2 全局命名空間 —— 咱們所命名的,但不是函數中的代碼code
是在程序從上到下被執行的過程當中依次加載進內存中的,放置了咱們所設置的全部變量名和函數名對象
3 局部命名空間 —— 函數 blog
就是函數內部定義的名字,當調用函數時,纔會產生這個名稱空間,隨着函數執行的結束,這個命名空間又消失索引
PS:內存
1 在局部中可使用全局、內置命名空間中的名字;在全局中可使用內置命名空間的名字,但不能使用局部中定義的名字;在內置中不能使用局部和全局的名字作用域
2 正常狀況下直接使用內置的名字,當在全局定義了和內置名字空間中同名的名字時,會使用全局的名字;本身有名字就用本身的,沒有就一級級身上找,若是內置中尚未,就會報錯;多個函數擁有多個獨立的局部名字空間,不互相共享
2 函數名
def func(): pass
其中func 是函數的內存地址,函數名加(),是函數的調用,能夠類比爲:函數的內存地址() = 函數的調用
函數名就是內存地址;函數名能夠賦值;函數名能夠做爲容器類型(元組、列表和字典)的元素;函數名能夠做爲函數的返回值;函數名能夠做爲參數
3 函數的做用域
函數的做用域能夠分爲兩種
全局做用域 —— 做用在全局 —— 內置和全局名字空間中的名字都屬於全局做用域 —— globals()
局部做用域 —— 做用在局部 —— 函數(局部名字空間中的名字屬於局部做用域)—— locals()
對於不可變的數據類型來講,局部能夠查看全局做用域中的變量,可是不能直接修改,若是想修改,須要在程序的一開始添加 global 聲名,若是在一個局部(函數)內聲名一個global 變量,那麼這個變量在局部的全部操做將對全局的變量有效
a = 1 def func(): global a a += 1 print(a) func()
對於 globals() 和 loclas() 方法
a = 1 b = 2 def func(): x = 'aaa' y = 'bbb' print(locals()) #1 打印當前 print(globals()) #2 打印全局 func() print(globals()) #3 打印全局 print(locals()) #4 打印當前
二者打印的是,以字典的形式打印出命名。二、三、4 打印的內容一致,1 打印的是函數內命名的狀況
4 函數的嵌套
定義:就是內部函數可使用外部函數的變量
a = 1 def func1(): a = 2 def func2(): nonlocal a #聲明瞭一個上面第一層局部變量 a += 1 # 對不可變數據類型進行了修改 print(a) func2() print(a) func1() print(a)
nocolal 只能用於局部變量,找上層中離當前函數最近一層的局部變量;聲明 noncolal 的內部函數的變量修改會影響到離當前函數最近一層的局部變量;對全局無效,對局部也只是最近的一層有影響。
5 閉包
閉包就是內部函數調用外部函數的變量
def outer(): a = 1 def innner(): print(a) return inner inn = outer() inn()
目的是保護函數內定義的值,而且節省內存空間,不用每次都定義一個a,直接用便可~
來個三元運算
# 取兩個數的最大值 def func(a,b): return a if a > b else b print(func(3, 5))
6 小做業
# 1 寫函數,接收 n 個數字,求這些參數數字的和 def sun_func(*args): total = 0 for i in args: total += i return total
# 2 讀代碼,回答:代碼中打印出來的值 a、b 和 c 分別是什麼?爲何? a = 10 b = 20 def test5(a, b): print(a, b) c = test5(b, a) print(c) # 得出的結果爲: # 20 10 # None
# 3 寫函數,檢查獲取傳入列表或元組的對象的全部奇數位索引對應的元素,並將其做爲新的列表返回給調用者 def func(lis): return lis[1::2] print(func([1,2,3,4,5,6,]))
# 4 寫函數,判斷用戶傳入的對象(字符串、列表、元組)長度是否大於5 def func(x): return len(x) > 5 print(func('dfs')) print(func([1,2,3,4,5,6,])) print(func((1,2,3,4,5,)))
# 5 寫函數,檢查用戶傳入列表的長度是否大於2,若是大於,那麼僅保留前兩個長度的內容,並將新內容返回給調用者 def func(lis):return lis[:2] # 若是列表長度不夠的話,是不會報錯的
# 6 寫函數,計算傳入字符串中,數字、字母、空格以及其它 的個數 ,並返回結果 def func(s): dic = {'n_digist':0,'n_alphabet':0,'n_blank':0,'n_other':0} for i in s: if i.isdigit(): dic['n_digist'] += 1 elif i.isalpha(): dic['n_alphabet'] += 1 elif i.isspace(): dic['n_blank'] += 1 else:dic['n_other'] += 1 return dic print(func('skjdfhwhihsdfjkh389fhsfhksf [fahh=-=-'))