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))

效果:

178902873_1_20191226055530441

其实这种方式,像极了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!")

178902873_2_20191226055530550

二、可迭代的(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类型的数字是否是可迭代的,我们也可以乘此机会验证下,我们学过的集合是不是都属于可迭代的对象,下面,我们看下执行结果:

178902873_3_20191226055530581

显然,不是所有类型的对象都是可迭代的。

下面插播两条知识点:

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,字符串等都是可以的,只要满足可迭代,就可以这样写

执行结果:

178902873_4_20191226055530613

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)我们来看下执行结果:

178902873_5_20191226055530722

如果,我们写代码的时候不写z会是什么情况?

178902873_6_20191226055530753

上面的报错,大概意思是在说,我总过有三个女儿,要么都娶走,要么别来烦我(解压出来的值与实际取走的值不匹配)

由此可见,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会不会溢出呢?它会一直访问停不下来吗?

针对上面的问题,我们看下执行的结果:

178902873_7_20191226055530800

为避免这种尴尬,我们让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行为(其实也不怨它,只能说明它埋头苦干,太敬业了)了,修改后执行结果如下:

178902873_8_20191226055530863

本篇结束!

愚公移山,短期看是愚,长期看,就是造福子子孙孙,一人苦修得万人甜;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值