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