梦想加空间 - 一个程序猿的个人博客网站

您現在的位置是:首頁 >python教程 >python教程十六 迭代器與生成器網站首頁python教程

python教程十六 迭代器與生成器

三只小菜猿 2023-02-10 09:35:44
簡介在調用生成器運行的過程中,每次遇到 yield 時函數會暫停并保存當前所有的運行信息,返回 yield 的值, 并在下一次執行 next() 方法時從當前位置繼續運行。跟普通函數不同的是,生成器是一個返回迭代器的函數,只能用于迭代操作,更簡單點理解生成器就是一個迭代器。迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會后退。() 方法返回一個特殊的迭代器對象, 這個迭代器對象實現了。調用一個生成器函數,返回的是一個迭代器對象。迭代器是一個可以記住遍歷的位置的對象。

迭代器

迭代是Python最強大的功能之一,是訪問集合元素的一種方式。

迭代器是一個可以記住遍歷的位置的對象。

迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會后退。

迭代器有兩個基本的方法:iter() 和 next()。

字符串,列表或元組對象都可用于創建迭代器:

>>> list=[1,2,3,4]
>>> it = iter(list)    # 創建迭代器對象
>>> print (next(it))   # 輸出迭代器的下一個元素
1
>>> print (next(it))
2
>>>

迭代器對象可以使用常規for語句進行遍歷:

#!/usr/bin/python3
 
list=[1,2,3,4]
it = iter(list)    # 創建迭代器對象
for x in it:
    print (x, end=" ")

執行以上程序,輸出結果如下:

1 2 3 4

也可以使用 next() 函數:

#!/usr/bin/python3
 
import sys         # 引入 sys 模塊
 
list=[1,2,3,4]
it = iter(list)    # 創建迭代器對象
 
while True:
    try:
        print (next(it))
    except StopIteration:
        sys.exit()

執行以上程序,輸出結果如下:

1 2 3 4

創建一個迭代器

把一個類作為一個迭代器使用需要在類中實現兩個方法 iter() 與 next() 。

如果你已經了解的面向對象編程,就知道類都有一個構造函數,Python 的構造函數為 init(), 它會在對象初始化的時候執行。

iter() 方法返回一個特殊的迭代器對象, 這個迭代器對象實現了 next() 方法并通過 StopIteration 異常標識迭代的完成。

next() 方法(Python 2 里是 next())會返回下一個迭代器對象。

創建一個返回數字的迭代器,初始值為 1,逐步遞增 1:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    x = self.a
    self.a += 1
    return x
 
myclass = MyNumbers()
myiter = iter(myclass)
 
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

執行輸出結果為:

1 2 3 4 5

StopIteration

StopIteration 異常用于標識迭代的完成,防止出現無限循環的情況,在 next() 方法中我們可以設置在完成指定循環次數后觸發 StopIteration 異常來結束迭代。

在 20 次迭代后停止執行:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration
 
myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter:
  print(x)

執行輸出結果為:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

生成器

在 Python 中,使用了 yield 的函數被稱為生成器(generator)。

跟普通函數不同的是,生成器是一個返回迭代器的函數,只能用于迭代操作,更簡單點理解生成器就是一個迭代器。

在調用生成器運行的過程中,每次遇到 yield 時函數會暫停并保存當前所有的運行信息,返回 yield 的值, 并在下一次執行 next() 方法時從當前位置繼續運行。

調用一個生成器函數,返回的是一個迭代器對象。

以下實例使用 yield 實現斐波那契數列:

#!/usr/bin/python3
 
import sys
 
def fibonacci(n): # 生成器函數 - 斐波那契
    a, b, counter = 010
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10# f 是一個迭代器,由生成器返回生成
 
while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()

執行以上程序,輸出結果如下:

0 1 1 2 3 5 8 13 21 34 55


