一、迭代器

1.迭代器即用来迭代取值的工具,而迭代是重复反馈过程的活动,其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代

 

items = ["egon","tom","lili"]
 
        def func(items):
            i = 0
            while i < len(items):
                print(items[i])
                i += 1

 

2.用迭代器的两个原因:

      (1).为了找到一种新的、统一的取值方式(可以不依赖与索引以及Key的)

      (2).惰性计算,不耗费内存

3.用法

(1).可迭代对象 iterable

    内置有__iter__方法     (可迭代对象.__iter__()  返回迭代器对象)

  (2).迭代器对象 iterator

    内置有__iter__方法

    内置有__next__方法  (迭代器对象.__next__() 返回的是下一个值)

 

# "abc".__iter__()          #可迭代对象
# [1,2,3].__iter__()       #...
# (1,2,3).__iter__()           #...
# {'k1':111}.__iter__()       #...
# {111,22}.__iter__()        #...
# open('b.txt',mode='wb').__iter__()    #不变
# open('b.txt',mode='wb').__next__()    #文件属于迭代器对象
 
 
# dic = {'name':'egon','age':18,'gender':'male'}
# dic = "hello"
# iter_dic = dic.__iter__()
# print(iter_dic)
# print(iter_dic.__iter__().__iter__().__iter__() is iter_dic)
 
# print(iter_dic)
# print(iter_dic.__next__())
# print(iter_dic.__next__())
# print(iter_dic.__next__())
# print(iter_dic.__next__())  # StopIteration    取完

 

for循环原理:

dic = {'name':'egon','age':18,'gender':'male'}
# len("hello")  # "hello".__len__()
 
# iter_dic = iter(dic)  # dic.__iter__()
#

# while True:       
#     try:
#         print(next(iter_dic))
#     except StopIteration:
#         break
 
# for k in dic:    #dic 即为可迭代对象
#     print(k)

####迭代器对象每次取完值,意味着原值不被取出,不能重复取迭代器对象,必须重新生成一个迭代器对象

dic = {'name':'egon','age':18,'gender':'male'}
iter_dic = iter(dic)
 
for k in iter_dic:
    print(k)
print('='*50)
for k in iter_dic:      #该迭代器对象已经取完了
    print(k)
 
for k in dic:
    print(k)
print('='*50)
for k in dic:
    print(k)

4.总结迭代器对象优缺点

#优点

  (1).提供了一种新的、统一的取值方式(可以不依赖与索引以及Key的)

  (2).惰性计算,不耗费内存

 

#缺点

  (1)取值不够灵活

  (2)一次性的,只能往后取,无法预知数据的个数

二、生成器

1.函数内但凡出现 yield 关键字,再调用函数不会执行函数体代码,会得到一个生成器对象

  生成器就是一种自定义的迭代器

2.yield 与 return

  相同点:返回值层面都一样

  不同点:return只能返回一次值函数就立即结束,而yield可以返回多次值

 

# def func():
#     print('hello1')
#     yield 1
#     print('hello2')
#     yield 2
#     print('hello3')
#     yield 3
#     print('hello4')
#
# g = func()
# # print(g)
# # g.__iter__()
# # g.__next__()
#
# res1 = next(g)
# print(res1)
#
# res2 = next(g)
# print(res2)
#
# res3 = next(g)
# print(res3)
#
# next(g)

 

3.列表生成式

例题一
# nums = []
# for i in range(1,6):
#     nums.append(i**2)
 
# nums = [i**2 for i in range(1,6)]
# nums = ['ok' for i in range(1,6)]
# print(nums)
 
例题二
# names = ['egon_nb',"lxx_sb","hxx_sb"]
 
# new_l = []
# for name in names:
#     if name.endswith("_sb"):
#         new_l.append(name)
 
# new_l = [name for name in names if name.endswith("_sb")]
# print(new_l)

4.字典生成式

一
# res = {i:i**2 for i in range(5)}
# print(res,type(res))
 二
# items = [('k1',111),('k2',222)]
# print({k:v for k,v in items})

5.集合生成式

# res = {i for i in range(5)}
# print(res,type(res))

6.生成器表达式

# res = (i for i in range(5))
# print(res,type(res))
 
# print(next(res))
# print(next(res))
# print(next(res))

# for i in res:
#     print(i)
# for i in res:
#     print(i)
# for i in res:
#     print(i)
# print(list(res))
# print(list(res))
 
 
 
# print(sum([1,2,3,4,5]))
 
with open('a.txt',mode='rt',encoding='utf-8') as f:
    # data = f.read()
    # print(len(data))  # 24
    #
    # res = 0
    # for line in f:
    #     res += len(line)
 
    # lines_size = (len(line) for line in f)
    # res = sum(lines_size)
 
    res = sum(len(line) for line in f)
    print(res) 

 

三、面向过程编程

 

面向过程编程是一种编写思想or编程范式

 

 

 

    面向过程核心是“过程”二字,过程就是流程,流程指的就是先干什么、再干什么、后干什么

 

    基于面向过程编写程序就好比在设计一条条流水线

 

 

 

    优点:复杂的问题流程化、进而简单化

 

    缺点:牵一发而动全身,扩展性差

 

posted on 2021-03-30 16:20  lzl_121  阅读(43)  评论(0编辑  收藏  举报