day15

今日内容:
迭代器(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))
'''

# 面向过程
"""
面向过程:
    核心是“过程”二字,过程指的就是做事的步骤
    也就是先干什、再干什么、后干什么。。。

    基于该思想写程序就好比设计一条条的流水线

优点:
    可以把复杂的问题流程化,进而简单化
缺点:
    牵一发而动全身,扩展性差

"""

 

posted @ 2020-07-22 15:40  板鸭没有腿  阅读(73)  评论(0)    收藏  举报