0722迭代器

## 一、迭代器

### 1、定义

​		迭代是一个重复的过程,但是每次都是基于上一次的结果而来的,它不依赖于索引取值。

### 2、特性

​		它是一种同用的迭代取值的方法;惰性计算,节省内存

### 3、引入

```python
dic = {'k1': 1}  # 字典本身是可迭代的对象
dic_iteration = dic.__iter__()  # 将字典转换成迭代器对象
res1 = dic_iteration.__next__()  # 触发迭代器的功能,得到一个返回值,该返回值是从字典中迭代出来的对象
print(res1) ===========> k1
res2 = dic_iteration.__next__  # 当迭代器取值取完后,再次取值会抛出异常StopIteration
# 解决方法
while True:
    try 
    	res = dic_iteration.__next__()
    	print(res)
    except StopIteration 
    	break

二、可迭代对象与迭代器对象

1、内置有__iter__方法的类型,为可迭代对象

​ 字典、集合、文件对象(迭代器对象)、字符串、列表、元组

2、内置有__next__ 方法、__iter__方法的类型,为迭代器对象

dic_iteration = dic.__iter__()
dic_iteration.___next__()
dic_iteration.___iter__()  # 迭代器调用iter功能不会改变

三、for工作原理

dic = {'k1': 1, 'k2': 2}
dic_iteration = dic.__iter__()  # 将字典变成迭代器对象
while True:
    try:
        res = dic_iteration.__next__()  # 调用迭代器
        print(res)
    except StopIteration:  # 捕捉异常
    	break
        
        
for k in dic:
    print(k)
"""
步骤1 dic_iterator = dic.__iter__()
步骤2 k=dic_iterator.__next__(),执行循环体代码
步骤3 循环往复,直到抛出异常,for循环会帮我们捕捉异常结束循环
"""

四、同一个迭代器

​ 基于同一迭代器的重复取值,效果如何????

​ 迭代器取完之后,便没有值了,要想再取,需要重新将其装换成可迭代对象,即重新调用iter方法

# 示例1:
# dic = {"name": "egon", 'age': 18, 'gender': "male"}
# dic_iterator = dic.__iter__()
#
# while True:
#     try:
#         res = dic_iterator.__next__()
#         print(res)
#     except StopIteration:
#         break
#
# print('='*20)
# dic_iterator = dic.__iter__()
# while True:
#     try:
#         res = dic_iterator.__next__()
#         print(res)
#     except StopIteration:
#         break

# 示例2:
# dic = {"name": "egon", 'age': 18, 'gender': "male"}
# for k in dic:  # dic.__iter__()
#     print(k)

五、自定义迭代器

1、函数内出现yield,调用函数将不会执行内部代码,会得到一个返回值

def func():
    print('11')
    yield 1
    print('22')
    yield 2
    print('33')
    yield 3
    
    
g = func()  # 此处函数并不会运行,而是转换成了迭代器,因为函数里有yield
print(next(g))  # 调用一次迭代器,运行函数内代码,直到遇到yield,得到一个返回值,暂停
=====11
1
当函数内代码运行结束时,如果在调用,会抛出异常StopIteration

2、return vs yield

​ 相同点:都可以用来返回值

​ 不同点:return只能返回一次,函数就立即结束了

​ yield可以返回多次值,并挂起函数

3、总结

​ 优点: 通用的取值方式

​ 惰性计算,节省内存

​ 缺点:取值不如索引、key灵活

​ 取值是一次性的,只能往后取,无法预估个数

六、面向过程编程

"""
面向过程:
    核心是“过程”二字,过程指的就是做事的步骤
    也就是先干什、再干什么、后干什么。。。

    基于该思想写程序就好比设计一条条的流水线

优点:
    可以把复杂的问题流程化,进而简单化
缺点:
    牵一发而动全身,扩展性差

应用场景???
"""

七、生成式

# 1、列表生成式
l = [i for i in range(5)]  # for循环的简写
print(i)
=========>
l = [0, 1, 2, 3, 4]

# 集合生成式
s = {i for i in range(5)}
print(s)
=======>
s = {0, 1, 2, 3, 4}

# 字典生成式
d = {f'k{i}':i for i in range(5)}
print(d)
=======>
d = {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}

# 生成器生成式
res = (i for i in range(5))  # 由于元组可以有列表,set后转换,变没有元组生成式
print(next(res))  # 调用一次生成式,得到一个返回值0
print(next(res))  # 调用一次生成式,得到一个返回值1


# 快速对生成器的结果求和
res = sum(i for i in range(5))

with open('a.txt', mode='rt', encoding='utf-8') as f:
    res = sum(len(line) for line in f)

八、内置函数

1abs() 函数返回数字的绝对值。
2help() 函数用于查看函数或模块用途的详细说明。
3min() 方法返回给定参数的最小值,参数可以为序列。
4all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。空的列表、字典等,返回True
5dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。dir([object])
6any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。空的列表、字典等,返回False
7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值