1. 程式人生 > >Python 基礎第十三天(叠代器,生成器)

Python 基礎第十三天(叠代器,生成器)

推導式 int 查看 con object 什麽 post bsp 使用

今日主要內容:

1.可叠代對象

2.叠代器

3.生成器

1.可叠代對象

什麽是可叠代對象:內部含有__iter__方法的對象,就是可叠代對象.

查看__iter__方法:dir(對象)

可叠代對象就遵循可叠代協議。

接觸過的可叠代對象有:str,list,tuple,dict,set,range

叠代器:f1文件句柄

如何判斷

法一:

例:s = ‘laonanhai‘

print(‘__iter__‘ in dir(s))

法二:

例:l = [1, 2, 3, 4]
from collections import Iter

print(isinstance(l, Iterable))

返回結果:# True

2.叠代器

什麽是叠代器

可叠代對象轉化成叠代器:可叠代對象.__iter__() --->叠代器

不僅含有__iter__方法,還要含有__next__方法

例:l1 = [1,2,3]

l1_obj = l1.__iter__()

print(‘__iter__‘ in dir(l1_obj)) #True

print(‘__next__‘ in dir(l1_obj)) #True

判斷叠代器:

法一:

print(‘__iter__‘ in dir(l1_obj)) #判斷是否是可叠代對象
print(‘__next__‘ in dir(l1_obj)) #判斷是否為叠代器

法二:
from collections import Iterator
print(isinstance(l1_obj, Iterator))

叠代器的好處:

1.節省內存空間,只有執行__next__函數,才會進行下一步,並加載到內存中.

2.滿足惰性機器

3.不能反復取值,不可逆.

例:用while循環模擬for循環內部機制

思路:

‘‘‘

1.將可叠代對象轉化成叠代器

2.內部使用__next__方法,取值

3.運用了異常處理去處理報錯

‘‘‘

li = [1,2,3,4,5,6,7]

li_obj = li.__iter__()

while True:

  try:

    i = li_obj.__next__()

    printe(i)

  except Exception:

    break

# Exception 表示一切非代碼錯誤

3.生成器

(1)

什麽是生成器:生成器本質是叠代器,是特殊的叠代器.所以叠代器的有點它都具有.

(2)

生成器的產生方式:

1.生成器函數構造

2.生成器推導式構造

3.數據類型的轉換

1.生成器函數構造

方法:

正常函數下面將return 變成yield,就可以將函數轉變成生成器.

例:

def funcl():

  print(666)

  print(555)

  return 777

print(funcl())

def funcl1():

  print(666)

  print(555)

  yield 444

  yleld 777

g = funcl()

print(g)

結論:# <generator object func1 at 0x0000000001197888>

解析:

第一:函數中只要有yield 那他就不是一個函數,而是一個生成器

第二:g稱作生成器對象

執行:

print(g.__next__())

print(g.__next__())

print(g.__next__()) #超出yield數量,報錯

sent的作用

next 和send 功能一樣,都是執行一次
send可以給上一個yield賦值

例:

def generator():
  print(123)
  content = yield 1
  print(content)
  print(456)
  yield 2
g = generator()
g.__next__()
g.send(‘hello‘)

Python 基礎第十三天(叠代器,生成器)