range方法其实就是一个可迭代对象
for i in range(1,10):
print(i)
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
接下来我们自己来定义一个range,来模拟range方法.
先以两个参数的range方法为例
# 1.可以先以两个参数的功能编写 range(1, 10)
def my_range(start_num, end_num):
while start_num < end_num:
yield start_num
start_num += 1
for i in my_range(1, 10):
print(i)
一个参数的range方法
# 2.再考虑一个参数的情况 range(10) range(0,10)
def my_range(start_num, end_num=None): # my_range(10)
if not end_num:
end_num = start_num
start_num = 0
while start_num < end_num:
yield start_num
start_num += 1
for i in my_range(100):
print(i)
end 可以不传值,应该设置成默认参数, end = None
代码层面做判断,将形参数据做替换处理, end = start start = 0
三个参数的range方法
给函数添加第三个形参, 并且设置成默认参数, 默认值为1, 即step = 1
每次递增的时候只需要递增step的数值即可. start += step
def my_range(start_num, end_num=None, step=1): # my_range(1,10,3)
if step < 1:
step = 1
if not end_num:
end_num = start_num
start_num = 0
while start_num < end_num:
yield start_num
start_num += step
# for i in my_range(1, 100, 2):
# print(i)
# for i in my_range(1, 5):
# print(i)
# for i in my_range(10):
# print(i)
for i in my_range(1, 100, -2):
print(i)
for循环原理
不依赖for循环, 完成对列表元素的取值
l = [11,22,33,44,55,66,77,89]
res = l.__iter__()
print(res) # <list_iterator object at 0x000001663EDFC2E8>
l = [11,22,33,44,55,66,77,89]
res = l.__iter__()
# print(res) # <list_iterator object at 0x000001663EDFC2E8>
n = 0
while n < len(l):
print(res.__next__())
n += 1
# 11
# 22
# 33
# 44
# 55
# 66
# 77
# 89
for循环底层原理
for 变量名 in 可迭代对象:
循环体代码
1.会将in后面的数据调用__iter__()变成迭代器对象
为什么文件对象也可以for循环 因为本身就是迭代器对象 再次调用不变
2.针对产生的迭代器对象依次调用__next__()方法迭代取值
3.当值取完之后 会自动处理报错并退出循环
l = [11,22,33,44,55,66,77,89]
res = l.__iter__()
while True:
print(res.__next__())
Traceback (most recent call last):
File "C:/me/JetBrains/pythonProject/迭代器生成器/生成器.py", line 97, in <module>
print(res.__next__())
StopIteration
11
22
33
44
55
66
77
89
for循环本质
结合异常处理
res = 可迭代对象.__iter__()
while True:
try:
print(res.__next__)
except StopIteration as e:
break