Python裝飾器,迭代器,生成器

2021-08-28 07:25:42 字數 3375 閱讀 1559

1.python裝飾器

由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。所有函式都有乙個__name__屬性,這樣我們就可以那到函式名。

現在,假設我們要增強now()函式的功能,比如,在函式呼叫前後自動列印日誌,但又不希望修改now()函式的定義,這種在**執行期間動態增加功能的方式,稱之為「裝飾器」(decorator)。本質上,decorator就是乙個返回函式的高階函式

下面就是乙個裝飾器的例項

def our_decorator(func):

"""進行管理員操作前進行判斷 該使用者是否擁有管理員許可權

:param func:要進行裝飾的函式

:return:

"""dict1 =

def wrap(name, password):

if name in dict1.keys():

mima = dict1[name]

if mima == password:

func(name, password)

else:

print("使用者名稱或者密碼不正確,請重新輸入")

return wrap

@our_decorator

def f(name, password):

print("登入成功,接下來可執行管理員操作了")

def login():

name = input("請輸入使用者名稱:")

password = input("請輸入密碼:")

f(name, password)

login()

2. python迭代器

迭代是python最強大的功能之一,是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。迭代器有兩個基本的方法:iter()next()。字串,列表或元組物件都可用於建立迭代器:

"""

1. 什麼是可迭代物件

可以用for進行迭代的物件

2. 什麼是迭代器

可以用next()函式對該物件進行操作。

3. 如何判斷乙個物件是不是可迭代物件

1)from collections import iterable

print(isinstance(, iterable))

2) 用for操作一下。

4. 如何判斷乙個物件是不是迭代器

1)from collections import iterator

print(isinstance(, iterator))

2) 用next()函式操作一下

5. 如何把乙個可迭代物件轉化為迭代器

使用內建函式iter()

6. 迭代器有什麼優點

節省記憶體

"""from collections import iterable

from collections import iterator

'''可迭代物件:可以直接作用於for迴圈的物件統稱為可迭代物件(iterable)。可以用isinstance()去判斷乙個物件是否是iterable物件

可以直接作用於for的資料型別一般分兩種

1、集合資料型別,如list、tuple、dict、set、string

2、是generator,包括生成器和帶yield的generator function

'''print(isinstance(, iterable))

print(isinstance((), iterable))

print(isinstance({}, iterable))

print(isinstance("", iterable))

print(isinstance((x for x in range(10)), iterable))

print(isinstance(1, iterable))

'''可以被next()函式呼叫並不斷返回下乙個值的物件稱為迭代器(iterator物件)

可以使用isinstance()函式判斷乙個物件是否是iterator物件

'''print(isinstance(, iterator))

print(isinstance((), iterator))

print(isinstance({}, iterator))

print(isinstance("", iterator))

print(isinstance((x for x in range(10)), iterator))

l = (x for x in [23,4,5,64,3435])

print(next(l))

print(next(l))

print(next(l))

print(next(l))

print(next(l))

#print(next(l))

#轉成iterator物件

a = iter([1,2,3,4,5])

print(next(a))

print(next(a))

print(isinstance(iter(), iterator))

print(isinstance(iter(()), iterator))

print(isinstance(iter({}), iterator))

print(isinstance(iter(''), iterator))

f = open('胡歌-逍遙嘆.lrc',encoding='gbk')

# 把所有內容讀取到記憶體

lines = f.readlines()

for line in lines:

print(line)

for line in f:

print(line)

print(isinstance(f,iterator))

3. python生成器

"""

1.生成器:使用yield語句的函式的返回值就是生成器。

2.生成器物件、檔案讀寫、map物件等都屬於迭代器。

3.yield能返回值並記住當前狀態

"""def f():

yield 1

print('~~~~~~~~~~~~~~~~~~~')

yield 2

yield 3

g = f()

print(next(g))

print(next(g))

print(next(g))

print(next(g))

Python生成器 迭代器 裝飾器

python生成器 迭代器 裝飾器 最簡單的生成器 g x x for x in range 10 for i in g print i函式方法實現稍複雜的生成器 def fib max n,a,b 0,1,1 while nyield b a,b b,a b n 1 for n in fib 6 ...

python 裝飾器,生成器,迭代器

示例1 無參無返回值 def shuai func 示例2 帶參函式的裝飾器 帶參函式的裝飾器 示例3 帶參有返回值的裝飾器 def zhuangshiqi func 資料量非常小,記憶體占用不大 l i for i in range 10 資料量特別大時,會造成記憶體占用突然增大 l2 i for...

Python生成器,迭代器,裝飾器

使用了yield函式就被稱之為生成器,生成器是乙個返回迭代器的函式,說白了生成器就是迭代器,只能用於迭代操作 不懂,沒關係,下面就乙個斐波那契數列為例來進行講解 a,b 0,1while a 100 a,b b,a b print a import sys deffibonacci n 生成迭代器函...