python迭代器,生成器,推导式
可迭代对象
字面意思分析:可以重复的迭代的实实在在的东西。
list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定)
专业角度: 内部含有'__iter__'
方法的对象,就是可迭代对象。
内置函数:dir() print(dir(str))
判断一个对象是否是可迭代对象: print('iter' in dir(str))
优点:
- 直观。
- 操作方法较多。
缺点:
- 占内存。
- 不能迭代取值(索引,字典的key)。
迭代器
字面意思:可以重复迭代的工具。
专业角度: 内部含有'__iter__'
并且含有"__next__"
方法的对象,就是迭代器
可迭代对象转化成迭代器:
l1 = [1, 2, 3, 4, 5]
# 内置函数iter()
obj = iter(l1)
# 迭代器可以迭代取值。利用next()进行取值
l1 = [1, 2, 3, 4, 5]
# 内置函数iter()
obj = iter(l1)
# print(obj)
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
迭代器优点:
- 非常节省内存。
- 惰性机制。
迭代器缺点:
- 不直观。
- 操作不灵活。
- 效率相对低。
特性:
l1 = [22, 33, 44, 55, 66, 77]
obj = iter(l1)
for i in range(3):
print(next(obj))
for i in range(2):
print(next(obj))
利用while循环,模拟for循环内部循环可迭代对象的机制。
先要将可迭代对象转化成迭代器。
利用next对迭代器进行取值。
利用异常处理try一下防止报错。
可迭代对象与迭代器的对比
可迭代对象:可迭代对象是一个操作比较灵活,直观,效率相对高,但是比较占用内存的数据集。
迭代器:迭代器是一个非常节省内存,满足惰性机制,但是效率相对低,操作不灵活的数据集。
2.生成器初识
- 生成器本质就是迭代器。python社区生成器与迭代器是一种。生成器与迭代器的唯一区别:生成器是我们自己用python代码构建的。
1.生成器产生方式
- 生成器函数。
- 生成器表达式。
- python给你提供的一些内置函数,返回一个生成器。
生成器函数。
之前接触的函数:
# def func():
# print(111)
# return 2
# ret = func()
# print(ret)
# 执行此函数,遇到return结束函数。
# 将数字2返回给ret。生成器函数: 只要函数中出现了yield那么他就不是函数,它是生成器函数
def func():
# print(111)
# print(111)
# print(111)
# print(111)
# print(111)
# print(111)
yield 2,4,5
yield 3
yield 4
yield 5
ret = func() # 生成器对象
# print(ret) # <generator object func at 0x0000000001E10F68>
'''
# 类比
l1 = [2,] [2,3,4,5]
obj = iter(l1) '''
# 只要函数中出现了yield那么他就不是函数,它是生成器函数。
# 一个next对应一个yield.
# print(next(ret))
# print(next(ret))
# print(next(ret))
# print(next(ret))
# print(next(ret))
# print(next(ret))
2.yiled与return的区别
# return 结束函数,给函数的执行者返回值(多个值通过元组的形式返回)。
# yield 不结束函数,对应着给next返回值(多个值通过元组的形式返回)。
send(了解)
pass
生成器的举例
# def eat_baozi():
# list1 = []
# for i in range(1,2001):
# list1.append(f'{i}号包子')
# return list1
#
# print(eat_baozi()) def eat_baozi_gen():
for i in range(1,2001):
# print(11)
yield f'{i}号包子' '''
# ret1 = eat_baozi_gen()
# ret2 = eat_baozi_gen()
# # print(ret1)
# # print(ret2)
# print(next(ret1))
# print(next(ret1))
# print(next(ret1))
#
# print(next(ret2))
# print(next(ret2))
# print(next(ret2))
# print(next(ret))
# print(next(ret))
''' # ret = eat_baozi_gen()
#
# for i in range(200):
# print(next(ret))
#
# for i in range(200):
# print(next(ret))
3.yiled与yiled from。
# yield from
# def func():
# l1 = [1, 2, 3]
# yield l1
# ret = func()
# print(next(ret))
# print(next(ret))
# print(next(ret))
# def func():
# l1 = [1, 2, 3]
# yield from l1
#
# '''
# yield 1
# yield 2
# yield 3
# '''
# ret = func()
# print(next(ret))
# print(next(ret))
# print(next(ret))
# yield : 对应next给next返回值
# yield from 将一个可迭代对象的每一个元素返回给next
# yield from 节省代码,提升效率(代替了for循环)
3.列表推导式
- 列表推导式:一行代码构建一个有规律比较复杂的列表。
- 列表推导式与之前写法对比
# l1 = [1,2,3......100]
# l1 = []
# for i in range(1,101):
# l1.append(i)
# print(l1)
# 列表推导式
l1 = [i for i in range(1, 101)]
# print(l1)
两种构建方式:
1.循环模式: [变量(加工后的变量) for 变量 in iterable]
2.筛选模式: [变量(加工后的变量) for 变量 in iterable if 条件]循环模式:
# 循环模式:
# 将10以内所有整数的平方写入列表。
# print([i**2 for i in range(1, 11)])
# 100以内所有的偶数写入列表.
# print([i for i in range(2, 101, 2)])
# 从python1期到python100期写入列表list
# print([f'python{i}期' for i in range(1, 101)])筛选模式:
# print([i for i in range(1, 101) if i > 49])
# 三十以内可以被三整除的数。
# print([i for i in range(1, 31) if i % 3 == 0])
# 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
# l1 = ['barry', 'fdsaf', 'alex', 'sb', 'ab']
# print([i.upper() for i in l1 if len(i) > 3])
# 找到嵌套列表中名字含有两个‘e’的所有名字(有难度)
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
# l1 = []
# for i in names:
# for j in i:
# if j.count('e') > 1:
# l1.append(j)
# print(l1) print([j for i in names for j in i if j.count('e') > 1])
列表推导式的优缺点:
# 列表推导式的优缺点:
# 优点:
# 1, 简单,快捷,装b。
# 缺点:
# 2. 可读性不高,不好排错。
# 慎用,不要入迷。
4.生成器表达式:
与列表推导式几乎一模一样。
循环模式,筛选模式。
# obj = (i for i in range(1, 11))
# # print(obj)
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
# # print(next(obj))
- 如何触发生成器(迭代器)取值?
# # 1. next(obj)
# # 2. for 循环
# # for i in obj:
# # print(i)
# # 3. 数据转化
# print(list(obj))
# 生成器表达式:生成器 节省内存。
字典推导式,集合推导式
# 字典推导式,集合推导式: 两种模式: 循环模式,筛选模式
l1 = ['小潘', '怼怼哥','西门大官人', '小泽ml亚']
# {0: '小潘', 1: '怼怼哥', 2: '西门大官人'}
# dic = {}
# for index in range(len(l1)):
# dic[index] = l1[index]
# print(dic)
# print({i:l1[i] for i in range(len(l1))})
# 1~100
# print({i for i in range(1, 101)})
python迭代器,生成器,推导式的更多相关文章
- Python之路-迭代器 生成器 推导式
迭代器 可迭代对象 遵守可迭代协议的就是可迭代对象,例如:字符串,list dic tuple set都是可迭代对象 或者说,能被for循环的都是可迭代对象 或者说,具有对象.__iter__方法的都 ...
- 12.Python略有小成(生成器,推导式,内置函数,闭包)
Python(生成器,推导式,内置函数,闭包) 一.生成器初始 生成器的本质就是迭代器,python社区中认为生成器与迭代器是一种 生成器与迭代器的唯一区别,生成器是我们自己用python代码构建成的 ...
- python ---12 生成器 推导式
一.生成器 函数中有yield 的就是生成器函数(替代了return) 本质就是迭代器 一个一个的创建对象 节省内存 1.创建生成器 最后以yield结束 1. 通过⽣成器函数 2. ...
- Python迭代器生成器,私有变量及列表字典集合推导式(二)
1 python自省机制 这个是python一大特性,自省就是面向对象的语言所写的程序在运行时,能知道对象的类型,换句话说就是在运行时能获取对象的类型,比如通过 type(),dir(),getatt ...
- Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数
Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: 就是迭代器 生成器产生的方式: 1.生成器函数
- Python——生成器&推导式
生成器 生成器的本质就是迭代器,那么还为什么有生成器呢,两者唯一的不同就是迭代器都是Python给你提供能够的已经写好的工具或者通过数据转化得来的.而生成器是需要我们自己用Python代码构建的工具. ...
- 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ
一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...
- Python函数04/生成器/推导式/内置函数
Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...
- python 列表推导式,生成器推导式,集合推导式,字典推导式简介
1.列表推导式multiples = [i for i in range(30) if i % 2 is 0]names = [[],[]]multiples = [name for lst in n ...
随机推荐
- JavaSE 学习笔记之异 常(十)
异 常: 异常:就是不正常.程序在运行时出现的不正常情况.其实就是程序中出现的问题.这个问题按照面向对象思想进行描述,并封装成了对象.因为问题的产生有产生的原因.有问题的名称.有问题的描述等多个属性信 ...
- (45). Spring Boot MyBatis连接Mysql数据库【从零开始学Spring Boot】
大家在开发的时候,会喜欢jdbcTemplate操作数据库,有喜欢JPA操作数据库的,有喜欢MyBatis操作数据库的,对于这些我个人觉得哪个使用顺手就使用哪个就好了,并没有一定要使用哪个,个人在实际 ...
- 清北学堂模拟赛d3t5 c
分析:其实就是一道数学题.如果以左下角的点为原点建立平面直角坐标系,那么点(b,a)是最容易卡住棺材的.我们求出棺材左边到点(b,a)的距离最小值,只有w小于等于这个最小值才能被拉过去.那么先求出左面 ...
- 学习webpack过程并上传到github
使用工具:sublimeText+node+git 1,一个包的文件结构,生成初始文件 在node 命令行窗口中创建demo_a文件夹 使用命令 npm init 初始化包,生成package.jso ...
- hibernate即时获取数据库信息
由于读取数据的时候,Hibernate将第一次读取的内容放到了缓存中,若此时有别的应用修改了数据库中的数据,程序再次读取的时候,内容是从缓存中直接获取,无法反映数据库中的最新状况. 因此,可以设置读取 ...
- c语言文件包含
文件包含是指一个C语言源程序中将另一个C语言源程序包含进来,通过include预处理指令实现. 一般形式: #include”被包含文件名” 或#include<被包含文件名> 2. 作 ...
- IntelliJ 启动不同端口的两个spring cloud项目
IntelliJ 启动不同端口的两个spring cloud项目 1,使用maven进行clean package 2,在Terminal界面,输入java -jar xxx.jar --server ...
- 可编辑ztree节点的增删改功能图标控制---已解决
每文一语:休倚时来势,提防运去时 <!DOCTYPE html> <HTML> <HEAD> <TITLE> ZTREE DEMO - beforeEd ...
- Qt graphic item日记
今天在用用graphic view 加入graphic item的时候要引入一个context menu,自然就要对context menu上的action进行slot处理.可是graphic ite ...
- storm 并行度
1个worker进程运行的是1个topology的子集(注:不会出现1个worker为多个topology服务).1个worker进程会启动1个或多个executor线程来运行1个topology的c ...