1.用生成器完成自定义range方法,可以完成系统range的所有功能
def my_range(start, end=None, step=1):
if end is None:
start, end = 0, start
n = start
while True:
normal = n >= end and step > 0
abnormal = n <= end and step < 0
if normal or abnormal:
break
yield n
n += step
# for i in my_range(10):
# print(i)
2.生成器完成自定义enumerate⽅法,也可以为可迭代对象提供索引支持
不判断,和系统一样,传非迭代对象抛异常
def my_enumerate(target, start=0):
for i in target:
yield (start, i)
start += 1
def my_enumerate2(target, start=0):
try:
for i in target:
yield (start, i)
start += 1
except Exception:
print("不是可迭代对象,不能处理")
# for v in my_enumerate2(43214):
# print(v)
#参考答案
def my_enumerate(iterable, start=0):
# str, list, tuple, set, dict 五个基础
b1 = isinstance(iterable, (str, list, tuple, set, dict))
# 处理理字典的keys,values,items
b2 = type(iterable) in [type({}.keys()), type({}.values()), type({}.items())]
if b1 or b2:
for v in iterable:
yield (start, v)
start += 1
else:
yield '暂不不能处理理'
# for v in my_enumerate({'a': 1}.items(), 100):
# print(v)
3.用生成器完成获取阶乘得方法,第一次next得到1的阶乘,第二次next得到2的阶乘,依次类推,直接for循环,可以依次得到指定范围内得所有阶乘,eg:factorial(10),可以得到1~10之间的10个阶乘
def factorial(num=1):
total = 1
for i in range(1, num + 1):
total *= i
yield total
for i in factorial(3):
print(i)