夢想加空間!平時喜歡研究各種技術,目前在從事后端開發工作,熱愛生活、熱愛工作。
主站蜘蛛池模板: 深圳货柜租赁_集装箱出售/租赁_集装箱改造_鹏泰集装箱 | 中华石油化工网 www.cnpec.net——歌颂石化 服务石化 奉献石化 发展石化 | 专业色素炭黑生产厂家,提供各种用途色素炭黑价格-枣庄鑫源化工 | 生物除臭塔_生物除臭箱_玻璃钢吸收塔_玻璃钢集气罩_-安丘恒业玻璃钢有限公司 | 南通搬运公司|吊车租赁|大件吊装|设备搬运|工厂搬迁|起重吊装搬运-顺林搬运 | 湖南长沙智能实验室规划设计、整体建设、净化装修、改造施工公司-福临建设 | 上海云屹国际快递-承接化工品_液体_粉末_化妆品_食品_锂电池等国际快递业务 | 四通球阀_304真空阀_不锈钢五通球阀厂家-浙江壬丰阀门有限公司 | 上海眸社设计-上海专业的VI设计,宣传册设计,画册设计,折页设计公司 | 制沙机,反击式破碎机,重锤破碎机,泥石分离机,圆锥破碎机厂家-昆明德鑫机械 | 济宁市天众机械有限公司_机械加工,电力产品,冶金产品,造纸机械 | 环保白电油_甲醇_二价酸酯DBE_防白水-【名亿新材料】 | 内衬不锈钢复合管,大口径内衬不锈钢复合钢管,双金属复合管,内衬不锈钢复合管厂家-江苏新澎 | 一体式电磁流量计_分体式电磁流量计_卫生级电磁流量计_卫生型电磁流量计_电池供电电磁流量计_卡箍式电磁流量计_废水电磁流量计_德克森仪表(淮安)有限公司官网 | 生物除臭_废气处理_玻璃钢风机_布袋除尘_脱硫脱硝_催化燃烧_生物滤池_广东正州环保科技股份有限公司 | 小型环境空气质量连续监测系统-烟气排放连续监测仪(碳排放)-青岛明德环保仪器有限公司 | 山西档案架,智能档案密集架,手摇密集架,山西密集架厂家批发/报价 | 武汉学化妆美容美发美甲纹绣教学 - 小墨定妆 | 西安泰富西玛电机有限公司总部-电机-高压电机-西玛电机-西安西玛电机-泰富西玛电机-西安电机厂-西玛电机销售 | 新闻营销媒体发稿-新闻发布-文芳阁网络媒体发稿公司 | 兰州沙盘模型公司_兰州模型公司_兰州沙盘模型厂家_地形沙盘制作_兰州沙盘模型制作公司 | 汽车检具标准件_汽车检具配件_昆山宏易腾达模具五金有限公司 | 轮式挖掘机厂家_抓铁机_全自动混凝土搅拌车_山重机械【官网】 | 万级无菌室-阳性对照室-干细胞实验室-广州沃霖实验室设备有限公司 | 耐磨工业软管,PTFE耐腐蚀软管,耐磨喷砂胶管,超耐磨软管厂家,漯河利通液压管利通科技-耐磨工业软管,PTFE耐腐蚀软管,耐磨喷砂胶管,超耐磨软管厂家,漯河利通液压管利通科技 | 五金冲压件生产厂家_加工五金拉伸件-沧州浚鼎机械制造有限公司-沧州浚鼎机械制造有限公司 | 湖州网站建设_湖州网络公司_湖州后普网络科技有限公司 | 衢州装饰公司_衢州装修公司_衢州创美装饰工程有限公司 - Powered by www.qzcmzs.com | 云南自考网_云南自学考试网 | 郑州同林-金属切削液,全合成,半合成,防锈水溶性,微乳,油基长寿乳化切削液生产厂家 | 连续式回转炉_间歇式回转炉_燃气式回转炉_电加热回转炉-长兴博达机械配件有限公司 | 混凝土修补-清水混凝土保护剂-仿清水混凝土-混凝土装修-混凝土色差处理-混凝土色差修复剂-德州唐荣建筑装饰工程有限公司 | 浏阳企业网站建设|设计|制作,专业做网站,建站公司-冠讯网络公司 领先的一站式_专利申请代理知识产权服务平台_乐知网 | 智能锁十大品牌_指纹锁_智能锁加盟_开换锁-锁当家【官网】 | 水电站泵站LCU控制屏_发电机保护_变压器保护_逆功率保护_防孤岛保护装置_ 电力微机保护网 | 江苏科星新材料有限公司 - 南通科星化工股份有限公司 - 南通星奇新材料有限公司 | 山东恒泰矿业设备有限公司_跑车防护装置,矿用电机车,防爆无轨胶轮车,耙斗装岩机 | 威海保温板,威海泡沫,威海EPS,威海EPP-威海东兴泡塑科技有限公司 | 冷却塔厂家_冷却塔降噪维修_闭式冷却塔维修改造厂家-广东特菱空调 | 激光焊接机_激光打标机_激光切割机-惠州市镭凌激光科技有限公司 激光焊接不锈钢翅片管,不锈钢翅片管,激光焊接复合翅片管,南通拓帆换热设备有限公司 | 桥梁支座更换_桥梁检测车租赁_高空作业车出租_支座更换_伸缩缝安装_隧道防水_养护加固_维修_出租_衡水庆兴桥梁养护工程有限公司 桥梁养护|桥梁维修加固|隧道裂缝修补|支座更换|管道堵水气囊|衡水众拓路桥养护有限公司 |