day11.迭代器与生成器
一、迭代器
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编程范式
面向过程核心是“过程”二字,过程就是流程,流程指的就是先干什么、再干什么、后干什么
基于面向过程编写程序就好比在设计一条条流水线
优点:复杂的问题流程化、进而简单化
缺点:牵一发而动全身,扩展性差
day11.迭代器与生成器的更多相关文章
- python全栈开发-Day11 迭代器、生成器、面向过程编程
一. 迭代器 一 .迭代的概念 迭代器即迭代的工具,那什么是迭代呢? 迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而 ...
- python27期day11:f-strings格式化、迭代器、生成器、作业题。
1.建议小写f: name = "宝元"age = 18sex = "男"msg = F"姓名:{name},性别:{age},年龄:{sex}&qu ...
- python基础--迭代器、生成器
(1)迭代器 可迭代对象和迭代器的解释如下: ''' 什么是对象?Python中一切皆对象,之前我们讲过的一个变量,一个列表,一个字符串,文件句柄,函数名等等都可称作一个对象,其实一个对象就是一个实例 ...
- Python 从零学起(纯基础) 笔记 之 迭代器、生成器和修饰器
Python的迭代器. 生成器和修饰器 1. 迭代器是访问集合元素的一种方式,从第一个到最后,只许前进不许后退. 优点:不要求事先准备好整个迭代过程中的所有元素,仅仅在迭代到某个元素时才计算该元素,而 ...
- Python之模块,迭代器与生成器
本节涉及内容: 1. 迭代器和生成器 2. 递归 3. 字符串格式化 4. 模块 内置模块 自定义模块 第三方模块 5. 序列化的模块 json pickle (一). 迭代器和生成器: 迭代器: ...
- Python之迭代器和生成器
Python 迭代器和生成器 迭代器 Python中的迭代器为类序列对象(sequence-like objects)提供了一个类序列的接口,迭代器不仅可以对序列对象(string.list.tupl ...
- python学习笔记四 迭代器,生成器,装饰器(基础篇)
迭代器 __iter__方法返回一个迭代器,它是具有__next__方法的对象.在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器 没有值返回,就会引发一个Sto ...
- 【Python】迭代器、生成器、yield单线程异步并发实现详解
转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...
- 15.python的for循环与迭代器、生成器
在前面学习讲完while循环之后,现在终于要将for循环这个坑填上了.之所以拖到现在是因为for循环对前面讲过的序列.字典.集合都是有效的,讲完前面的内容再来讲for循环会更加容易上手. 首先,for ...
随机推荐
- 后端程序员之路 55、go redis
redigo有点像hiredis,只提供了最基本的连接和执行命令接口. 找到个不错的redis库: https://github.com/go-redis/redis func ExampleNewC ...
- 后端程序员之路 36、Apache Kafka
Apache Kafkahttp://kafka.apache.org/ Kafka,很容易就联想到<海边的卡夫卡>,文艺程度和Casablanca有得一拼.Kafka是一个分布式消息系统 ...
- 基于Hi3559AV100的SVP(NNIE)开发整体流程
在之后的hi3559AV100板载开发中,除了走通V4L2->VDEC->VPSS->VO(HDMI)输出,还有需要进行神经网络的开发学习,进行如face detection的开发等 ...
- 大家最常用的编程论坛是哪个呢,欢迎评论!!掘金16 juejin 简书41 jianshu 博客85 csdn137 csdn
软件编程交流论坛 掘金 16 juejin 简书 41 jianshu 博客 85 cnblogs csdn 137 csdn stackoverflow 0 思否 github 大家最常用的 ...
- HDOJ-3065(AC自动机+每个模板串的出现次数)
病毒侵袭持续中 HDOJ-3065 第一个需要注意的是树节点的个数也就是tree的第一维需要的空间是多少:模板串的个数*最长模板串的长度 一开始我的答案总时WA,原因是我的方法一开始不是这样做的,我是 ...
- Ubuntu小配置
Ubuntu 拍摄快照 在虚拟机安装好.配置号后各拍摄一次快照,并存储. 可在虚拟机出错后回滚 Root用户 Ubuntu默认不能以 Root用户身份直接登录 因此,正常操作时在需要调用 root权限 ...
- 冒泡算法及其优化(java)
冒泡算法的规则: 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放待排序序列的起始位置(或末尾位置),直到全部待排序的数据元素排完 动态图: 对应代码 static void swap(i ...
- Mark一个代码量统计工具-Statistic
安装方式 IDEA.Goland系列插件市场搜索Statistic 简单说明 统计纬度比较丰富 基本覆盖常见纬度,如代码行数,文件大小等,各指标取最大最小及平均值. 统计目录为当前项目目录 只有在当前 ...
- Java 在PPT中添加文本水印的简易方法(单一/平铺水印)
[前言] 在PPT幻灯片中,可通过添加形状的方式,来实现类似水印的效果,可添加单一文本水印效果,即在幻灯片中心位置水印以单个文本字样显示,但通过一定方法也可以添加多行(平铺)文本水印效果,即在幻灯片中 ...
- POJ - 1163 The Triangle 【动态规划】
一.题目 The Triangle 二.分析 动态规划入门题. 状态转移方程$$DP[i][j] = A[i][j] + max(DP[i-1][j], DP[i][j])$$ 三.AC代码 1 #i ...