python基礎之迭代器生成裝飾器

2022-07-30 07:36:09 字數 3592 閱讀 8452

容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個地迭代獲取,可以用in,not in關鍵字判斷元素是否包含在容器中。通常這類資料結構把所有的元素儲存在記憶體中(也有一些特例,並不是所有的元素都放在記憶體,比如迭代器和生成器物件)在python中,常見的容器物件有:

容器比較容易理解,因為你就可以把它看作是乙個盒子、一棟房子、乙個櫃子,裡面可以塞任何東西。從技術角度來說,當它可以用來詢問某個元素是否包含在其中時,那麼這個物件就可以認為是乙個容器,比如 list,set,tuples都是容器物件.

凡是可以返回乙個迭代器的物件都可稱之為可迭代物件

那麼什麼迭代器呢?它是乙個帶狀態的物件,他能在你呼叫next()方法的時候返回容器中的下乙個值,任何實現了__iter____next__()方法的物件都是迭代器,__iter__返回迭代器自身,__next__返回容器中的下乙個值,如果容器中沒有更多元素了,則丟擲stopiteration異常,至於它們到底是如何實現的這並不重要。

乙個包含了yield關鍵字的函式就是乙個生成器,該函式也叫生成器函式。當生成器函式被呼叫時,在函式體中的**不會被執行,而會返回乙個迭代器。每次請求乙個值,就會執行生成器中**,直到遇到乙個yield表示式或return語句。yield表示式表示要生成乙個值,return語句表示要停止生成器。換句話說,生成器是由兩部分組成,生成器的函式和生成器的迭代器。生成器的函式是用def語句定義的,包含yield部分;生成器的迭代器是這個函式返回的部分。二者合起來叫做生成器。

city = ['beijing','shanghai','tinajin','chongqin']

it = iter(city)

print(type(it))

#方法一:使用next方法來使用迭代器

print(it.__next__())

print(it.__next__())

方法二:使用for迴圈來使用迭代器

for x in it:

print(x)

def generator(low,high):

while low <= high:

yield low

low += 1

for i in generator(1,10):

print(i,end='')

結果:12345678910

def generator(start = 0):

while true:

yield start

start += 1

for number in generator(4):

print(number,end='')

if number > 20:

break

a = [i*2 for i in range(1,10)]

print(a)

結果:[2, 4, 6, 8, 10, 12, 14, 16, 18]

要求:

不能修改被裝飾的函式的源**

不能修改被裝飾的函式的呼叫方式

滿足上面的兩種情況下給程式增添功能

組成:< 函式+實參高階函式+返回值高階函式+巢狀函式+語法糖 = 裝飾器 >

1 import time

2 def timer(func):

4 start_time = time.time()

5 func()

6 stop_time = time.time()

7 print("run time %s"%(stop_time-start_time))

9 @timer #語法糖 test=timer(test)

10 def test():

11 time.sleep(3)

12 print("in the test")

13 test()

1415 結果:

16 in the test

17 run time 3.000171661376953。

1.test表示的是函式的記憶體位址

2.test()就是呼叫對在test這個位址的內容,即函式

高階函式:

1.把乙個函式名當作實參傳給另外乙個函式(「實參高階函式」)

2.返回值中包含函式名(「返回值高階函式」)

這裡面所說的函式名,實際上就是函式的位址,把函式名當做實參,那麼也就是說可以把函式傳遞到另乙個函式,然後在另乙個函式裡面做一些操作。

巢狀函式:

巢狀函式指的是在函式內部定義乙個函式,而不是呼叫

函式只能呼叫和它同級別以及上級的變數或函式。也就是說:裡面的能呼叫和它縮排一樣的和他外部的,而內部的是無法呼叫的。

import time

def timer(func):

def deco(*args,**kwargs):

start_time = time.time()

func(*args,**kwargs)

stop_time = time.time()

print(stop_time-start_time)

return deco

@timer

def test(parameter):

time.sleep(3)

print("test is running")

test("新增引數")

對這兩個函式分別統計執行時間,再加一層函式來接受引數,根據巢狀函式的概念,要想執行內函式,就要先執行外函式,才能呼叫到內函式

import time

def timer(parameter):

if parameter == 'task1':

start = time.time()

func(*args, **kwargs)

stop = time.time()

print("the task1 run time is :", stop - start)

elif parameter == 'task2':

start = time.time()

func(*args, **kwargs)

stop = time.time()

print("the task2 run time is :", stop - start)

@timer(parameter='task1')

def task1():

time.sleep(2)

print("in the task1")

@timer(parameter='task2')

def task2():

time.sleep(2)

print("in the task2")

task1()

task2()

python基礎之生成器迭代器

1 生成器 為什麼要有生成器?就拿列表來說吧,假如我們要建立乙個list,這個list要求格式為 1,4,9,16,25,36 這麼一直持續下去,直到有了一萬個元素的時候為止。如果我們要建立這個list,那麼應該是這樣的 i i for i in range 1,10001 列表生成式,不要忘了 結...

Python基礎之迭代器

一喪 別害怕,反正都會後悔的 認識迭代器一定要認識乙個單詞yield。yield是什麼意思?在筆者認為它就是乙個暫停並輸出的意思,當再次呼叫時從暫停處繼續執行 到達下乙個暫停並輸出。我們來看乙個簡單的 吧。def shuchu num for n in range num yield n f shu...

Python基礎學習之生成器和迭代器

python基礎學習 1 生成器的用法 g x x for x in range 4 若此時直接輸出 for i in g print i 結果為 01 49若先執行s next g 再執行上述輸出,則結果為 14 9因為next 將g的值指向了下乙個.列表生成器 s list range 4 與上...