range方法其实就是一个可迭代对象
for i in range(1,10):
print(i)
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
接下来我们自己来定义一个range,来模拟range方法.
先以两个参数的range方法为例
def my_range(start, end=None, step=1):
if not end: # 没有给end传值 my_range(10)
end = start
start = 0
while start < end:
yield start
start += step
for i in my_range(1,100):
print(i)
一个参数的range方法
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, end=None, step=3):
if not end: # 没有给end传值 my_range(10)
end = start
start = 0
while start < end:
yield start
start += step
for i in my_range(1,100):
print(i)
# 1,4,7,...94,97
for循环原理
不依赖for循环, 完成对列表元素的取值
l = [11,22,33,44,55,66,77,89] res = l.__iter__() print(res) #
l = [11,22,33,44,55,66,77,89] res = l.__iter__() # print(res) #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
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



