1. 程式人生 > >python-day10_函式巢狀

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()