欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python迭代器iterator生成器generator使用解析

 更新時(shí)間:2019年10月24日 11:49:41   作者:snailon  
這篇文章主要介紹了Python迭代器iterator生成器generator使用解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

1. 迭代

根據(jù)記錄的前面的元素的位置信息 去訪問后續(xù)的元素的過程 -遍歷 迭代

2. 可迭代對象 iterable

如何判斷可迭代對象的3種方式

  • 能夠被迭代訪問的對象 for in
  • 常用可迭代對象-list tuple str
  • from collections import Iterable
  • isinstance(obj, Iterable)

3. 可迭代對象

可迭代對象通過__iter__方法提供一個 可以遍歷對象中數(shù)據(jù)的工具-迭代器

iter(可迭代對象) 可以獲取可迭代對象的迭代器

通過迭代器可以迭代訪問 數(shù)據(jù)

next(迭代器) ===== 迭代器對象.__next__()

可迭代對象的本質(zhì) 提供了一個迭代器(遍歷可迭代對象中的數(shù)據(jù))

如何獲取可迭代對象中的迭代器 迭代器對象 = iter(可迭代對象)

如果通過迭代器訪問可迭代對象中下一個元素 元素的值 = next(迭代器對象)

如果迭代器遍歷完成 拋出 停止迭代-異常StopIteration

如果需要實(shí)現(xiàn)一個迭代器 就需要實(shí)現(xiàn)__next__()

4. 迭代器 iterator

-- 迭代器訪問可迭代對象中數(shù)據(jù) 判斷對象是否是迭代器類型

from collections import Iterator
isinstance(obj, Iterator)

自己實(shí)現(xiàn)

迭代器本身也是可迭代對象 __iter__() 提供迭代器(self)

下一個元素的值 = next(迭代器) =====> __next__()

實(shí)現(xiàn)一個可迭代對象

from collections import Iterable
from collections import Iterator
import time


class MylistIterator(object):
  """這是Mylist類型的對應(yīng)迭代器類型 """
  def __init__(self,data):
    # 需要被便利的數(shù)據(jù)
    self.data = data
    # 保存用戶訪問的位置
    self.index = 0

  def __iter__(self):
    """python規(guī)定 迭代器是一種可迭代對象"""
    return self

  def __next__(self):
    """next(ml_iterator) 相當(dāng)于調(diào)用迭代器對象的.__next__()"""
    if self.index < len(self.data):
      ret = self.data[self.index]
      self.index += 1
      return ret
    else:
      # 訪問完成 應(yīng)該拋出異常
      raise StopIteration

class Mylist(object):
  """可迭代對象"""
  def __init__(self):
    self.data = [1,2,3,4,5]

  def __iter__(self):
    """提供迭代器"""
    # 返回迭代器對象
    mliter = MylistIterator(self.data)
    return mliter

# ml是一個可迭代類型
ml = Mylist()

# 獲取可迭代對象的 迭代器對象
ml_iter = iter(ml)
print(isinstance(ml_iter, Iterator))
for i in ml:
  print(i)
  time.sleep(1)

"""
1 可迭代對象的本質(zhì) 提供了一個迭代器(遍歷可迭代對象中的數(shù)據(jù))

2 如何獲取可迭代對象中的迭代器 迭代器對象 = iter(可迭代對象)
    實(shí)際上相當(dāng)于 可迭代對象.__iter__()
3 如果通過迭代器訪問可迭代對象中下一個元素 元素的值?。健ext(迭代器對象)
                  如果迭代器遍歷完成 拋出 停止迭代-異常StopIteration
"""
print(isinstance(ml, Iterable))

用迭代器完成斐波那契數(shù)列(難點(diǎn)在next)

"""兔子隊(duì)列 某一項(xiàng)的值是前兩項(xiàng)的和
1 1 2 3 5 8
"""

class Fib(object):
  def __init__(self,n):
    """初始化操作"""
    # n代表數(shù)列的長度
    self.n = n

    # 下標(biāo)記錄
    self.index = 0

    self.number1 = 0
    self.number2 = 1

  def __iter__(self):
    return self

  def __next__(self):
    """next(迭代器) ?。剑剑健?__next__()"""
    if self.index < self.n:
      ret = self.number1
      self.number1,self.number2 = self.number2,self.number2+self.number1
      self.index += 1
      return ret
    else:
      raise StopIteration

# list() tuple()都可以接收迭代器 并且將遍歷到的數(shù)據(jù)存儲到集合中
print(list(Fib(10)))
#
# # 打印斐波那契數(shù)列的前10項(xiàng)的值
# # for i in Fib(10):
# #   print(i)
# # 1 通過iter函數(shù)獲取可迭代對象 Iterable 的迭代器 iterator
# ml_iterator = iter(Fib(1000))
#
# # 2 在循環(huán)內(nèi)部不斷調(diào)用next(迭代器) 獲取下一個元素的值
# # 3 如果迭代完成 會拋出一個停止迭代的異常StopIteration

5. 生成器 generator

生成器是一種特殊的迭代器 --- 是迭代器, 并且有自己的特點(diǎn)

1 創(chuàng)建生成器表達(dá)式 [] ----》 (x for x in range(100))

2 生成器函數(shù)

凡是有yield關(guān)鍵字的函數(shù)都不是普通函數(shù)了 而是生成器函數(shù)

# 列表推導(dǎo)式
lis=[x for x in range(10)]
print(lis)

# 生成器表達(dá)式 中括號變圓括號
data=(x for x in range(10))
print(data)
# 遍歷data
for i in data:
  print(i)

結(jié)果:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
<generator object <genexpr> at 0x02AE7120>
1
3
5
7
9

6. yield關(guān)鍵字的作用

掛起當(dāng)前函數(shù) 將后面表達(dá)式的值 返回到調(diào)用生成器的地方

接收數(shù)據(jù) 并喚醒當(dāng)前函數(shù) 并且緊接著上次運(yùn)行的地址繼續(xù)執(zhí)行

7. 喚醒生成器的兩種方式

生成器.send("數(shù)據(jù)")

next(生成器) === 生成器.send(None)

在第一次調(diào)用生成器對象的是 必須使用next()

在后續(xù)的情況下 send和next可以混用

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論