迭代器和生成器

迭代器iterator和生成器generator
      迭代器是访问可迭代对象的一种方式,用迭代器可以访问可迭代对象
      迭代器是指iter(可迭代对象)返回的对象

      迭代器可以用next(it)函数获取可迭代对象的数据

迭代器相关的函数:iter和next
iter(iterable)从可迭代对象中返回一个迭代器,iterable必须是能提供一个迭代器的对象
next(iterator)从迭代器iterator中获取下一个记录。如果无法获取下一条记录,则触发StopIterator异常
迭代器说明:迭代器只能往前取值,不会后退
          用iter函数可以返回一个可迭代对象的迭代器
示例:l = [2,3,5,7]
      it = iter(l)    //用iter返回一个迭代器用it绑定
      next(it)        //用next(it)用迭代器来获取l中的元素
      it = iter(range(1,10,3))
         print(next(it))
         print(next(it))

生成器generator
什么是生成器:
    生成器是能够动态提供数据的对象,生成器对象也是可迭代对象
生成器有两种:
    生成器函数
    生成器表达式
生成器函数定义:
    含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象
    yield翻译成(产生或生成)
yield语句:
    语法:yield 表达式
    说明:yield 用于def函数中,目的是将此函数作为生成器函数使用
          yield 用来生成数据,供next(it)函数使用

生成器表达式:
    语句:(表达式 for 变量 in 可迭代对象 [if 真值表达式])
    注解:[]内的if部分可以省略
    作用:用推导式形式生成一个新的生成器
    示例:gen = (x**2 for x in range(1,5))
          it = iter(gen)
          next(it)
    附加:好比中间商,不存储任何数据,现用现生成。节省内存。

迭代工具函数:
    迭代工具函数的作用是生成一个个性化的可迭代对象
zip(iter1[,itera2,...])返回一个zip对象,此对象用于生成一个元组,此元组的个数是由最小的可迭代对象决定,
    元组内容是可迭代对象iter1和iter2中元素的组合
enumerate(iterable[,start])

    生成带索引的枚举对象,返回的迭代类型为索引-值对(index-value)对,默认索引从0开始,也可以用start指定


例子:

# l = [2,3,5,7]
# # 用iter返回一个迭代器用it绑定
# it = iter(l)
# # 用next(it)用迭代器来获取l中的元素
# next(it)

# l = ["fg",5,"fd"]
# it = iter(l)
# print(next(it))

# it = iter(range(1,10,3))
# print(next(it))
# print(next(it))

# l = [2,3,5,7]
# # for x in l:
# # print(x)
# it = iter(l)
# while True:
# try:
# x = next(it)
# print(x)
# except StopIteration:
# break

# s = {"工商英航","建设银行","中国银行","农业英航"}
# # for x in s:
# # print(x)
# it = iter(s)
# while True:
# try:
# x = next(it)
# print(x)
# except StopIteration:
# break

# def myyield():
# print("即将生成2")
# yield 2
# # 等同于yield 3 
# print("即将生成3")
# yield 2+1    
# print("即将生成5")
# yield 5
# print("即将生成7")
# yield 7
# print("生成器函数调用结束")
# # 返回的不是空,是生成器对象.gen绑定生成器对象,此对象为可迭代对象
# gen = myyield()
# it = iter(gen)
# print(next(it))
# print(next(it))
# for x in gen:
# print(x)
# 附加:gen就是一个可迭代对象,但是数据实际不存在,现用现调取数据,
#     每一次调完数据都停留在yield语句处.

# def shxuue(n):
# # 先初始化变量i将其设置为起始数
# i = 1
# # 循环判断是否已到终止点,如果未到则生成
# while i<n:
# yield i
# i +=1
# for x in shxuue(5):
# print(x)

# def myodd(a,b):
# i = a
# # 循环判断是否已到终止点,如果未到则生成
# while i<b:
# if i%2==0:
# yield i+1
# else:
# yield i
# i +=2
# for x in myodd(10,20):
# print(x)

numbers = [10086,10000,10010,95588]
name = ["中国移动","中国电信","中国联通"]
# for t in zip(numbers):
# print(t)
# dict([(10086,"电信"),(10000,"联通")])

# dict(zip(numbers))numbers = [10086,10000,10010,95588]

numbers = [10086,10000,10010,95588]
name = ["中国移动","中国电信","中国联通"]
for t in zip(numbers,name):
  print(t)

# def myzip():
# it1 = iter(iter1)
# it2 = iter(iter2)
# while True:
# a = next(it1)
# b = next(it2)
#    yield (a,b)
# numbers = [10086,10000,10010,95588]
# name = ["中国移动","中国电信","中国联通"]
# for t in myzip(numbers,name):
# print(t)

# name = ["中国移动","中国电信","中国联通"]
# for t in enumerate(name,2):
# print(t)
# for k,n in enumerate(name,2):
# print(n)
# # 附加:for语句等同于while语句,while是从迭代器取值,赋值给变量
# it = iter(enumerate(name,2))
# while True:
# try:
# k,n = next(it)
# print("序号",k,"值",n)
# except:
# break

# l=[]
# # d = ["第一行","第二行","第三行"]
# while True:
# s = input("")
# if not s:
# break
# l+=[s]
# for m,n in enumerate(l):
# print("第",m,"行",n)
# for t in enumerate(l):
# print(t)

# l=[]
# # d = ["第一行","第二行","第三行"]
# while True:
# s = input("")
# if not s:
# break
# l+=[s]
# it=iter(enumerate(l,1))
# while True:
# try:
# m,n= next(it)
# print(m,n)
# except:
# break


































  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值