day4 函式的包裝 裝飾器 迭代器

2022-08-10 07:27:13 字數 2938 閱讀 7302

1.函式巢狀:在呼叫乙個函式的過程中,由呼叫了其他函式

列子:def father(name):

print('from father %s' %name)

def son():

print('from son')

def grandson():

print('from grandson')

grandson()

son()

father("nihao")

2. 閉包函式: 定義在函式內部的函式 包含對外部作用域名字的引用,而不是對全域性作用域名字的引用

列子:def father(name):

def son():

# name='alex'

print('我爸爸是 [%s]' %name)

def grandson():

# name='wupeiqi'

print('我爺爺是 [%s]' %name)

grandson()

son()

father("成龍")

3.命名空間 函式載入順序:

3.1命名空間:存放名字的地方,準確的說命名空間是存放名字與變數值繫結關係的地方

3.2:內建命名空間:在python直譯器啟動時產生,存放一些python內建的名字

3.3:全域性命名空間:在執行檔案時產生,存放檔案級別定義的名字

3.4:區域性命名空間:在執行檔案的過程中,如果呼叫了函式,則會產生該函式的區域性命名空間,名字在函式呼叫時生效,在函式呼叫結束後失敗;函式載入順序:內建---》全域性---》區域性  ;函式的呼叫順序:區域性-》全域性-》內建

例項:max=1

def foo():

max=2

print(max)

foo()

4.作用域: 全域性作用域:全域性存活,全域性有效:globals()

max=1111111

def f1():

def f2():

def f3():

def f4():

# print(x)

print(max)

f4()

f3()

f2()

f1()

4.1 區域性作用域:臨時存活,區域性有效:locals()

例子: 讓區域性變數在全域性生效

x=1def f1():

global x

x=2f1()

print(x)

例子:區域性生效

def func():

count = 1

def foo():

nonlocal count

count = 12

foo()

print(count)

func()

4.2. 作用域關係,在函式定義時就已經固定,於呼叫位置無關,在呼叫函式時,必須必須必須回到函式原來定義的位置去找作用域關係

列子:x=1

def  f1():

def f2():

print(x)

return f2

4.35.裝飾器

5.1 開放封閉原則:對擴充套件是開放的,對修改是封閉;裝飾器本身可以是任意可呼叫物件,被裝飾的物件本身也可以是任意可呼叫物件;

5.2  不修改被裝飾物件的源代;不修改被呼叫物件的呼叫方式;為其他函式新增新功能

5.3 裝飾器名,必須寫在被裝飾物件的正上方,並且是單獨一行

列子:import time

def timmer(func):

# func=index

start=time.time()

func()

stop=time.time()

print('run time is %s' %(stop-start))

@timmer # index=timmer(index)

def index():

time.sleep(3)

print('welcome to index')

@timmer # home=timmer(home)

def home():

time.sleep(2)

print('welcome to home page')

index()

home()

6.迭代器:

6.2: 可迭代物件iterable:凡是物件下有__iter__方法:物件.__iter__,該物件就是可迭代對

6.3: 代器物件:可迭代物件執行內建的__iter__方法,得到的結果就是迭代器物件

例子:dic=

i=dic.__iter__()

# print(i) #iterator迭代器

# i.__next__() #next(i)

print(next(i))

print(next(i))

print(next(i))

print(next(i)  #stopiteration  沒有值的情況執行 不會出現爆粗:

迭代器物件的優點;提供了一種統一的(不依賴於索引的)迭代方式 迭代器本身,比起其他資料型別更省記憶體

迭代器缺點:一次性,只能往後走,不能回退,不如索引取值靈活;無法預知什麼時候取值結束,即無法預知長度

7.生成器:

在函式內部包含yield關鍵,那麼該函式執行的結果是生成器,生成器就是迭代器

yield的功能:

把函式的結果做生迭代器(以一種優雅的方式封裝好__iter__,__next__) 函式暫停與再繼續執行的狀態是由yield

例子:def my_range(start,stop):

while true:

if start == stop:

raise stopiteration

yield start #2

start+=1 #3

g=my_range(1,3)

print(next(g))

day4 裝飾器深入解析

python裝飾器 裝飾器是在不修改原始碼給 新增功能的常用方法。是裝飾的標誌。我們知道,在給 增加功能的時候,要遵循開放封閉的原則,不能隨便更改原碼,因此裝飾器的功能就顯示出來了,只需要在函式前面加上裝飾器就能解決問題所需。def verification func 驗證模組 def inner ...

小白的Python之路 day4 迭代器

學習前,我們回想一下可以直接作用於for迴圈的資料型別有以下幾種 1.集合資料型別,如list tuple dict set str等 2.是generator,包括生成器和帶yield的generator function。這些可以直接作用於for迴圈的物件統稱為可迭代物件 iterable.可迭...

筆記 迭代器,閉包,裝飾器

1.迭代器 a.判斷迭代 isinstance 判斷乙個 b.生成器是可迭代物件 c。iter 轉成生成器 迭代物件 2.閉包 定義 一坨東西 名字只是乙個變數指向這一坨東西 在函式裡面定義乙個函式,裡面的函式用到外邊的變數,這個函式和用到的變數稱之為變數 第一步 先呼叫函式,找乙個變數指向裡面的函...