码迷,mamicode.com
首页 > 编程语言 > 详细

Python基础第九天——迭代对象、 迭代器对象、生成器、三元表达式列表解析、生成器表达式

时间:2017-11-02 19:07:36      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:oba   span   obj   ons   top   勤奋   col   常用   break   

鸡汤:

  要时刻不断地给自己灌输一种思想:都TMD是个人,凭什么他会而我就不会?王候将相宁有种乎?我承认人有天赋的差别,但是勤奋能弥补缺陷!所以,根据以上观点得出以下结论,只要出生时不是个傻子,那么就没有蠢的人,只有懒的猪!只要勤奋上进,小白也会变大神。加油

                                                        ——奔跑吧小白

一、迭代对象、迭代器对象

1、迭代

定义:带有__iter__方法的就是可迭代对象

python常用的数据类型中,除了数字外,都是迭代对象。

例:用isinstance判断python常用数据类型是否为迭代对象,经验证,python常用数据类型中除数字类型外,都是可迭代对象。

from collections import  Iterable

int1 = 1
str1 = ‘xiaobai‘
list1 = [1,2,3,4,5]
tuple1 = (1,2,3,4,5)
dic1 = {‘a‘:1,‘b‘:2,‘c‘:3}
set1 = {1,2,3,4}
f = open(‘a.txt‘,‘w‘)

# 用isinstance判断是否为迭代对象
print(isinstance(int1,Iterable))   # 数字类型结果:False
print(isinstance(str1,Iterable))   # 字符串结果:True
print(isinstance(list1,Iterable))  # 列表结果:True
print(isinstance(tuple1,Iterable)) # 元组结果:True
print(isinstance(dic1,Iterable))   # 字典结果:True
print(isinstance(set1,Iterable))   # 集合结果:True
print(isinstance(f,Iterable))      # 文件结果:True

输出结果:

技术分享
False
True
True
True
True
True
True
View Code

 

2、迭代器

定义:将迭代对象的__iter__后加上括号执行,得到的结果就是迭代器。

取值:迭代器对象通过__next__方法,加上括号拿到迭代器里的值。(迭代器也有一个__iter__方法。)

特点:

  优点:不依赖于索引,惰性计算节省内存

  缺点:取值不方便,一次性取值,只能住后取,不能回退。

例1:迭代器用__next__()的方式取值

l = [1,2,3,4,5]
x = l.__iter__()  # 迭代器
print(x.__next__())
print(x.__next__())
print(x.__next__())
print(x.__next__())
print(x.__next__())
print(x.__next__())  # 已知列表l有5个值,
                    # 当取到第6个值的时候会异常 StopIteration

输出结果:

技术分享
1
Traceback (most recent call last):
2
  File "C:/Users/William/PycharmProjects/Python_Item2/study/day9/迭代器.py", line 19, in <module>
3
4
    print(x.__next__())  # 已知列表l有5个值,
5
StopIteration
View Code

 

例2:用isinstance判断python常用数据类型是否为迭代器对象

from collections import  Iterator

int1 = 1
str1 = ‘xiaobai‘
list1 = [1,2,3,4,5]
tuple1 = (1,2,3,4,5)
dic1 = {‘a‘:1,‘b‘:2,‘c‘:3}
set1 = {1,2,3,4}
f = open(‘a.txt‘,‘w‘)

# 用isinstance判断是否为迭代器对象
print(isinstance(int1,Iterator))   # 数字类型结果:False
print(isinstance(str1,Iterator))   # 字符串结果:True
print(isinstance(list1,Iterator))  # 列表结果:True
print(isinstance(tuple1,Iterator)) # 元组结果:True
print(isinstance(dic1,Iterator))   # 字典结果:True
print(isinstance(set1,Iterator))   # 集合结果:True
print(isinstance(f,Iterator))      # 文件结果:True

输出结果:

技术分享
False
False
False
False
False
False
True
View Code

 

例3:迭代器执行__iter__方法后得到的还是自己。

# 文件是迭代器
with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as f:
    print(f)                        # 得到迭代器
    obj = f.__iter__()             # 执行__iter__后仍然是迭代器
    print(obj is f)               # True

输出结果:

技术分享
<_io.TextIOWrapper name=a.txt mode=r encoding=utf-8>
True
View Code

 

 

3、for循环原理

步骤:

    1、先执行迭代对象的__iter__()方法,得到迭代器

  2、for循环会自动调用迭代器内的__next__()方法,将得到的返回值再赋予变量

  3、直到捕捉到StopIteration这个异常后,再结束循环。

 

for循环只能判断要遍历的对象是否为迭代对象,而不能只判断是否为迭代器。

例:

l = [1,2,3,4]
for i in l:  #  1、先执行迭代对象的__iter__()方法,得到迭代器
             # 2、for循环会自动调用迭代器下面的__next__()方法,得到返回值后再赋予变量“i”
             # 3、直到报出StopIteration异常,for循环再捕捉到这个异常,最后结束循环。
    print(i)

 

4、用while循环实现不依赖于索引的方式取值。

(1)try...except

这里要用到一个新的知识点:

try...except

用于捕捉程序出现的异常。

语法:

  try

    逻辑

  except 要捕捉的异常:

    条件

(2)用while循环实现不依赖于索引的方式取值

d = {‘a‘:1,‘b‘:2,‘c‘:3}

obj = d.__iter__()      # 1、先将迭代对象转换成迭代器

while True:             # 2、再用__next__()方法取值
    try:                # 3、用try...except捕捉StopIteration的异常。
        i = obj.__next__()
        print(i)
    except StopIteration:
        break

 

 

 

 

二、生成器

 

Python基础第九天——迭代对象、 迭代器对象、生成器、三元表达式列表解析、生成器表达式

标签:oba   span   obj   ons   top   勤奋   col   常用   break   

原文地址:http://www.cnblogs.com/xiaoxiaobai/p/7773649.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!