开始本篇之前,我们先来了解几个单词

迭代: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)--迭代,可迭代的和迭代器相关推荐

  1. python 可迭代对象_Python3学习笔记(十四):可迭代对象、迭代器和生成器

    记得在刚开始学Python的时候,看到可迭代对象(iterable).迭代器(iterator)和生成器(generator)这三个名词时,完全懵逼了,根本就不知道是啥意识.现在以自己的理解来详解下这 ...

  2. Python Itertools.chain()用法【将一组迭代对象串联起来,形成一个更大的迭代器】

    它是一个需要一系列可迭代对象并返回一个可迭代对象的函数.它将所有可迭代对象组合在一起,并生成一个可迭代对象作为输出. 场景一:  chain()可以把一组迭代对象串联起来,形成一个更大的迭代器: &g ...

  3. python-哪些是可迭代对象?哪些是迭代器?迭代器和可迭代对象的区别——可迭代对象在遍历时不会发生消耗,但是迭代器会

    一.迭代器和可迭代对象 1.1 哪些是可迭代对象?如何检测? 只要能用for x in X进行迭代的对象,都叫可迭代对象:检测一个对象是否是可迭代对象,可以用isinstace(seq, Iterab ...

  4. 列表中的字符串成员 转化为 整型成员 。如:将[‘2‘, ‘1‘] 转化为:[2, 1]、map()返回的是一个可迭代对象内存地址、join(可迭代对象),要注意:可迭代对象中的成员必须是字符串类型

    注意: 1.map()返回的是一个可迭代对象的内存地址,如果要看它具体的值,有两种方式: 法1:在map()前面,加list( ).tuple( ).set( ),将它强制转化为列表.元组.集合类型. ...

  5. python3迭代器和可迭代对象_一文读懂 Python3 可迭代对象、迭代器、生成器区别...

    笔者学习Python已有一段时间,一直以为对于可迭代对象(iterable).迭代器(iterator).生成器(generator)有一定理解了,直到看到<流畅的python>中的讲解才 ...

  6. python3可迭代对象、迭代器、生成器、协程yield入门

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-01-24 16:13:07 # @Author : cdl (1217096 ...

  7. python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器及生成表达式...

    复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象---->  延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...

  8. 迭代、可迭代对象、迭代器、生成器、for循环、iter()函数与next()函数的概念及关系

    1.关系图 2.迭代 使用for循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表取值的过程. 3.可迭代对象 使用for循环遍历取值的对象叫做可迭代对象 元组,列表,字典,字符串,集合,ran ...

  9. Python要想学得好,【容器/可迭代对象/迭代器/生成器】少不了,稳扎稳打学Python!

    在刚开始学Python的时候,是不是经常会听到大佬们在讲容器.可迭代对象.迭代器.生成器.列表/集合/字典推导式等等众多概念,其实这不是大佬们没事就搁那扯专业术语来装B,而是这些东西都得要明白的,光知 ...

最新文章

  1. PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头1
  2. 快速排序pascal程序
  3. 如何使用单例EJB和MBean构建和清除参考数据缓存
  4. SPH(光滑粒子流体动力学)流体模拟实现二:SPH算法(2)-粒子受力分析
  5. bzoj 3714: [PA2014]Kuglarz
  6. nodejs window下安装与配置淘宝镜像
  7. 五子棋的禁手c++语言实现,C++实现简单五子棋游戏
  8. vmware vcenter 4.1升级到5.0
  9. django1.2中将ManyToManyField呈现为checkbox
  10. 使用联想Y460一键拯救系统
  11. matlab怎么创建数组对象,数组 – matlab初始化对象数组
  12. python爬取腾讯新闻统计数据——新型冠状病毒引发肺炎实况(selenium实现)
  13. CLion的Toolchains are not configured和no CMAKE profiles问题
  14. Visual C++ 2008入门经典 Ivor Horton(书_在线阅读)
  15. 收藏,光纤光缆60条必备知识!
  16. 数学建模共享单车问题
  17. 【汇正财经】企业资本的意义
  18. HDU 4125 Moles 段树+KMP
  19. Unity 镜面反射
  20. 三极管的缺点MOS管来补,把MOS管当作开关驱动大功率器件

热门文章

  1. windows搭建SFTP服务器
  2. qdir 自动创建多级目录_Qt 判断文件或文件夹是否存在及创建文件夹
  3. python中回归拟合图_seaborn库:线性回归拟合图
  4. Java任务完成后结算_Java执行程序:如何在任务完成时无阻碍地得到通知?
  5. 华为鸿蒙还会不会推出,华为如果把鸿蒙独立出来,让小米、魅族和蓝绿厂参股进来,会不会超越安卓?...
  6. 绕过基于签名的XSS筛选器:修改HTML
  7. 二、Zabbix-zabbix server部署-LNMP
  8. APICloud学习笔记之窗体跳转
  9. Ubuntu 12/14 个性化配置
  10. Exception in thread http-bio-8081-exec-3 java.lang.OutOfMemoryError: PermGen space