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

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

例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

例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

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

二、生成器

时间: 2024-08-04 04:49:39

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

190329迭代器-生成器-三元运算-列表解析

一.迭代器 迭代器协议:对象必须提供一个next()方法,执行该方法要么返回迭代中的下一项,要么抛出一个Stoplteration异常终止迭代 可迭代对象:遵循迭代器协议,即可迭代对象,(可以被for循环的就是可迭代对象) l = {1,2,3} iter_l = l.__iter__() #将列表转换为迭代器 print(iter_l.__next__()) print(next(iter_l)) 二.生成器 1.生成器函数 def f(): for i in range(10): yield

萌新向Python数据分析及数据挖掘 第一章 Python基础 第九节 类

第一章 Python基础 第九节 类 面向对象编程时,都会遇到一个概念,类,python也有这个概念,下面我们通过代码来深入了解下. 其实类 和函数都是为了节省代码,有了类的的概念,就可以把相同的代码写在父类,子类继承后就可以直接使用,而且通过选择对应的父类就可以直接使用对应父类的内容. 创建和使用类 1 class Dog(): #认识狗这类东西 2 def __init__(self, name, age): #狗是肯定有名字和年龄的,是个狗就有,要用户填写 3 self.name = na

《Python基础教程 第2版&#183;修订版》 第2章 列表和元组(学习笔记&#183;总)

这章东西有点多,因此,分成了三份来写,总体来说,这章内容较基础,以下是一二三的链接 <Python基础教程 第2版·修订版>第2章 列表和元组(学习笔记·一) <Python基础教程 第2版·修订版>第2章 列表和元组(学习笔记·二) <Python基础教程 第2版·修订版>第2章 列表和原组 (学习笔记·三) 版权声明:本文为博主原创文章,未经博主允许不得转载.

python基础之继承组合应用、对象序列化和反序列化,选课系统综合示例

继承+组合应用示例 1 class Date: #定义时间类,包含姓名.年.月.日,用于返回生日 2 def __init__(self,name,year,mon,day): 3 self.name = name 4 self.year=year 5 self.mon=mon 6 self.day=day 7 def tell_birth(self): 8 print('%s:%s-%s-%s'%(self.name,self.year,self.mon,self.day)) 9 10 11

python基础----递归函数、认识类和对象

一.递归函数                                                                                             定义:在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 1 #例子1 2 # age(5)=age(4)+2 n=5 age(n)=age(n-1)+2 3 # age(4)=age(3)+2 n=4 age(n)=age(n-1)+2 4 # age(3)=age

python 基础 8.5 re 的match对象

#/usr/bin/python #coding=utf-8 #@Time   :2017/11/18 21:49 #@Auther :liuzhenchuan #@File   :match对象.py import re prog = re.compile(r'(?P<tagname>abc)(.*)(?P=tagname)') result1 = prog.match('abclfjlad234sjldabc') print(result1) print(result1.groups())

python基础-第九篇-9.2线程与多线程

单线程 import time beginTime = time.time() for a in range(10): print(a) time.sleep(1) shijian = time.time() - beginTime print(shijian) #10.000571966171265 我们可以看到,上面这段代码就是纯正的单线程,一条道走到黑,讲究先后,所以花了10秒多 多线程 毕竟等待是让人心烦的,有什么方法能不这么耗时间啊,有啊,主角登场,欢迎多线程,那多线程做了一件什么事呢

python基础一 ------可迭代类型的连接

对可迭代迭代进行连接,返回一个可迭代对象 两种方式: 并行连接 zip() 串行连接 itertools.chain 1 from itertools import chain 2 #并行连接 3 print("---------------原始数据-------------------") 4 a = [1,2,3,4,5] 5 b = ('a','b','c','d','e') 6 c = "ABCDE" 7 print(a) 8 print(b) 9 prin

Python基础 - 第九天 - paramiko模块、进程、线程

本篇内容: 1.paramiko模块使用 2.进程.线程简介 3.python调用线程的方法 4.join - 等待线程执行 5.守护线程 6.GIL - 全局解释器锁 7.互斥锁 8.信号量 9.事件 10.队列 一.paramiko模块使用 1.paramiko模块简介 ? paramiko是一个基于SSH用于连接远程服务器并执行相关操作(SSHClient和SFTPClinet,即一个是远程连接,一个是上传下载服务),使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric