python的可迭代对象
今日所得
迭代器
可迭代对象
迭代器对象
for循环内部原理
生成器
生成器表达式
内会函数
面对过程编程
迭代器
迭代就是指更新换代的过程,要重复进行,而且每次的迭代都必须基于上一次的结果。
我们使用for循环的时候就是把元素从容器里一个个取出来,这种过程其实就是迭代。
迭代器:迭代取值的工具。
迭代器的作用是提供给你一种不依赖索引取值的方式。
需要迭代取值的数据类型有:字符串、列表、元组、字典、集合
迭代是重复更换的过程,每一次的更换(迭代)都是基于上一次的结果,也就是说每一次迭代都要和上次的结果有关系
迭代器:是用于迭代的工具
可以迭代取值的数据类型
字符串
列表
元组
字典
集合
可迭代对象
可以使用内置__iter__(双下划线加iter加双下划线)方法的都叫做可迭代对象
基本数据类型中的可迭代对象有
str list tuple dict set
文件对象本身就是迭代器对象(所以文件对象执行内置的__iter__之后还是本身,没有任何变化)
res = 'hello'
l = [1,2,3,4,5,6]
t = (1,2,3,4,5,6)
s = {1,2,3,4,5,6}
d = {'name':'chen','age':18,'pwd':123}
f = with open ('test.txt','w',encoding='utf-8') res.__iter__()
l.__iter__()
t.__iter__()
s.__iter__()
d.__iter__()
f.__iter__()
文件对象(文件对象本身就是迭代器对象,执行__iter__之后还是本身,没有变化)
可迭代对象执行内置的__iter__方法后得到的就是该对象的迭代器
迭代器对象
迭代器对象有内置__iter__的方法
有内置__next__的方法
迭代器一定是可迭代对象
可迭代对象不一定是迭代器对象
迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身
迭代器取值的特点
只能往后依次取,不能从后往前取
l=[1,2,3,4]
iter_l=l.__iter__() # 用__iter__将可迭代对象转换成一个迭代器对象
print(iter_l.__next__()) # 迭代器取值,调用__next__
print(iter_l.__next__()) # 调用一次取一个
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__()) # 如果取完了直接报错StopIteration
异常处理
while True:
try:
print(iter_d.__next__())
except StopIteration:
# print('老母猪生不动了')
break
d = {'name':'jason','password':'','hobby':'泡m'}
iter_d = d.__iter__() # 将字典变成迭代器对象 while True:
try:
print(iter_d.__next__()) # 循环取值
except StopIteration: # 异常处理,当出现的异常和你在except后面写的一样时则继续执行下面的代码
print('取完了'
break
for循环内部原理
for循环里的in关键字,跟的是一个可迭代对象,将in后面的对象调用__iter__转换成迭代器
for循环内部的本质
1.让关键字in后面的对象使用__iter__转换成迭代器对象
2.调用__next__迭代取值
3.内部有异常捕获StopIteration,当迭代器里的元素为空时报错,自动结束循环
迭代取值的优点:1.不依赖于索引取值
2.内存中永远只占一份空间,不会导致内存溢出
迭代取值的缺点:1.不能获取指定的元素
2.迭代器里的元素取完后再取,会报StopIteration的错误
d = {'name':'jason','password':'','hobby':'泡m'}
for i in d:
print(i)
# for 循环后面的in跟的是一个可迭代对象
生成器
用户自定义的迭代器,本质就是迭代器
当函数内有yield关键字的时候,调用该函数不会执行函数体代码,而是将函数变成生成器。
生成器函数:常规函数定义,但是,使用yield语句,而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,是挂起函数的状态,也就是下次可以接着这里执行。
def func():
print('第一次')
yield 1
print('第二次')
yield 2
# 函数内如果有yield关键字,那么在加括号执行函数的时候并不会触发函数体代码的运行,函数会暂停在yield这个地方,使用__next__就能得到yield后面的返回值
# yield既可以返回一个值也可以返回多个值,并且多个值是按照元组的形式返回的
def func():
print('first')
yield 666 # yield后面跟的值就是调用迭代器__next__方法你能得到的值
print('second')
yield 777,888,999 # yield既可以返回一个值也可以返回多个值 并且多个值也是按照元组的形式返回
yield
# 函数内如果有yield关键字,那么加括号执行函数的时候并不会触发函数体代码的运行 g=func() # 生成器初始化:将函数变成迭代器
print(g.__next__()) # 输出为666
print(g.__next__()) # 输出为(777, 888, 999)
print(g.__next__()) # 输出为None
#yield
# 1.帮你提供了一种自定义生成器方式
# 2.会帮你将函数的运行状态暂停住
# 3.可以返回值 #与return之间异同点
# 相同点:都可以返回值,并且都可以返回多个
# 不同点:
# yield可以返回多次值,而return只能返回一次函数立即结束
# yield还可以接受外部传入的值
#yield支持外界为其传参
def dog(name):
print('%s 准备开吃'%name)
while True:
food = yield
print('%s 吃了 %s'%(name,food))
g = dog('egon')
g.__next__() # 必须先将代码运行至yield 才能够为其传值
g.send('狗不理包子') # 给yield左边的变量传参 触发了__next__方法
g.send('饺子')
>>>:egon 准备开吃
egon 吃了 狗不理包子
egon 吃了 饺子
生成器表达式
res = (i for i in range(1,10) if i != 4) # 生成器表达式
print(res)
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
##把列表解析的[]换成()得到的就是生成器表达式
不调用__next__方法 生成器内部代码一句都不会运行
生成器表达式通常用在获取较大容器类型数据的时候
#自定义range功能
def my_range(start, end, step=1):
while start < end:
yield start
start += step
常用内置函数方法
abs(-1) # 求绝对值 l = [0,1,2]
all(l) # 只要有一个为False就返回False
any(l) # 只要有一个为True就返回True def func():
name = '局部空间'
print(locals()) # 当前语句在哪个位置,就返回哪个位置所存储的所有空间名
print(globals()) # 无论在哪,查看的都是全局名称空间 l = [1,2,3]
print(dir(1)) # 获取该对象所有可以使用的方法 # divmod 分页器
divmod(103,10) # 返回两个数(10,3)前一个是商,后一个是余数,用处是网页分页,有余数就加上一页 # enumerate 枚举
l = ['name','age']
for i,j in enumerate(l,1)
print(i,j)
# 在元素前加一个索引,并且可以指定索引从哪个数字开始 # eval() exec()
"""
这两个都可以识别字符串中的Python语法,eval不支持逻辑代码,只支持一些简单的python代码,exec可以识别逻辑代码
""" print(isinstance(n,list))
# 判断对象是否属于某个数据类型 print(pow(2,3)) # 括号后面的数是前面的数的几次方 print(round(3.4)) # 浮点数的四舍五入
#locals
print(locals()) # 当前语句在哪个位置 就会返回哪个位置所存储的所有的名字 #globals
print(globals()) # 无论在哪 查看的都是全局名称空间 #dir 获取当前对象名称空间里面的名字
l = [1,2,3]
print(dir(l)) # eval #exec
#eval() 函数用来执行一个字符串表达式,并返回表达式的值。
#exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码. # format 三种玩法
# {}占位
# {index} 索引
# {name} 指名道姓 #locals
print(locals()) # 当前语句在哪个位置 就会返回哪个位置所存储的所有的名字 #globals
print(globals()) # 无论在哪 查看的都是全局名称空间
面对过程编程:就类似于设计一条流水线
好处:将复杂的问题流程化,从而简单化
坏处:可扩展性较差,一旦需要修改,整体都会受到影响
python的可迭代对象的更多相关文章
- what's the python之可迭代对象、迭代器与生成器(附面试题)
可迭代对象 字符串.列表.元祖.集合.字典都是可迭代的,数字是不可迭代的.(可以用for循环遍历取出内部元素的就是可迭代的) 如何查看一个变量是否为可迭代: from collections impo ...
- Python的可迭代对象、迭代器和生成器
可迭代对象(Iterable) 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable. 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.t ...
- 深入理解python中可迭代对象,迭代器,生成器
英文原文出处:Iterables vs. Iterators vs. Generators 在python学习中,通常会陷入对以下几个相关概念之间的确切差异的困惑中: a container(容器) ...
- Python之可迭代对象、迭代器、生成器
在使用Python的过程中,很容易混淆如下几个关联的概念: 1.容器(container) 2.可迭代对象(Iterable) 3.迭代器(Iterator) 4.生成器(generator) 5.生 ...
- PythonI/O进阶学习笔记_8.python的可迭代对象和迭代器、迭代设计模式
content: 1.什么是迭代协议 2. 什么是迭代器(Iterator)和可迭代对象(Iterable) 3. 使用迭代器和可迭代对象 4. 创建迭代器和可迭代对象 5. 迭代器设计模式 一 ...
- Python itertools 操作迭代对象
Python 的内建模块itertools提供了很多操作迭代对象的方法 参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/101778314 ...
- Python——迭代器&可迭代对象
可迭代对象 什么是对象: Python中,一切皆对象.一个变量,一个列表,一个字符串,文件句柄,函数等等都可称为一个对象.一个对象就是一个实例,就是实实在在的东西. 什么是迭代 迭代就是一个重复的过程 ...
- python 3 可迭代对象与迭代器
1,可迭代对象 内部含有__iter__方法的对象是可迭代对象 遵循可迭代协议 dir() 检查对象含有什么方法 dir()会返回一个列表,这个列表中含有该对象的以字符串的形式所有方法名.这样我们就可 ...
- python中可迭代对象、迭代器、生成器
可迭代对象 关注公众号"轻松学编程"了解更多. 1.列表生成式 list = [result for x in range(m, n)] g1 = (i for i in rang ...
随机推荐
- 【前缀思想】二叉树中所有距离为 K 的结点
863. 二叉树中所有距离为 K 的结点 class Solution { Map<TreeNode,String>map=new HashMap<>(); String pa ...
- SQL注入——报错注入
0x00 背景 SQL注入长期位于OWASP TOP10 榜首,对Web 安全有着很大的影响,黑客们往往在注入过程中根据错误回显进行判断,但是现在非常多的Web程序没有正常的错误回显,这样就需要我们利 ...
- Python—使用列表构造队列数据结构
队列的概念 只允许在一端插入数据操作,在另一端进行删除数据操作的特殊线性表:进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列):队列具有先进先出(FIFO)的特性. # _*_ ...
- 小程序Java多次请求Session不变
微信小程序每次请求的sessionid是变化的,导致对应后台的session不一致,无法获取之前保存在session中的openid和sessionKey. 为了解决这个问题,需要强制同意每次小程序前 ...
- dfs--迷宫
题目背景 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫中移动有上下左右四种方式,每次只能移 ...
- 题解 P1829 【[国家集训队]Crash的数字表格 / JZPTAB】
题目 我的第一篇莫比乌斯反演题解 兴奋兴奋兴奋 贡献一个本人自己想的思路,你从未看到过的船新思路 [分析] 显然,题目要求求的是 \(\displaystyle Ans=\sum_{i=1}^n\su ...
- 201403-1 相反数 Java
法1:排序后,首尾两个指针 法2:每个数的绝对值如果出现过,flag置为1,如果再次出现,就计数+1 本文采用法1 import java.util.Arrays; import java.util. ...
- Acunetix WVS安全测试软件使用教程(入门级)
1.下载 Acunetix WVS 10.5软件,下载地址为:https://pan.baidu.com/s/1Koku0Lhya5PgphMVL7w19g 密码:v438 2.压缩包中有破解说明,按 ...
- ORM表之间高级设计
ORM表之间高级设计 一.表的继承 # db_test1 # 一.基表 # Model类的内部配置Meta类要设置abstract=True, # 这样的Model类就是用来作为基表 # 多表:Boo ...
- 计量经济与时间序列_关于Box-Jenkins的ARMA模型的经济学意义(重要思路)
1 很多人已经了解到AR(1)这种最简单的时间序列模型,ARMA模型包括AR模型和MA模型两个部分,这里要详细介绍Box-Jenkins模型的观念(有些资料中把ARMA模型叫做Box-Jenkins模 ...