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<list.length;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行为(其实也不怨它,只能说明它埋头苦干,太敬业了)了,修改后执行结果如下:



本篇结束!

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

写博客也是一样,先苦后甜,总感觉写出来,太费时间,费精力,每次写都有种还没写完就想提交的冲动,但是都忍住了,半个小时的事情,不想拖到以后忘的一干二净的时候还要重头来过,希望以后的以后,我们这些凡人的脑袋里都能植入一颗记忆芯片,以解除学习的痛苦吧。

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值