1.迭代器回顾

可迭代对象:Iterable
  可以直接作用于for循环的对象统称为可迭代对象:Iterable。因为可迭代对象里面存在可迭代协议,所以才会被迭代
  可迭代对象包括:
        列表(list)
        元组(tuple)
        字典(dict)
        集合(set)
        字符串(str)
        生成器(generator)
        也可以说除了int和bool类型的数据以外,都是可迭代对象。
  为什么他们能被迭代? 因为他们还有__iter__方法
  可以使用
isinstance()
判断一个对象是否是
Iterable
对象。
      
迭代器:Iterator
  它表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可
以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,
  只有在需要返回下一个数据时它才会计算。Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
  迭代器包括:
         生成器(generator)都是
Iterator
对象
        但
list

dict

str
虽然是
Iterable
,却不是
Iterator
。 如何把可迭代对象变成迭代器?
  python2
    把
list

dict

str

Iterable
变成
Iterator
可以使用
iter()
函数
    isinstance(iter('abc'), Iterator)
  python3
    把
list

dict

str

Iterable
变成
Iterator
可以使用__
iter__()
函数
    from collections import Iterable
    str ="abc"
    print(isinstance(str.__iter__(),Iterable))

2.生成器 generator

装饰器的本质是闭包
生成器的本质是迭代器 python中的generator保存的是算法,真正需要计算出值的时候才会去往下计算出值。它是一种惰性计算(lazy evaluation)。
在python中有三种方式来获取生成器(python中提供的生成器)
  1.通过生成器函数
  2.通过各种推到式来实现生成器
   3.通过数据的转换也可以获取生成器(目前还不会) 1.通过生成器函数
def func():
print(1)
yield 5 # 我的函数走到这了
print(2)
yield 9 # 我的函数走到这了 g = func() # 生成一个生成器
print(g.__next__())

1.在函数中使用yield关键字,函数就变成了一个generator。(看到有yiled的存在就是生成器函数)
其中的yiled可以和普通函数中的return进行比较:
  普通函数碰到return就结束函数
  生成器函数碰到yield不结束就挂起,进行分段执行。在执行到yiled的时候,函数会记住本次执行到的位置,当下一次调用时,就从该位置开始。
yiled特点:
  1.挂起函数
  2.返回值给调用者
  3.接受值,可以接受调用者传参 2.如果我们循环和传参的话,需要使用的send()函数。
  send函数的作用和__next__函数一样,都是让生成器执行到下一个yiled
  区别:
    send可以给上一个yield的位置传递值,不能给最后一个yield发送值,在第一次执行生成器的时候最好不要使用send(),如果非要使用的话,需要给个传递个空值。send(None)
  send()函数的本质是next+参数 3.生成调用方法
  1.__next__方法
  2.生成器调用方法
  3.send方法(本质是next+参数)
4.生成器优点
  在了解迭代器的时候我们知道,迭代器是通过python语言本身实现的迭代功能,来节省内存地址的
  起始生成器也是一样,只是为了在某些情况下,我们也需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫生成器。 5.在python3中提供一种可以直接把可迭代对象中的每一个数据作为生成器的结果进行返回
  def func():
    lst = ['卫龙','老冰棍','北冰洋','牛羊配']
    yield from lst 相当于for item in lst:
  g = func()
  for i in g:
    print(i) --->

2.通过推导式(把一个列表生成式的[]改成(),就创建了一个generator)

g = (i for i in range(10))
print(g) ---> <generator object <genexpr> at 0x0000000002143D00>

3.生成器总结

1.生成器的本质就是一个迭代器
2.生成器一定是一个迭代器,迭代器不一定是一个生成器
3.生成器是可以让程序员自己定义的一个迭代器
4.生成器的好处,节省内存空间 5.生成器的特性 一次性的,惰性机制,从上向下
6.send相当于 next+传值,第一次触生成器的时候,如果使用send(None),值必须是None,一般我建议你们使用__next__
7.python2 iter() next()
python3 iter() next() __next__() __iter__()
8.yield from 将可迭代对象元素逐个返回

 3.推导式

推导式的用法
  【结果 语法】 容器 就是将【】替换成想要推导的数据类型的符号 (第一个位置是结果,剩下的都是语句) 推导式:
1.列表推导式
  print([item for item in range(10)])
2.集合推导式
  print({item for item in range(10)})
3.字典推导式
  print({item:item+1 for item in range(10)})
