python3迭代器和可迭代对象,Python3学习(8)--迭代,可迭代的和迭代器
开始本篇之前,我们先来了解几个单词
迭代:iteration
可迭代的:Iterable
迭代器:iterator
从单词我们可以看出来差异,可迭代的一看就是状态词,我们不做多说,下面会再讲,而我们发现迭代和迭代器都是一个名词表示,只不过迭代相比较迭代器更加抽象,这就好比,我们遍历一个字典dict,用到for...in...的操作,我们称之为在 迭代,而这种能遍历的行为或者能迭代的行为我们称之为可迭代的,而迭代器是具体到迭代行为的操作者或者说是实行者(感觉被赋予了生命一样),在Python中有个函数专门返回的就是迭代器对象,而这个对象可以通过next的属性对dict同样进行遍历,我们又称这种现象为迭代器,如果你还是比较抽象的话,下面我就开始,直观清晰的展现这三者之间的联系:
一、迭代(iteration)
如果给定一个list或tuple,我们要想访问其中的某个元素,我们可以通过下标来,如果我们想要访问所有的元素,那我们可以用for循环来遍历这个list或者tuple,而这种遍历我们就叫做迭代。
在Python中,迭代通过for..in..来完成,而其他大部分语言比如c和java,都是通过下标完成的。
比如java:
for(int i=0;i
n = list[i];
}
再看Python:
for x in list:
print(x)
可以看出python的for循环抽象程序要高于java 的for循环,因为python的for循环不仅可以用在
list和tuple上,还可以作用在其他可迭代的对象上(比如没有下标的 dict):#!/usr/bin/env python3
# -*- encoding:utf-8 -*-
#迭代字典dict
d={'name':'appleyk','age':26,'gender':'F','job':'coder'}
print(d)#首先输出dict
print("迭代key")
for s in d:
print(s)
print("迭代value")
for value in d.values():
print(value)
print('迭代key和value')
for k,v in d.items():
print('key:%s,value:%s' %(k,v))
效果:
其实这种方式,像极了C#的foreach:string[] str = {"1","2","3","4"};
foreach (string val in str) {
Console.WriteLine(val);//1234
}
事实上,字符串也可以进行迭代,迭代出每个字符:#!/usr/bin/env python3
# -*- encoding:utf-8 -*-
#迭代字典dict
'''
d={'name':'appleyk','age':26,'gender':'F','job':'coder'}
print(d)#首先输出dict
print("迭代key")
for s in d:#迭代key
print(s)
print("迭代value")
for value in d.values():#迭代值value
print(value)
print('迭代key和value')
for k,v in d.items():#迭代key和value
print('key:%s,value:%s' %(k,v))
'''#多行注释用 三个单引号
from __future__ import print_function #如果让print输出的内容不自动换行,我们可以导入这个文件
for ch in 'Hello World':
print(ch,end='') #这样的话,我们就可以原封不动的输出Hello World 了
print("\nDone!")
二、可迭代的(Iterable)
如果一个list、tuple或者一个字符串可以遍历,也就是有迭代的行为,我们称之为是可以迭代的
比如,我们判断一下,字符串"ABC"是否是可迭代的,我们可以这样做:#!/usr/bin/env python3
# -*- encoding:utf-8 -*-
#判断str是否可迭代
from collections import Iterable #如何判断一个对象是否可迭代,通过collections模块的Iterable类型判断
print('判断\'ABC\'是否属于可迭代的对象 :',isinstance('ABC',Iterable))
print('判断123是否属于可迭代的对象 :',isinstance(123,Iterable))
L = {1,2,3,4}
T = ('A','B','C','D')
D = {1:'A',2:'B',3:'C',4:'D'}
S = {"name","age","sex","adress"}
print('判断list是否属于可迭代的对象 :' ,isinstance(L,Iterable))
print('判断tuple是否属于可迭代的对象 :',isinstance(T,Iterable))
print('判断dict是否属于可迭代的对象 :' ,isinstance(D,Iterable))
print('判断set是否属于可迭代的对象 :' ,isinstance(S,Iterable))当然,我们也可以判断其他对象,比如说,一个int类型的数字是否是可迭代的,我们也可以乘此机会验证下,我们学过的集合是不是都属于可迭代的对象,下面,我们看下执行结果:
显然,不是所有类型的对象都是可迭代的。
下面插播两条知识点:
A、Python内置的enumerate函数可以把一个list变成 索引-元素对,这样就可以在for循环中同时迭代索引(下标)和元素(key)本身
看个例子:#!/usr/bin/env python3
# -*- encoding:utf-8 -*-
for index,value in enumerate(['first','second','third']):
print(index,":",value)
print("上面是list,下面是dict")
for index,key in enumerate({'first':1,'second':2,'third':3}):
print(index,":",key)
'''
for index,value in enumerate(('first','second','third')):
print(index,":",value)
'''#当然tuple,字符串等都是可以的,只要满足可迭代,就可以这样写
执行结果:
B、对于迭代的对象是嵌套型的,我们也可以通过for..in..循环的方式取出每一个元素
比如,迭代的对象实际上是一个list,然而这个list的每一个元素竟然又是一个tuple,且每个tuple对象有N个元素,这样的话,我们就不能单单通过 for x in list:的方式来取了,你可以大胆猜测一下,应该可以这样写,for N1,N2,N3...in list:,如果成立,则再次证明了我们的Python实在是简单暴力又一次啊!,不多说,看demo:#!/usr/bin/env python3
# -*- encoding:utf-8 -*-
for x,y,z in [(1,2,3),(4,5,6,),(7,8,9)]:
print(x,y,z)我们来看下执行结果:
如果,我们写代码的时候不写z会是什么情况?
上面的报错,大概意思是在说,我总过有三个女儿,要么都娶走,要么别来烦我(解压出来的值与实际取走的值不匹配)
由此可见,python是很灵活的,播报到此结束,我们继续。
三、迭代器(Iterator)
最开始说了什么是迭代器,一种更具体的手段,通过next来访问元素。
例子A:
我们定义一个list,并通过iter获得list的迭代器对象#!/usr/bin/env python3
# -*- encoding:utf-8 -*-
#摘要:
#任何可迭代的对象 都可以使用for循环打印,包括我们自定义的类型,只要符合迭代条件,就可以用for循环
#另外 注意 iterator 是迭代器的意思,而Iterable 是一个类型
#为什么这么说呢,迭代器 可以通过next来访问元素,因为它不知道对象里面有多少个元素
L = ['appleyk','F',26,'Python3']
it = iter(L) #获得list的迭代器对象
while True:
x=next(it)#然后我们用next对这个对象进行遍历
print(x)
#next会不会溢出呢?它会一直访问停不下来吗?
针对上面的问题,我们看下执行的结果:
为避免这种尴尬,我们让next不到元素的时候,循环终止,这样的话,我们就看不到异常信息的出现了,我们改下demo:#!/usr/bin/env python3
# -*- encoding:utf-8 -*-
#摘要:
#任何可迭代的对象 都可以使用for循环打印,包括我们自定义的类型,只要符合迭代条件,就可以用for循环
#另外 注意 iterator 是迭代器的意思,而Iterable 是一个类型
#为什么这么说呢,迭代器 可以通过next来访问元素,因为它不知道对象里面有多少个元素
L = ['appleyk','F',26,'Python3']
it = iter(L) #获得list的迭代器对象
while True:
try:#try 试图捕获异常
x=next(it)
print(x)
except StopIteration:#当捕获到迭代行为终止的时候,也就是无元素可以在next的时候,我们终止循环
break这样,我们就可以成功的跳过next的bug行为(其实也不怨它,只能说明它埋头苦干,太敬业了)了,修改后执行结果如下:
本篇结束!
愚公移山,短期看是愚,长期看,就是造福子子孙孙,一人苦修得万人甜;
python3迭代器和可迭代对象,Python3学习(8)--迭代,可迭代的和迭代器相关推荐
- python 可迭代对象_Python3学习笔记(十四):可迭代对象、迭代器和生成器
记得在刚开始学Python的时候,看到可迭代对象(iterable).迭代器(iterator)和生成器(generator)这三个名词时,完全懵逼了,根本就不知道是啥意识.现在以自己的理解来详解下这 ...
- Python Itertools.chain()用法【将一组迭代对象串联起来,形成一个更大的迭代器】
它是一个需要一系列可迭代对象并返回一个可迭代对象的函数.它将所有可迭代对象组合在一起,并生成一个可迭代对象作为输出. 场景一: chain()可以把一组迭代对象串联起来,形成一个更大的迭代器: &g ...
- python-哪些是可迭代对象?哪些是迭代器?迭代器和可迭代对象的区别——可迭代对象在遍历时不会发生消耗,但是迭代器会
一.迭代器和可迭代对象 1.1 哪些是可迭代对象?如何检测? 只要能用for x in X进行迭代的对象,都叫可迭代对象:检测一个对象是否是可迭代对象,可以用isinstace(seq, Iterab ...
- 列表中的字符串成员 转化为 整型成员 。如:将[‘2‘, ‘1‘] 转化为:[2, 1]、map()返回的是一个可迭代对象内存地址、join(可迭代对象),要注意:可迭代对象中的成员必须是字符串类型
注意: 1.map()返回的是一个可迭代对象的内存地址,如果要看它具体的值,有两种方式: 法1:在map()前面,加list( ).tuple( ).set( ),将它强制转化为列表.元组.集合类型. ...
- python3迭代器和可迭代对象_一文读懂 Python3 可迭代对象、迭代器、生成器区别...
笔者学习Python已有一段时间,一直以为对于可迭代对象(iterable).迭代器(iterator).生成器(generator)有一定理解了,直到看到<流畅的python>中的讲解才 ...
- python3可迭代对象、迭代器、生成器、协程yield入门
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-01-24 16:13:07 # @Author : cdl (1217096 ...
- python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器及生成表达式...
复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象----> 延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...
- 迭代、可迭代对象、迭代器、生成器、for循环、iter()函数与next()函数的概念及关系
1.关系图 2.迭代 使用for循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表取值的过程. 3.可迭代对象 使用for循环遍历取值的对象叫做可迭代对象 元组,列表,字典,字符串,集合,ran ...
- Python要想学得好,【容器/可迭代对象/迭代器/生成器】少不了,稳扎稳打学Python!
在刚开始学Python的时候,是不是经常会听到大佬们在讲容器.可迭代对象.迭代器.生成器.列表/集合/字典推导式等等众多概念,其实这不是大佬们没事就搁那扯专业术语来装B,而是这些东西都得要明白的,光知 ...
最新文章
- PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头1
- 快速排序pascal程序
- 如何使用单例EJB和MBean构建和清除参考数据缓存
- SPH(光滑粒子流体动力学)流体模拟实现二:SPH算法(2)-粒子受力分析
- bzoj 3714: [PA2014]Kuglarz
- nodejs window下安装与配置淘宝镜像
- 五子棋的禁手c++语言实现,C++实现简单五子棋游戏
- vmware vcenter 4.1升级到5.0
- django1.2中将ManyToManyField呈现为checkbox
- 使用联想Y460一键拯救系统
- matlab怎么创建数组对象,数组 – matlab初始化对象数组
- python爬取腾讯新闻统计数据——新型冠状病毒引发肺炎实况(selenium实现)
- CLion的Toolchains are not configured和no CMAKE profiles问题
- Visual C++ 2008入门经典 Ivor Horton(书_在线阅读)
- 收藏,光纤光缆60条必备知识!
- 数学建模共享单车问题
- 【汇正财经】企业资本的意义
- HDU 4125 Moles 段树+KMP
- Unity 镜面反射
- 三极管的缺点MOS管来补,把MOS管当作开关驱动大功率器件
热门文章
- windows搭建SFTP服务器
- qdir 自动创建多级目录_Qt 判断文件或文件夹是否存在及创建文件夹
- python中回归拟合图_seaborn库:线性回归拟合图
- Java任务完成后结算_Java执行程序:如何在任务完成时无阻碍地得到通知?
- 华为鸿蒙还会不会推出,华为如果把鸿蒙独立出来,让小米、魅族和蓝绿厂参股进来,会不会超越安卓?...
- 绕过基于签名的XSS筛选器:修改HTML
- 二、Zabbix-zabbix server部署-LNMP
- APICloud学习笔记之窗体跳转
- Ubuntu 12/14 个性化配置
- Exception in thread http-bio-8081-exec-3 java.lang.OutOfMemoryError: PermGen space