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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基础第九天——迭代对象 迭代器对象生成器三元表达式列表解析生成器表达式相关的知识,希望对你有一定的参考价值。

鸡汤:

  要时刻不断地给自己灌输一种思想:都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基础第九天——迭代对象 迭代器对象生成器三元表达式列表解析生成器表达式的主要内容,如果未能解决你的问题,请参考以下文章

Python成长之路第五篇:Python基础之迭代器和生成器

python基础08--迭代器,生成器

Python基础-16生成器-迭代器

Python基础-16生成器-迭代器

Python初探第二篇-装饰器和迭代器,生成器

Python菜鸟之路:Python基础-生成器和迭代器