17 迭代器

本文深入解析迭代器和生成器在Python中的核心作用,包括惰性计算、可迭代对象与迭代器转换、生成器的yield用法,以及实战中的迭代器生成式、函数递归和列表生成式等。掌握这些技巧,提升代码效率并理解高级编程概念。
摘要由CSDN通过智能技术生成

一、迭代器

迭代:一个重复的过程,每次重复都是基于上一次的结果进行
迭代器:迭代取值的工具

迭代器的优点

1.一种通用的迭代器取值方案
​ 2.惰性计算。节省内存
生成迭代器把原来对象的空间给了迭代器占用了,每次在输出时是输出一个从而节省内存

# 迭代的过程
	count = 1
	while count < 5
	count += 1
	
# 单纯的重复不是迭代
    while True:
		  1+1

索引遍历
索引累加方式只适用于有索引的对象,字典, 集合没有索引 ,这个方式不通用

# 利用索引遍历列表
name= ['k', 1, 'k2',2]  
i = 0
while i < len(name):
	print(i)
	i += 1

2.可迭代对象

Python 提供了 .__iter__() 内置方法—与---> iter() 将可迭代对象转为迭代器
1.可以使用这个方法的都是可迭代对象
2.迭代对象调用 .__iter__()后会返回一个迭代器对象 iterator类型
3.迭代器一定是可迭代对象,迭代器对象可以使用.__iter__(),返回值是它本身

Python 提供了 .__next__() 内置方法—与---> next()迭代器的取值方式
1.可以使用这个方法的都是迭代器

2.迭代器对象值取是一次性的,值被取干净了就不能在取值了,也不能像索引一样取指定的值,只能next

# 字符串 列表 元组 字典 集合 文件
'abc'.__iter__()         # <class 'str_iterator'>
[1, 2].__iter__()        # <class 'list_iterator'
(1, 2).__iter__()
{'x': 1}.__iter__()
{1, 2, 3}.__iter__()
open('a.txt').__iter__()
# 一般使用函数,自动触发.__xxx__()的功能

str_1 = 'abc'
iter_1 = iter(str_1) # 生成迭代器

# next 一次取出一个值(基于上一次结果运行)
print(next(iter_1))  #  a
print(next(iter_1))  #  b
print(next(iter_1))  #  c

# 没有值取了就会报错,需要重新生成迭代器 iter_1 = iter(str_1)
print(next(iter_1))  
# 迭代器使用iter() 返回值  是自己本身
s = 'abc'
iter_s = iter(s)

print(iter_s is iter(iter_s))   #  True
list_1 = [1, 2, 3, 4]

iters = iter(list_1)

while True:
    try:                         # 捕捉异常
        print(next(iters))
    except StopIteration:        # StopIteration 在迭代器没有值取时报错
        break
        
 """ ----------------------------------------------------------------
for 工作原理
1.调用 in 后面 对象的.__iter__方法,得到迭代器对象
2.循环next
3.直到取完值,抛出异常,被捕捉到异常结束循环
"""   

3.生成器

yield 关键字:暂停函数的运行,返回一个生成器对象值(任意类型,任意个数)

生成器对象就是迭代器对象,next可以取值

def func():
    print(1)
    yield 2
    print(3)


l=func()
print(next(l))  # 只有一个就在yield 2暂停了

# 在加一个就报错了StopIteration,
print(next(l))   # 需要在print(3)下面加 yield 


制作迭代器

def func():
    res = 0
    while True:
        yield res
        res += 1

res = func()
for i in res:
    print(i)

函数递归
函数递归是函数嵌套的一种格式,在调用一个函数时,在其内部自己调用自己
,提供了一种基于函数实现循环默认1000层,超出报错。

递归分两个阶段:
1.回溯
2.递推

def func():
	...
	func()    # 默认最高1000层

func() 
def func(n):
    if n == 1:
        return 10
    return func(n-1) + 10   # func(n-1) 循环了 n-1 次

print(func(5))
list1 = [1, [2, [3, [4, [5]]]]]

def func(list1):
    for i in list1:
        if type(i) is list:
            func(i)
        else:
            print(i)

func(list1)
# 二分法查找一个值是否存在与列表
list0 = [1, 2, 3, 4, 5, 9, 16, 17]

def func(list_1, num):
    mid = len(list_1) // 2
    if list_1 == []:
        return print('不存在')
    elif list_1[mid] > num:
        func(list_1[:mid], num)
    elif list_1[mid] < num:
        func(list_1[mid + 1:], num)
    else:
        return print('找到了')
    
func(list0, 10)

三元表达式

代码精简–>可读性提高

# 返回值 条件成立  if 条件 else 条件不成立

x, y = 10, 20

if x > y:
    a = x
else:
    a = y

z = x if x > y else y

print(a)
print(z)

列表生成式

list1 = []
for i in range(10):
    list1.append(i)
print(list1)


list2 = [i for i in range(10)]
print(list2)

"""
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
"""
list1 = []
for i in range(10):
    if i > 5:
        list1.append(i)
print(list1)


list2 = [i for i in range(10) if i > 5 ]
list3 = ['ok' for i in range(10) if i > 5 ]
print(list2)
print(list3)
list1 = ['vip', 'vip', 'vip']
x = '123'

res = [list1[i] + x[i] for i in range(len(list1))]

print(res)

字典生成器式

print({'k%s' %i : i  for i in range(5)})

集合生成式

print({'k%s' %i   for i in range(5)})

迭代器生成式

print(i   for i in range(5))

文件类型本身就是一个迭代器

# 统计字符的一个方式
with open(r'练习.py', mode='rt', encoding='utf8') as f:
    res = sum( len(i) for i in f)
    print(res)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值