今日内容:
迭代器(for、list、tuple、dict、set)(****)
生成器(yield)(****)
面向过程编程(****)
三元表达式
列表生成式
字典生成式
生成器表达式
# 迭代器
"""
1、什么是迭代器
器=》工具
迭代:是一个重复的过程,但每次重复都是基于上一次的结果而来的
names=["egon",'lqz','yj']
count = 1
while count < len(names):
print(names[count])
count+=1
迭代器:就是一种不依赖于索引的取值工具
2、为何要有迭代器
特性:
1、是一种通用的迭代取值方案
2、惰性计算,节省内存
3、如何用迭代器
"""
'''
# =========================一、引入==========================
# dic = {"name": "egon", 'age': 18, 'gender': "male"}
# dic_iterator = dic.__iter__()
#
# res1 = dic_iterator.__next__()
# print(res1)
# res2 = dic_iterator.__next__()
# print(res2)
# res3 = dic_iterator.__next__()
# print(res3)
#
# dic_iterator.__next__() # StopIteration
# while True:
# try:
# res = dic_iterator.__next__()
# print(res)
# except StopIteration:
# break
# =================二、可迭代对象与迭代器对象=================
# 可迭代的对象/类型:内置有__iter__方法
# 1、字典dict
# 2、集合set
# 3、文件对象(也是迭代器对象)
# 4、字符串str
# 5、列表list
# 6、元组tuple
# 迭代器对象: 内置有__next__方法、__iter__方法
# dic = {"name": "egon", 'age': 18, 'gender': "male"}
# dic_iterator1 = dic.__iter__()
# dic_iterator1.__next__()
# print(dic_iterator1.__iter__().__iter__().__iter__() is dic_iterator1)
# dic_iterator2 = dic.__iter__()
# =================三、for循环的工作原理=================
# dic = {"name": "egon", 'age': 18, 'gender': "male"}
# dic_iterator = dic.__iter__()
# while True:
# try:
# res = dic_iterator.__next__()
# print(res)
# except StopIteration:
# break
# 以上 等价于:
# for k in dic:
# print(k)
"""
步骤1 dic_iterator = dic.__iter__()
步骤2 k=dic_iterator.__next__(),执行循环体代码
步骤3 循环往复,直到抛出异常,for循环会帮我们捕捉异常结束循环
"""
# dic = {"name": "egon", 'age': 18, 'gender': "male"}
# dic_iterator = dic.__iter__()
# # for k in dic_iterator:
# # print(k)
# print(dic_iterator)
# =================四:基于同一迭代器的重复取值,效果如何????=================
# 示例1:
# dic = {"name": "egon", 'age': 18, 'gender': "male"}
# dic_iterator = dic.__iter__()
#
# while True:
# try:
# res = dic_iterator.__next__()
# print(res)
# except StopIteration:
# break
#
# print('='*20)
# dic_iterator = dic.__iter__()
# while True:
# try:
# res = dic_iterator.__next__()
# print(res)
# except StopIteration:
# break
# 示例2:
# dic = {"name": "egon", 'age': 18, 'gender': "male"}
# for k in dic: # dic.__iter__()
# print(k)
#
# for k in dic: # dic.__iter__()
# print(k)
'''
# 生成器(自定义迭代器)
'''
# 自定义迭代器来实现惰性计算,从而达到节省内存的效果
# 1、什么是生成器
# 但凡是函数内出现了yield关键字,调用函数将不会执行函数体代码,会得到一个返回值,该返回值就是我们自定义的迭代器,称之为生成器
# def func():
# print("hello1")
# yield 111
# print("hello2")
# yield 222
# print("hello3")
# yield 333
# g = func()
# print(g,type(g)) # 生成器本质就是迭代器
# res = next(g)
# print(res)
# res = next(g)
# print(res)
# res = next(g)
# print(res)
#
# next(g) # 报错 StopIteration
# 2、yield 和 return的异同
# (1)相同点:都可以用来返回值
# (2)不同点:
# return只能返回一次值,函数就立即结束了
# yield能返回多次值,yield可以挂起函数
# 案例
# def func():
# res=0
# while True:
# res+=1
# yield res
#
# g=func()
# for i in g:
# print(i)
# 总结迭代器的优缺点
# 优点:
# 1、是一种通用的迭代取值方案
# 2、惰性计算,节省内存
# 缺点:
# 1、取值不如索引、key的取值方式灵活
# 2、取值是一次性的,只能往后取,不能预估值的个数
# def my_range(start, stop, step=1):
# while start < stop:
# yield start
# start += step
#
# for i in my_range(1,5,2): # 1 3
# print(i)
'''
# 生成式
'''
# 1、列表生成式
# l=[i**2 for i in range(5) if i > 2]
# print(l)
# names=['lqz_sb','yj_sb','jason_sb','egon']
#
# l=[name for name in names if name.endswith('sb')]
#
# print(l)
# 2、集合生成式
# res={i for i in range(5)}
# print(res)
# 3、字典生成式
# res={f'k{i}': i**2 for i in range(5)}
# print(res)
# 4、生成器表达式
# res=(i for i in range(5))
# # print(res,type(res))
# nums = (i for i in range(200000))
# res = sum(nums)
# print(res)
#
# names = ['lqz_sb', 'yj_sb', 'jason_sb', 'egon']
# l = [i for i in names if i.endswith('sb')]
# print(l)
#
# with open(r'F:\notepad\2020.7.01\day14\7.21.py', mode='rt', encoding='utf-8') as f:
# print(sum(len(line) for line in f))
'''
# 面向过程
"""
面向过程:
核心是“过程”二字,过程指的就是做事的步骤
也就是先干什、再干什么、后干什么。。。
基于该思想写程序就好比设计一条条的流水线
优点:
可以把复杂的问题流程化,进而简单化
缺点:
牵一发而动全身,扩展性差
"""