python-day10_函式巢狀
# 函式進階
# a = 1
# def func():
# print(a)
# func()
# 名稱空間和作用域
# print()
# input()
# list
# tuple
#名稱空間 有三種
#內建名稱空間 —— python直譯器
# 就是python直譯器一啟動就可以使用的名字儲存在內建名稱空間中
# 內建的名字在啟動直譯器的時候被載入進記憶體裡
#全域性名稱空間 —— 我們寫的程式碼但不是函式中的程式碼
# 是在程式從上到下被執行的過程中依次載入進記憶體的
# 放置了我們設定的所有變數名和函式名
#區域性名稱空間 —— 函式
# 就是函式內部定義的名字
# 當呼叫函式的時候 才會產生這個名稱空間 隨著函式執行的結束 這個名稱空間就又消失了
#在區域性:可以使用全域性、內建名稱空間中的名字
#在全域性:可以使用內建名稱空間中的名字,但是不能用區域性中的名字(變數)
#在內建:不能使用區域性和全域性的名字的
# def func():
# a = 1
#
# func()
# print(a)
2,
# def max(l):
# print('in max func')
#
# print(max([1,2,3]))
#在正常情況下,直接使用內建的名字
#當我們在全域性定義了和內建名字空間中同名的名字時,會使用全域性的名字
#如果自己沒有,就找上一級要,上一級沒有再找上一級,如果內建的名字空間都沒有,就報錯
# 同級的多個函式擁有多個獨立的區域性名字空間之間,不互相共享內部的變數
3,
# def input():
# print('in input now')
# def func():
# # input = 1
# print(input)
# func()
# def fun1():
# a = 1
#
# def fun2():pass
#func --> 去掉函式後面的括號,函式名就代表函式的記憶體地址
#函式名() 函式的呼叫
#函式的記憶體地址() 函式的呼叫
4,
# 作用域兩種
# 全域性作用域 —— 作用在全域性 —— 內建和全域性名字空間中的名字都屬於全域性作用域 ——globals()
# 區域性作用域 —— 作用在區域性 —— 函式(區域性名字空間中的名字屬於區域性作用域) ——locals()
# a = 1
# def func():
# global a
# a = 2
#
# func()
# print(a)
# 對於不可變資料型別 在區域性只可以檢視全域性作用域中的變數
# 但是不能直接修改
# 如果想要修改,需要在程式的一開始新增global宣告
# 如果在一個區域性(函式)內聲明瞭一個global變數,那麼這個變數在區域性的所有操作將對全域性的變數有效
5,
# a = 1
# b = 2
# def func():
# x = 'aaa'
# y = 'bbb'
# print(locals())
# print(globals())
#
# func()
# print(globals())
# print(locals()) #如全域性呼叫,本地的就是全域性
#globals 永遠列印全域性的名字
#locals 輸出什麼 根據locals所在的位置輸出
6,
#函式的巢狀定義
#內部函式可以使用外部函式的變數
# a = 1
# def outer():
# a = 1
# def inner():
# a = 2
# def inner2():
# nonlocal a #聲明瞭一個上面第一層區域性變數
# a += 1 #不可變資料型別的修改
# inner2()
# print('##a## : ', a)
# inner()
# print('**a** : ',a)
# outer()
# print('全域性 :',a)
#nonlocal 只能用於區域性變數,只找上層中離當前函式最近一層的區域性變數
#聲明瞭nonlocal的內部函式的變數修改會影響到,離當前函式最近一層的區域性變數
#找不到會報錯,對全域性無效
7,函式的本質
函式名就是記憶體地址
# # func() #函式名就是記憶體地址
# func2 = func #函式名可以賦值
# l = [func,func2] #函式名可以作為容器型別的元素
def func():
print(123)
def wahaha(f):
f()
return f #函式名可以作為函式的返回值
qqxing = wahaha(func) # 函式名可以作為函式的引數
qqxing()
8,函式閉包
閉包:巢狀函式,內部函式呼叫外部函式(不含全域性)的變數
# def outer():
# a = 1
# def inner():
# print(a)
#print(inner._closure_) #輸出帶cell就是閉包
def outer():
a = 1
def inner():
print(a)
return inner #返回記憶體地址
inn = outer() #這樣outer函式及內部變數會一直在記憶體裡
inn()
# import urllib #模組
from urllib.request import urlopen
def get_url():
url = 'http://www.xiaohuar.com/'
def get():
ret = urlopen(url).read()
print(ret)
return get
get_func = get_url()
get_func()