一、迭代器
迭代:一个重复的过程,每次重复都是基于上一次的结果进行
迭代器:迭代取值的工具
迭代器的优点
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)