Python--迭代器

1、迭代器

1.1 定义

迭代器是访问可迭代对象的工具
迭代器是指iter(obj) 函数返回的对象(实例)
迭代器可以用next(it)函数获取可迭代对象的数据

1.2 迭代器函数 iter 和 next

·iter(iteratle)从可迭代对象中返回一个迭代器,iteratle必须是能提供一个迭代器的对象
·next(iterator)从迭代器iterator中获取下一个记录,如果无法获取下一条记录,触发StopIterator异常

1.3 说明:

迭代器只能往前取值,不会后退
用iter函数可以返回一个可迭代对象的迭代器

1.4 示例1:

L= [1,3,5,7]
it = iter(L)	# 让 L 提供一个能够访问自己的迭代器
next(it)		# 1  从迭代器中取值,让迭代器去获取L中的第一个元素
next(it)		# 3
next(it)		# 5
next(it)		# 7
next(it)		# 触发StopOIterator异常

1.5 迭代器的用途:

用迭代器可以依次访问可迭代对象的数据

2、生成器

2.1 定义

生成器是能够动态提供数据的对象,生成器对象也是可迭代对象(实例)

2.2 优缺点

·用现生成
·用内存少
·行时间较长
·节省空间

2.3 生成器种类

生成器函数	  # 含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象
生成器表达式

3、yield语句

3.1 语法:

yield 表达式

3.2 说明:

yield 用于 def 函数中,,目的是将此函数作成生成器函数使用	
yield用来生成数据,供迭代器和 next(it)函数使用

3.3 示例1

# 此示例示意含有yield语句的函数为生成器函数,及用yield生成整数
def myyield():
    yield 2
    yield 3
    yield 5
    yield 7
    print("生成器生成结束")
# 调用生成器函数来创建一个生成器。返回的是一个对象   即:生成器
# 生成 2 3 5 7 四个数
gen = myyield()			
# 用生成器拿到对应的迭代器
it= iter(gen)
# 访问迭代器 
print(next(it))
print(next(it))
print(next(it))
print(next(it))

3.4 示例2

import time
# 此示例示意含有yield语句的生成器函数的调用顺序
# 生成器只有在 next(it) 函数调用时次啊会执行,且遇到yield之后返回相应的值给next(it)函数
def myyield():
    print("即将生成2")
    time.sleep(1)
    yield 2
    print("即将生成3")
    time.sleep(1)
    yield 3
    print("即将生成5")
    time.sleep(1)
    yield 5
    print("即将生成7")
    time.sleep(1)
    yield 7
    print("生成器生成结束")
gen = myyield() 
it= iter(gen)
print(next(it),end = '\n\n')     # 此时生成器函数才开始执行,并遇到yield停止
print(next(it),end = '\n\n')
print(next(it),end = '\n\n')
print(next(it),end = '\n\n')
# print(next(it))     # 触发StopIteration异常

3.5 示例3

# 此示例示意用生成器函数生成 0~n 的整合
def myint(n):
    i = 0
    while i<n:
        yield i
        i+=1
a = int(input("请输入一个整数:"))
for x in  myint(a):
    print(x)

4、生成器函数的说明

生成器函数的调用将返回一个生成器对象,生成器对象是一个可迭代对象,通常用来动态生成数据
生成器函数调用 return 语句会触发一个 StopIterator异常

4.1 示例4

# 写一个生成器函数, myeven(start,stop) 用来生成start开始到stop(不包含)结束的偶数
def myeven(start,stop):
    for i in range(start,stop):
        if i % 2 == 0:
            yield i

for i in myeven(1,10):
    print(i)        # 2 4 6 8
L = [x ** 2 for x in myeven(1,20)]
print(L)            # [4, 16, 36, 64, 100, 144, 196, 256, 324]

4.2 示例5

# 写一个生成器函数myfactorial(n): 此函数用来生成n个从1开始的阶乘
import math
def myfactorial(n):
    yield math.factorial(n)
for i in range(1,5+1):
    for i in myfactorial(i):
        print(i,end = ' ')          # 1 2 6 24 120
print()
def myfac2(n):
    return math.factorial(n)
for i in range(1,10):
    print(myfac2(i),end = ' ')      # 1 2 6 24 120 720 5040 40320 362880
print()

5、生成器表达式

5.1 语法:

(表达式 for 变量 in  可迭代对象 [if 真值表达式])
其中if 子句可以省略

5.2 作用:

用推导式形式创建一个新的生成器

5.3 示例6:

gen = (x**2 for x in range(1,5))    # 现用现生成
it = iter(gen)
print(next(it))     # 1
print(next(it))     # 4
print(next(it))     # 9
print(next(it))     #16
print(gen)      # 打印生成器对象 : <generator object <genexpr> at 0x7f467888c5c8>

6、生成器表达式和列表推导式的区别

生成器表达式是现用现生成,列表推导式是一次性生成静态数据

示例7:
·列表推倒式

L = [2,3,5,7]
L2 = [x**2+1 for x in L]    # 生成即不变
it = iter(L2)
print(next(it))     # 5
L[1] = 30
print(next(it))     # 10

·生成器表达式

L = [2,3,5,7]
gen = (x**2+1 for x in L)   # 现用现生成
it = iter(gen)
print(next(it))     # 5
L[1] = 30
print(next(it))     # 901

7、迭代工具函数

7.1作用

是生成一个个性化的可迭代对象

7.2 函数

7.2.1 zip(iter1 [,iter2[…]])

返回一个zip对象,此对象用于生成元组,此元组的每个数据来源于参数中的可迭代对象,当最小的可迭代对象不再提供数据时迭代结束

示例8:

def myzip(iter1,iter2):
    it1 = iter(iter1)
    it2 = iter(iter2)
    while True:
        t = (next(it1),next(it2))
        yield t
nums = [10086,10000,10010,95588]
names = ['中国移动','中国联通','中国电信']
for t in zip(range(1,100),nums,names):
    print(t)

输出如下

(1, 10086, '中国移动')
(2, 10000, '中国联通')
(3, 10010, '中国电信')

7.2.2 enumerate(iterable [,start])

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

示例9:

names = ['中国移动','中国联通','中国电信']
for t in enumerate(names,1):
    print(t)

输出如下:

(1, '中国移动')
(2, '中国联通')
(3, '中国电信')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值