'''
1、
可迭代对象:可以更新迭代的实实在在的值
内部含有__iter()__方法
优点:操作方法多,操作灵活、直观
2、
迭代器:可以更新迭代的一个工具(数据结构)。
内部含有__iter__与__next__方法的
文件句柄
优点:节省内存。惰性机制。
缺点:不直观,速度相对慢,操作方法单一,不能回退。
3、格式化输出
4、函数名的应用
'''
'''
1、生成器
yield
yield return
yield from
2、生成表达式,列表推倒式
3、内置函数
4、生成器的本质就是迭代器,唯一的区别:生成器是我们自己用python代码构建的数据结构,迭代器都是提供的,或者转换得来的。
5、获取生成器的三种方式。
生成器函数
生成器表达式
python内部提供的一些
'''
# 生成器函数获取生成器
# return:函数中只存在一个return结束函数,并且给函数的执行者返回值。
# yield:只要函数中有yield,那么就是生成器函数
# 生成器函数中可以存在多个yield,一个yield对应一个next。yield不会结束生成器
# def func():
# print(111)
# print(222)
# yield 3
# yield 4
# ret = func()
# print(ret)
# print(ret.__next__())
# print(ret.__next__()) # 一个next对应一个yield
# def func():
# for i in range(1,5001):
# yield f'{i} 号包子'
# ret = func()
#
# for i in range(200):
# print(ret.__next__())
# def func():
# l1 = [1,2,3,4,5]
# yield from l1
# ret = func()
# print(ret.__next__())
# 列表推倒式去构建一个比较复杂有规律的列表
# 列表推倒式:
# 循环模式:[变量(加工后的变量) for 变量 in iterable]
# l1 = [i for i in range(1, 11)]
# print(l1)
# l2 = [i**2 for i in range(1, 11)]
# print(l2)
# l3 = [i for i in range(1, 10) if i % 2 == 0]
# print(l3)
# l4 = [f'python{i}期' for i in range(1, 20)]
# print(l4)
# 筛选模式:[变量(加工后的变量) for 变量 in iterable if 条件]
# l1 = [i for i in range(1, 30) if i % 3 == 0]
# print(l1)
# l2 = ['asdqw', 'as', 'tliunwe', 'wo', 'wqileqwe']
# l3 = [s.upper() for s in l2 if len(s) < 3]
# print(l3)
# names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
# ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
# for s in names:
# for l in s:
# if l.count('e') == 2:
# print(l.upper())
#
# l4 = [l.upper() for s in names for l in s if l.count('e') == 2]
# print(l4)
# 生成器表达式
# 与列表推导式的写法几乎一模一样,也有筛选模式和循环模式,也可多层循环构建
# print((i for i in range(10)))
# 列表推导式
'''
1、列表推导式只能构建比较负责且有规律的列表
2、超过3层循环才能构建成功的不建议使用列表推导式
3、排错不行
'''
# l5 = [i for i in range(2, 11)] + list('JQKA')
# print(l5)