人工智能系列-Python系列(七)递归、迭代、迭代器、迭代器协议、生成器

转载请注明预见才能遇见的博客:http://my.youkuaiyun.com/

原文地址:https://blog.youkuaiyun.com/pcaxb/article/details/91993211

人工智能系列-Python系列(七)递归、迭代、迭代器、迭代器协议、生成器

目录

人工智能系列-Python系列(七)递归、迭代、迭代器、迭代器协议、生成器

1.迭代和递归

2.迭代器协议

3.迭代器

4.生成器

1).生成器分类及在python中的表现形式:(Python有两种不同的方式提供生成器)

2).为何使用生成器之生成器的优点

3).生成器小结:

5.三元表达式

6.列表解析(全部放入内存)

7.生成器表达式(next的时候才放入内存)

8.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。

9.案例 计算人口百分比

10.生产者消费者模型


1.迭代和递归

# 递归:在函数内部,可以调用其他函数。如果在调用一个函数的过程中直接或间接调用自身本身

# 迭代:迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值
# 迭代器:迭代器即迭代的工具,可以通过__next__取值,就是迭代器
# while True: print('===>')  #只是单纯地重复,因而不是迭代

# l = [1, 2, 3]
# count = 0
# while count < len(l):  # 迭代
#     print(l[count])
#     count += 1

2.迭代器协议

# 1).迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,
# 要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)
# 2).可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)
# 3).协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。

3.迭代器

# names = [1, 2, 4, 5]
# names_iter = names.__iter__()  # #遵循迭代器协议,生成可迭代对象
# print(names_iter.__next__())  # 1
# print(names_iter.__next__())  # 2

# iter函数
# iter(names)

# 不使用for循环,遍历一个集合
# names = [1, 2, 4, 5]
# names1 = set(names)
# count = 0
# names1_iter = names1.__iter__()
# while count < len(names1):
#     print(names1_iter.__next__())
#     count += 1
#
# names2_iter = names.__iter__()

# 异常处理
# while True:
#     try:
#         print(names2_iter.__next__())
#     except StopIteration:
#         print("遍历完毕")
#         break
#
# namesm = [1, 2, 4, 5]
# names_iter = namesm.__iter__()
# print(next(names_iter))  # 1
# print(names_iter.__next__())  # 2

4.生成器

# 生成器可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法),
# 所以生成器就是可迭代对象

1).生成器分类及在python中的表现形式:(Python有两种不同的方式提供生成器)

# 1).生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。
# yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
# 2).生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

2).为何使用生成器之生成器的优点

# Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。
# 这也是生成器的主要好处。

3).生成器小结:

# 1).是可迭代对象
# 2).实现了延迟计算, 省内存啊
# 3).生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处,
# 其余的可迭代对象没有这个好处
# def scq():
#     yield 1
#     yield 2
#     yield 3
# g = scq()
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# 碰到yield就会返回,

5.三元表达式

# name = 'cc'
# res = "是的" if name == "cc" else "不是"
# print(res)
# true的结果 if 判断表达式 else false的结果

6.列表解析(全部放入内存)

# persons = ['人%s' % item for item in range(10)]  # 列表解析
# print(persons)  # ['人0', '人1', '人2', '人3', '人4', '人5', '人6', '人7', '人8', '人9']

7.生成器表达式(next的时候才放入内存)

# 1).把列表解析的[]换成()得到的就是生成器表达式
# 2).列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存
# persons1 = ('人%s' % item for item in range(10))  # 生成器表达式
# print(persons1)

8.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。

# 例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,
# 我们可以直接这样计算一系列值的和:
# res = [i for i in range(10)]
# print(res)
# res1 = sum(i ** i for i in range(10))
# print(res1)

# 测试一个一个亿的列表
# res2 = [i for i in range(100000000)]
# print(res2)

# 测试一个一个亿的生成器
# res3 = (i for i in range(100000000))
# print(res3)


# print(sum(i for i in range(100000000)))#几乎不占内存

9.案例 计算人口百分比

# def rkpc():
#     with open('file3', 'r', encoding='utf-8') as f:
#         for i in f:
#             yield i
#
# rkpc_iter = rkpc()
#
# print(rkpc_iter)
#
# for item in rkpc_iter:
#     item_dict = eval(item)
#     print(item_dict['population'], type(item_dict))

# # eval 字符串转字典
# res = sum(eval(item)['population'] for item in rkpc_iter)
# print(res)  # 15

10.生产者消费者模型

# send 给生成器传值
# yield 3相当于return 控制的是函数的返回值
# x=yield的另外一个特性,接受send传过来的值,赋值给x
# import time
# def producer():
#     for item in range(5):
#         time.sleep(1)
#         yidld_res = yield item
# res = producer()

# def consumer():
#     for item in res:
#         print(item)

# send 给生成器传值
# yield 3相当于return 控制的是函数的返回值
# x=yield的另外一个特性,接受send传过来的值,赋值给x

# def consumer():
#     con_res = res.send(None)
#     time.sleep(1)
#     print(con_res)
#     if con_res != 4:
#         consumer()
# consumer()
参考资料:
https://www.cnblogs.com/linhaifeng/articles/7580428.html
https://www.cnblogs.com/luchuangao/p/6685626.html

人工智能系列-Python系列(七)递归、迭代、迭代器、迭代器协议、生成器

博客地址:https://mp.youkuaiyun.com/postedit/91993211

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值