4.生成器推导式:(最简单的办法是将列表推导式的[]换成())
print(i for i in range(10))--->打印出来的是生成器的内存地址,__next__才会调用

#根据推导式写出小于100的奇数
print([item for item in range(100) if item %2 !=0 ]) 注意:
  推导式不宜写太长,可读性差
  实现小的需求时,可以使用推导式,节省代码

python基础 (迭代器回顾,生成器,推导式)的更多相关文章

  1. 『Python基础-12』各种推导式(列表推导式、字典推导式、集合推导式)

    # 『Python基础-12』各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的 ...

  2. python基础—迭代器、生成器

    python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...

  3. 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ

    一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...

  4. Python基础—迭代器、生成器(Day13)

    一.迭代器 1.可迭代对象:遵循可迭代协议,内部含有__iter__方法的对象就叫做可迭代对象.(str.list.tulpe.dict.set) 查询数据类型的方法 s = 'laonanhai' ...

  5. python基础-三元表达式/列表推导式/生成器表达式

    1.三元表达式:如果成立返回if前的内容,如果不成立返回else的内容 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' ...

  6. python基础----迭代器、生成器、协程函数及应用(面向过程实例)

    一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...

  7. python基础--迭代器、生成器

    (1)迭代器 可迭代对象和迭代器的解释如下: ''' 什么是对象?Python中一切皆对象,之前我们讲过的一个变量,一个列表,一个字符串,文件句柄,函数名等等都可称作一个对象,其实一个对象就是一个实例 ...

  8. python之路---12 生成器 推导式

    三十.函数进阶 1.生成器    函数中有yield 的就是生成器函数(替代了return) 本质就是迭代器   一个一个的创建对象     节省内存 ①创建生成器       最后以yield结束 ...

  9. python基础学习1-列表推导式和字典推导式

    #!/usr/bin/env python # -*- coding:utf-8 -*- #列表推导式 取得100内可以被2整除且不能被3整除的数字 a=[i for i in range(100) ...

随机推荐

  1. Linux在VirtualBox的网络设置

    一.Linux系统版本:Centos7.4. 二.访问外网:在设置-网络-网卡1处选择 “网络地址置换(NAT)”即可.默认情况下,自动获取IP(DHCP),但要在配置中把开机启动选上. 文件位置: ...

  2. 用JavaScript制作页面特效

    1.Window对象 名称 history:有关客户访问过的URL的信息 location:有关当前URL的信息 screen:有关客户端的屏幕和显示性能的信息 常用方法 prompt():弹出输入框 ...

  3. thinkphp3.2.3集成腾讯云短信文档流程

    昨天晚上折腾了一个小时没解决 今天折腾了20分钟就搞定了 看了thinkphp3.2.3的命名空间解释方法  把文件放到这里 /ThinkPHP/Library/Org/ 把新建了一个Sms文件夹 把 ...

  4. 用tar命令把目标压缩包解压到指定位置

    linux下tar命令解压到指定的目录 : #tar zxvf /bbs.tar.zip -C /zzz/bbs    //把根目录下的bbs.tar.zip解压到/zzz/bbs下,前提要保证存在/ ...

  5. 原生js开发vue的双向数据绑定

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 沙箱机制(Sandboxie)

    一.沙箱是什么? 沙箱是一个虚拟系统程序,沙箱提供的环境相对于每一个运行的程序都是独立的,而且不会对现有的系统产生影响. 二.沙箱的应用 (1)搭建测试环境.沙箱的应用只能访问自己的应用访问目录,而不 ...

  7. dwSun带你选Python的编辑器/IDE

    dwSun带你选Python的编辑器/IDE Python 是一门简单易学,同时又十分强大的编程语言.特别是随着人工智能的热潮,Python作为AI开发的首选语言,已经是技术人员的必备技能. 在学习和 ...

  8. loadrunner飞机订票系统从登陆订票退票登出的脚本实现代码调试通过

    在LR自带的飞机订票系统中,完整模拟一个用户从登陆->订票->退票->登出这样一个业务流程,分解每个事务为一个Action: 进入首页->登陆->进入订票页面->选 ...

  9. Post提交带参网址

    前端 $(function(){ var obj=$('#form1'); obj.validate({ submitHandler: function (form){ var data={}; da ...

  10. HTTP请求方式

    HTTP协议中请求的8中方法 OPTIONS获取服务器支持的HTTP请求方法: HEAD跟get很像,但是不返回响应体信息,用于检查对象是否存在,并获取包含在响应消息头中的信息. GET向特定的资源发 ...