python之迭代器、生成器及列表推导式
一、迭代器
迭代器就是迭代的工具,迭代是一个重复的过程,每次重复都是一次迭代并且每次迭代的结果都是下次迭代的初始值。
lst=[1,2,3,4,5]
count=0
while count<len(lst):
print(lst[count])
count +=1
既然有for循环为什么还要用迭代器呢? 当然对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包
含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引
的迭代方式,这就是迭代器。
可迭代对象:
可迭代对象指的是内置有__iter__方法的对象,我们要如何查看内置是否有__iter__()方法呢?
lst=[1,2,3]
print(dir(lst))
在需要查看的对象前使用dir方法 就是来查看该对象内置的方法,如果其中含有__iter__,又含有__next__()方法那么该对象就是可迭代对象
注:迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象。
lst=[1,2,3]
g = lst.__iter__()
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__()) #当列表中不存在元素提供迭代则会抛出异常StopIteration,或者说结束标志
我们怎么可以避免报错呢?
lst=[1,2,3,4,5,6,7,]
g=lst.__iter__()
while True:
try:
print(g.__next__())
except StopIteration: #此处表示当遇到该提示时终止迭代
break
迭代器的优缺点:
(1)优点: 提供一个统一的,不依赖索引的迭代方式, 节省内存。
(2)缺点: 惰性计算,只能往后走,不能往前退
二、生成器
生成器本质上就是迭代器
def func():
print(111)
return 222
print(func()) def func():
print(111)
yield 222
print(func())
怎样判断生成器,只要函数内部包含有yield关键字,那么函数名()得到的结果就是生成器,并且不会执行函数内部代码
def func():
print("")
yield 222
gener = func() #这里是获取生成器,不会执行函数
print(gener.__next__()) #这个时候函数才会执行,yield和return一样都是用来返回数据
生成器的特点和迭代器一样,取值方式和迭代器一样
惰性机制,只能往后退,不能往前,优点是节约内存。取值方式也是用.__next__() 执行函数. 执行到下一个yield.
生成器一般由生成器函数或者生成器表达式来构建
def func():
print(1)
a=yield "a"
print(a)
print(2)
b=yield "b"
print(b)
yield "over"
g =func() #获取生成器
print(g.__next__()) #没有上一个yield 所以不能使用send() 开头必须是__next__()
print(g.send("中华")) # send()与next用法相同,还可以将值传给上一个yield
print(g.__next__()) #send()也不能用来当末尾 yield代表结束 seed没值可传
三、列表推导式
列表推导式是用一行代码来构建你想要的列表。
lst=["","","","","",]
for i in range(len(lst)):
print(i) # 传统方法获取列表的索引值 lst=[i for i in range(0,5)]
print(lst) #将想要的结果放入到列表中 dic={"name":"张三","sex":"男"}
dic = {k:v for k,v in dic.items()}
print(dic) # 字典的推导式与列表大同小异 gen = (i for i in range(1,4))
print(gen) # 这个就是生成器表达式,元组不存在推导式。
生成器表达式与列表推导式的区别
列表推导式比较消耗内存,一次性加载
生成器表达式几乎不耗用内存,只有在用到的时候才会获取分配内存
python之迭代器、生成器及列表推导式的更多相关文章
- Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数
Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: 就是迭代器 生成器产生的方式: 1.生成器函数
- python基础(14):生成器、列表推导式
1. 生成器 什么是⽣成器?⽣成器实质就是迭代器. 在python中有三种⽅式来获取⽣成器: 1. 通过⽣成器函数 2. 通过各种推导式来实现⽣成器 3. 通过数据的转换也可以获取⽣成器 ⾸先,我们先 ...
- Python-02 生成器表达式,列表推导式
列表推导式和生成器表达式 列表推导式,生成器表达式1,列表推导式比较直观,占内存2,生成器表达式不容易看出内容,省内存. [ 变量(加工后的数据) for 变量i in 可迭代的数据类型 ] 列表 ...
- Python的高级特性2:列表推导式,生成器与迭代器
一.列表推导式 1.列表推导式是颇具python风格的一种写法.这种写法除了高效,也更简短. In [23]: {i:el for i,el in enumerate(["one" ...
- 【python】 迭代器、生成器、列表推导式
一.可迭代对象.迭代器 1.可以被for循环的数据类型(可迭代对象): 字符串(str).列表(list).字典(dict).元祖(tuple).range() 2.迭代器 2.1 将可迭代对象==& ...
- Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数
本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...
- python之三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数
一 三元表达式.列表推导式.生成器表达式 一 三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(r ...
- python之生成器和列表推导式
一.生成器函数 1.生成器 就是自己用python代码写的迭代器,生成器的本质就是迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现). 2.构建生成器的两种方式 1,生成 ...
- Python_迭代器、生成器、列表推导式,生成器表达式
1.迭代器 (1)可迭代对象 s1 = ' for i in s1: print(i) 可迭代对象 示例结果: D:\Python36\python.exe "E:/Python/课堂视频/ ...
随机推荐
- [ kvm ] 学习笔记 5:QEMU-KVM 命令详解
1. QEMU.KVM .QEMU-KVM QEMU 提供了一系列的硬件模拟设备(cpu.网卡.磁盘等),客户机指令都需要QEMU翻译,因此性能较差.KVM 是Linux 内核提供的虚拟化模块,负责C ...
- kafka如果有多个patition,消费消息的时候消息是没有顺序的
创建一个2个分区,3个副本的topic,名字叫first kafka-topics.sh --create --zookeeper datanode1:2181 --partitions 2 --r ...
- JS正则验证数字格式2
之前的博文:JS验证正数字,正则的一种正数规则1,中isNaN可以判断内容是否为数字,但是这种判断出来的数字,有的不是数字的标准格式.那篇博文中尝试了下用正则验证,但是忘了一种情况,小数点后无数字,小 ...
- Node.js Sequelize如何实现数据库的读写分离
一.前言 在构建高并发的Web应用时,除了应用层要采取负载均衡方案外,数据库也要支持高可用和高并发性.使用较多的数据库优化方案是:通过主从复制(Master-Slave)的方式来同步数据,再通过读写分 ...
- axios ajax框架 请求配置
请求参数 { // `url` is the server URL that will be used for the request url: '/user', // `method` is the ...
- web端调起Windows系统应用程序(exe执行文件),全面兼容所有浏览器
1. 首先,你要有一个exe可执行文件2. 创建注册表创建注册表有两种方式(以“MyApp.exe”为例): 方式一:可视化编辑Win+R 打开运行,输入 regedit 并回车,进入注册表编辑器新建 ...
- CF1237D Balanced Playlist
思路:假设从第i首歌开始听,结束位置为j,那么从第i+1首歌开始听,结束位置一定不早于j.可以用反证法证明.想到这一点,就不难解决了. 实现: #include <bits/stdc++.h&g ...
- 【GStreamer开发】GStreamer基础教程15——继承Clutter
目标 Clutter是一个开源的库,用来创建快速.可移植和动态的GUI.GStreamer可以通过cluttersink这个element把clutter集成进来,允许视频像纹理一样使用.本教程会展示 ...
- 小程序开发框架----WXSS
规定了屏幕宽度为750个RPX,从而可以通过屏幕宽度来进行自适应
- php面相对象基本概念,基本形式,传值
面向对象基本概念 面向对象三大特性:封装 继承 多态 类与对象 类:是用于描述“某一些具有共同特征”的物体的概念,是某一类物体的总称. 通常,一个类所具有的共同特征包括2大方面的信息: 外观,形状 ...