程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python閉包

編輯:Python

python閉包

''' 作用域 閉包中肯定會涉及到作用域的問題 Ctrl+alt+l 格式化 '''
b = 4
def f(a):
# global b = 9 語法錯誤
global b
print(a)
print(b)
# b = 9 這樣會報錯 python在編譯函數的定義體時,判斷b為局部變量
#使用global就能完美解決問題
b = 9
f(1)
print(b)
''' 閉包 自由變量 假如在全局中定義了變量a,在函數中使用了這個a,這個a就是自由變量,可以這樣理解,凡是跨了自己的作用域的變量都叫自由變量。 def sum(*args, **kwargs): # real signature unknown """ Return the sum of a 'start' value (default: 0) plus an iterable of numbers When the iterable is empty, return the start value. This function is intended specifically for use with numeric values and may reject non-numeric types. """ pass '''
def make_average():
series = [] #初始化一個空列表 series是自由變量
def averager(val):
series.append(val)
total = sum(series) #sum() 累加
return total / len(series)
return averager #返回一個函數名
avg = make_average() #相當於avg = averager
print(avg(10)) #10.0
print(avg(11)) #10.5
print(avg(12)) #11.0
print(avg.__code__.co_varnames) #局部變量 ('val', 'total')
print(avg.__code__.co_freevars) #自由變量 ('series',)
print(avg.__closure__) #cell對象 (<cell at 0x000001554614FCD0: list object at 0x00000155460F30C0>,)
print(avg.__closure__[0].cell_contents) #自由變量的值,即series的值 [10, 11, 12]
''' nonlocal nonlocal聲明的變量不是局部變量,也不是全局變量,而是外部嵌套函數內的變量。 '''
def make_averager():
count = 0
total = 0
def averager(val):
nonlocal count, total #如果沒有這行代碼會報錯
count += 1 #相當於count = count + 1,相當於在創建了一個局部變量
total += val
return total / count
return averager
avg = make_averager() #相當於avg = averager
print(avg(10)) #10.0
print(avg(11)) #10.5
print(avg(12)) #11.0

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved