今日所得

  迭代器

  可迭代对象

  迭代器对象

  for循环内部原理

  生成器

  生成器表达式

  内会函数

  面对过程编程

迭代器

迭代就是指更新换代的过程,要重复进行,而且每次的迭代都必须基于上一次的结果。

我们使用for循环的时候就是把元素从容器里一个个取出来,这种过程其实就是迭代。

迭代器:迭代取值的工具。

迭代器的作用是提供给你一种不依赖索引取值的方式。

需要迭代取值的数据类型有:字符串、列表、元组、字典、集合

迭代是重复更换的过程,每一次的更换(迭代)都是基于上一次的结果,也就是说每一次迭代都要和上次的结果有关系

  迭代器:是用于迭代的工具

  可以迭代取值的数据类型

  字符串

  列表

  元组

  字典

  集合

  

可迭代对象

  可以使用内置__iter__(双下划线加iter加双下划线)方法的都叫做可迭代对象

  基本数据类型中的可迭代对象有

  str  list  tuple  dict  set

  文件对象本身就是迭代器对象(所以文件对象执行内置的__iter__之后还是本身,没有任何变化)

  1. res = 'hello'
  2. l = [1,2,3,4,5,6]
  3. t = (1,2,3,4,5,6)
  4. s = {1,2,3,4,5,6}
  5. d = {'name':'chen','age':18,'pwd':123}
  6. f = with open ('test.txt','w',encoding='utf-8')
  7.  
  8. res.__iter__()
  9. l.__iter__()
  10. t.__iter__()
  11. s.__iter__()
  12. d.__iter__()
  13. f.__iter__()

  

  文件对象(文件对象本身就是迭代器对象,执行__iter__之后还是本身,没有变化)

  可迭代对象执行内置的__iter__方法后得到的就是该对象的迭代器

迭代器对象

  迭代器对象有内置__iter__的方法

       有内置__next__的方法

  迭代器一定是可迭代对象

  可迭代对象不一定是迭代器对象

  迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身

  迭代器取值的特点

  只能往后依次取,不能从后往前取

  1. l=[1,2,3,4]
  2. iter_l=l.__iter__() # 用__iter__将可迭代对象转换成一个迭代器对象
  3. print(iter_l.__next__()) # 迭代器取值,调用__next__
  4. print(iter_l.__next__()) # 调用一次取一个
  5. print(iter_l.__next__())
  6. print(iter_l.__next__())
  7. print(iter_l.__next__()) # 如果取完了直接报错StopIteration

异常处理

  1. while True:
  2. try:
  3. print(iter_d.__next__())
  4. except StopIteration:
  5. # print('老母猪生不动了')
  6. break
  1. d = {'name':'jason','password':'','hobby':'泡m'}
  2. iter_d = d.__iter__() # 将字典变成迭代器对象
  3.  
  4. while True:
  5. try:
  6. print(iter_d.__next__()) # 循环取值
  7. except StopIteration: # 异常处理,当出现的异常和你在except后面写的一样时则继续执行下面的代码
  8. print('取完了'
  9. break

for循环内部原理

  for循环里的in关键字,跟的是一个可迭代对象,将in后面的对象调用__iter__转换成迭代器

for循环内部的本质

  1.让关键字in后面的对象使用__iter__转换成迭代器对象

  2.调用__next__迭代取值

  3.内部有异常捕获StopIteration,当迭代器里的元素为空时报错,自动结束循环

迭代取值的优点:1.不依赖于索引取值

        2.内存中永远只占一份空间,不会导致内存溢出

迭代取值的缺点:1.不能获取指定的元素

        2.迭代器里的元素取完后再取,会报StopIteration的错误

  1. d = {'name':'jason','password':'','hobby':'泡m'}
  2. for i in d:
  3. print(i)
  4. # for 循环后面的in跟的是一个可迭代对象 

生成器

  用户自定义的迭代器,本质就是迭代器

  当函数内有yield关键字的时候,调用该函数不会执行函数体代码,而是将函数变成生成器。

  生成器函数:常规函数定义,但是,使用yield语句,而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,是挂起函数的状态,也就是下次可以接着这里执行。

  1. def func():
  2. print('第一次')
  3. yield 1
  4. print('第二次')
  5. yield 2
  6. # 函数内如果有yield关键字,那么在加括号执行函数的时候并不会触发函数体代码的运行,函数会暂停在yield这个地方,使用__next__就能得到yield后面的返回值
  7. # yield既可以返回一个值也可以返回多个值,并且多个值是按照元组的形式返回的
  1. def func():
  2. print('first')
  3. yield 666 # yield后面跟的值就是调用迭代器__next__方法你能得到的值
  4. print('second')
  5. yield 777888,999 # yield既可以返回一个值也可以返回多个值 并且多个值也是按照元组的形式返回
  6. yield
  7. # 函数内如果有yield关键字,那么加括号执行函数的时候并不会触发函数体代码的运行
  8.  
  9. g=func() # 生成器初始化:将函数变成迭代器
  10. print(g.__next__()) # 输出为666
  11. print(g.__next__()) # 输出为(777, 888, 999)
  12. print(g.__next__()) # 输出为None
  1. #yield
  2. # 1.帮你提供了一种自定义生成器方式
  3. # 2.会帮你将函数的运行状态暂停住
  4. # 3.可以返回值
  5.  
  6. #与return之间异同点
  7. # 相同点:都可以返回值,并且都可以返回多个
  8. # 不同点:
  9. # yield可以返回多次值,而return只能返回一次函数立即结束
  10. # yield还可以接受外部传入的值
  1. #yield支持外界为其传参
  2. def dog(name):
  3. print('%s 准备开吃'%name)
  4. while True:
  5. food = yield
  6. print('%s 吃了 %s'%(name,food))
  7. g = dog('egon')
  8. g.__next__() # 必须先将代码运行至yield 才能够为其传值
  9. g.send('狗不理包子') # 给yield左边的变量传参 触发了__next__方法
  10. g.send('饺子')
  11. >>>:egon 准备开吃
  12. egon 吃了 狗不理包子
  13. egon 吃了 饺子

生成器表达式

  1. res = (i for i in range(1,10) if i != 4) # 生成器表达式
  2. print(res)
  3. print(res.__next__())
  4. print(res.__next__())
  5. print(res.__next__())
  6. print(res.__next__())
  7. ##把列表解析的[]换成()得到的就是生成器表达式

不调用__next__方法 生成器内部代码一句都不会运行

生成器表达式通常用在获取较大容器类型数据的时候

  1. #自定义range功能
  2. def my_range(start, end, step=1):
  3. while start < end:
  4. yield start
  5. start += step

        

常用内置函数方法

  

  1. abs(-1) # 求绝对值
  2.  
  3. l = [0,1,2]
  4. all(l) # 只要有一个为False就返回False
  5. any(l) # 只要有一个为True就返回True
  6.  
  7. def func():
  8. name = '局部空间'
  9. print(locals()) # 当前语句在哪个位置,就返回哪个位置所存储的所有空间名
  10. print(globals()) # 无论在哪,查看的都是全局名称空间
  11.  
  12. l = [1,2,3]
  13. print(dir(1)) # 获取该对象所有可以使用的方法
  14.  
  15. # divmod 分页器
  16. divmod(103,10) # 返回两个数(10,3)前一个是商,后一个是余数,用处是网页分页,有余数就加上一页
  17.  
  18. # enumerate 枚举
  19. l = ['name','age']
  20. for i,j in enumerate(l,1)
  21. print(i,j)
  22. # 在元素前加一个索引,并且可以指定索引从哪个数字开始
  23.  
  24. # eval() exec()
  25. """
  26. 这两个都可以识别字符串中的Python语法,eval不支持逻辑代码,只支持一些简单的python代码,exec可以识别逻辑代码
  27. """
  28.  
  29. print(isinstance(n,list))
  30. # 判断对象是否属于某个数据类型
  31.  
  32. print(pow(2,3)) # 括号后面的数是前面的数的几次方
  33.  
  34. print(round(3.4)) # 浮点数的四舍五入
  1. #locals
  2. print(locals()) # 当前语句在哪个位置 就会返回哪个位置所存储的所有的名字
  3.  
  4. #globals
  5. print(globals()) # 无论在哪 查看的都是全局名称空间
  6.  
  7. #dir 获取当前对象名称空间里面的名字
  8. l = [1,2,3]
  9. print(dir(l))
  10.  
  11. # eval #exec
  12. #eval() 函数用来执行一个字符串表达式,并返回表达式的值。
  13. #exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码.
  14.  
  15. # format 三种玩法
  16. # {}占位
  17. # {index} 索引
  18. # {name} 指名道姓
  19.  
  20. #locals
  21. print(locals()) # 当前语句在哪个位置 就会返回哪个位置所存储的所有的名字
  22.  
  23. #globals
  24. print(globals()) # 无论在哪 查看的都是全局名称空间

  

面对过程编程:就类似于设计一条流水线

  好处:将复杂的问题流程化,从而简单化

  坏处:可扩展性较差,一旦需要修改,整体都会受到影响

python的可迭代对象的更多相关文章

  1. what's the python之可迭代对象、迭代器与生成器(附面试题)

    可迭代对象 字符串.列表.元祖.集合.字典都是可迭代的,数字是不可迭代的.(可以用for循环遍历取出内部元素的就是可迭代的) 如何查看一个变量是否为可迭代: from collections impo ...

  2. Python的可迭代对象、迭代器和生成器

    可迭代对象(Iterable) 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable. 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.t ...

  3. 深入理解python中可迭代对象,迭代器,生成器

    英文原文出处:Iterables vs. Iterators vs. Generators 在python学习中,通常会陷入对以下几个相关概念之间的确切差异的困惑中: a container(容器) ...

  4. Python之可迭代对象、迭代器、生成器

    在使用Python的过程中,很容易混淆如下几个关联的概念: 1.容器(container) 2.可迭代对象(Iterable) 3.迭代器(Iterator) 4.生成器(generator) 5.生 ...

  5. PythonI/O进阶学习笔记_8.python的可迭代对象和迭代器、迭代设计模式

     content: 1.什么是迭代协议 2. 什么是迭代器(Iterator)和可迭代对象(Iterable) 3. 使用迭代器和可迭代对象 4. 创建迭代器和可迭代对象 5. 迭代器设计模式   一 ...

  6. Python itertools 操作迭代对象

    Python 的内建模块itertools提供了很多操作迭代对象的方法 参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/101778314 ...

  7. Python——迭代器&可迭代对象

    可迭代对象 什么是对象: Python中,一切皆对象.一个变量,一个列表,一个字符串,文件句柄,函数等等都可称为一个对象.一个对象就是一个实例,就是实实在在的东西. 什么是迭代 迭代就是一个重复的过程 ...

  8. python 3 可迭代对象与迭代器

    1,可迭代对象 内部含有__iter__方法的对象是可迭代对象 遵循可迭代协议 dir() 检查对象含有什么方法 dir()会返回一个列表,这个列表中含有该对象的以字符串的形式所有方法名.这样我们就可 ...

  9. python中可迭代对象、迭代器、生成器

    可迭代对象 关注公众号"轻松学编程"了解更多. 1.列表生成式 list = [result for x in range(m, n)] g1 = (i for i in rang ...

随机推荐

  1. Java学习十四

    学习内容: 1.Junit 2.maven安装配置环境 一.Junit实例演示步骤 1.引入jar包 junit包需要引入hamcrest-core包,否则会报错 2.测试如下代码 package c ...

  2. Vue中Js动画 与Velocity.js 多组件多元素 列表过渡

    Vue提供我们很多js动画钩子 写在tansition标签内部 入场动画 @before-enter="" 处理函数收到一个参数(e l) el为这个元素 @enter=" ...

  3. Feign整合测试

    1.测试使用 (1)服务调用方引入依赖 <dependency> <groupId>org.springframework.cloud</groupId> < ...

  4. main函数的参数(int argc,char *argv[])

    一般的main函数都是不带参数的,因此main 后的括号都是空括号.实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数.C语言规定main函数的参数只能有两个, 习惯上这两个参 ...

  5. 17.3.12---socket

    1----如果要用python做一个服务器和客户端的通信程序,那么就一定得选择标准库中的scoket套接字模块,它支持多种网络协议:TCP/IP    ,ICMP/IP,            UDP ...

  6. c# 基础switct---case用于处理多条件的定值的判断

    题目:李四的年终工作评定,如果定为A级,则工资涨500元,如果定为B级,则工资涨200元,如果定为C级,工资不变,如果定为D级工资降200元,如果定为E级工资降500元. 设李四原工资为5000,请用 ...

  7. 寒假day04

    今天编写了毕设系统中的专家画像模块,实现了人员标签的建立与划分,同时刷了牛客网的面试相关题目. 1.如果系统的umask设置为244,创建一个新文件后,它的权限:(C) --w-r--r-- -r-x ...

  8. centos 部署WGCLOUD

    服务端: 一.安装jdk 1.查看安装配置 jdk: 命令:java -version   2.查看系统是否自带 jdk rpm -qa |grep java rpm -qa |grep jdk rp ...

  9. ZJNU 1333 - 第二题 blocks--中高级

    因为放一个就需要判断一次,每一次跑一遍全图bfs显然是不现实的 又因为点只有三种,黑白无 所以可以用并查集优化 添加一个棋子就判断周围四个的组别情况 注意出现的情况与答案关系之间的判别 /* Writ ...

  10. ZJNU 1069 - 表达式的转换——中级

    栈运用的模板题,对于符号进行出入栈操作,每次与栈顶的符号进行优先级判断,得出第一行后缀表达式. 在其后的化简计算中,每次用一个特殊符号(代码中使用了'?')代替原来的计算结果引用,并开一个数组表示每次 ...