python三大神器===》生成器
1. 认识生成器
利用迭代器,我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成。但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成下一个数据。为了达到记录当前状态,并配合next()函数进行迭代使用,我们可以采用更简便的语法,即生成器(generator)。生成器是一类特殊的迭代器。
2.如何创建一个生成器:
生成器时一种特殊的迭代器,我们既然知道迭代器的创建方法,那么创建一个生成器也不是一件难事,首先我们先认识第一种生成器的创建的方法:
利用生成器推导式的方法创建一个生成器
# 第一种生成器创建方法
my_list = (x for x in range(10)) print(my_list)
print(next(my_list))
print(next(my_list))
print(next(my_list))
执行结果
0
1
2
怎么样这样方式创建一个生成器是不是特别简单呢?需要注意的是列表推导式是[ ]而生成器推导式是(),这一点不要搞错了。
3.利用生成器编写斐波那序数列
我们已经知道了一种生成器的创建方法,接下来我们将通过创建生成器的第二种方法来创建一个斐波那序数列
首先我们先了解下斐波那序数列,斐波那序数列定义了第一个数为0第二个为1,之后的每个数字都为前两个数字之和,简单来说就是类似与 0,1,1,2,3,5.......的数列
# 生成器的第二种创建方法
def dome(num):
a = 0
b = 1
# 定义下标值
iter_index = 0
while iter_index < num:
item = a
a, b = b, a + b
iter_index+=1
# 返回自定义的值 ,yield xxx相当于一个暂停jian,下次接着从这里的下一行开始执行,和return有很大的区别
send_values = yield item
print(send_values) test = dome(5)
values = next(test)
print(values)
values = next(test)
print(values)
values = next(test)
print(values)
values = next(test)
print(values)
运行结果
0
1
1
2
我们可以看到,这种定义方法与定义一个迭代器差不多,比较明显的区别就是yield 替代了return,那么yeild与return有什么区别呢?
首先return是返回并终止函数的执行,如果return有值则返回return后的值,而yeild则是展厅函数的执行,下次执行函数会接着执行yield只有的代码,如果yeild后有值则返回yield后的值
4.生成器的send方法
yeild函数除了能暂停函数的执行外,还能通过send()方法向其发送一个值,接下来我们验证一下:
def dome(num):
a = 0
b = 1
# 定义下标值
iter_index = 0
while iter_index < num:
item = a
a, b = b, a + b
iter_index+=1
# 返回自定义的值 ,yield xxx相当于一个暂停jian,下次接着从这里的下一行开始执行,和return有很大的区别
send_values = yield item
print(send_values) # 生成器send问题
test = dome(5)
print(test)
values = test.send(None)
print(values)
values = test.send(10)
print(values)
values = test.send(100)
print(values)
运行结果
0
10
1
100
1
需要注意的是,第一个send()传的值必须为none,否则会报错。这是为什么呢?这是因为第一次执行时yield返回了result = ?宁没有被执行,如果直接传过去一个非none的值会因为没有人接收而报错。
python三大神器===》生成器的更多相关文章
- Python 三大神器
Python 三大神器 Python 中有很多优秀的包,本文主要讲一下 pip, virtualenv, fabric 1. pip 用来包管理 文档:https://pip.pypa.io/en/l ...
- Python三大器之生成器
Python三大器之生成器 生成器初识 什么是生成器 生成器本身属于迭代器.继承了迭代器的特性,惰性求值,占用内存空间极小. 为什么要有生成器 我们想使用迭代器本身惰性求值的特点创建出一个可以容纳百万 ...
- python三大神器之生成器
生成器Generator: 本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现) 特点:惰性运算,开发者自定义 在python中有三种方法来获取生成器: 1.通过生成 ...
- Python三大神器:装饰器,迭代器,生成器
一.装饰器 由于一个函数能实现一种功能,现在想要在不改变其代码的情况下,让这个函数进化一下,即能保持原来的功能,还能有新的"技能",怎么办? 现已经存在一个自定义的函数func1, ...
- python三大神器===》装饰器
1.认识装饰器 如果你经常看我的博客,你已经学会了python的前两大‘神器’(迭代器,生成器),那么什么是装饰器呢?就如字面意义装饰器是对某个事物(通常指函数)进行装饰,让其在不修改任何内部代码的情 ...
- python基础(补充):python三大器之生成器
生成器的定义 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后 ...
- python三大神器之一fabric使用
fabric 是一个python包 是一个基于ssh的部署工具包 通常用来对网站 微服务等等的批量部署 例如 我有5台线上服务器 可以通过一台对着5台分发,实现自动部署的目的. 简单介绍下 fabri ...
- python三大神器
Python 中有很多优秀的包,本文主要讲一下 pip, virtualenv, fabric 1. pip 用来包管理 文档:https://pip.pypa.io/en/latest/instal ...
- python三大神器之装饰器
装饰器的形成过程 假如你要写一个计算函数执行时间的函数,代码如下: import time def func1(): print('in func1') def timer(func): def in ...
随机推荐
- python爬虫(四) 内涵段子
import requests import time import json from urllib import request from urllib import parse url = 'h ...
- py related issues
在python中安装包出现Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) pip inst ...
- CSS3-背景(background-image、background-size、background-origin、background-clip)
CSS3中新的背景属性:background-image.background-size.background-origin.background-clip 背景图片:background-image ...
- error C2664: “FILE *fopen(const char *,const char *)”: 无法将参数 1 从“LPCTSTR”转换为“const char *”
遇到这个问题,请打开本项目的Properties(属性)-------> Configuration Properties(配置属性)-------->General(常规)------- ...
- 134、Java中的构造方法和构造块
01.代码如下: package TIANPAN; class Book { public Book() { // 构造方法 System.out.println("[A]Book类的构造方 ...
- 网易云信-新增自定义消息(iOS版)
https://www.jianshu.com/p/2bfb1c4e9f21 前言 公司业务需要,PC端,移动端都用到了第三方 网易云信 IM来实现在线客服咨询.在这当中难免遇到一些需求是网易云信没有 ...
- ubuntu 文件操作
linux的文件目录是一棵目录树,默认起始位置在主文件夹(/home/city),里面有若干子文件(视频.图片.下载.桌面等) 一.文件路径(目录操作) 1.绝对路径:从根目录/写起,完整的.详细的描 ...
- ch6 列表和导航条
为列表添加定制的项目符号 可使用list-style-image属性:缺点是对项目符号图像的位置的控制能力不强. 常用的方法:使用list-style-type来关闭项目符号,将定制的项目符号作为背景 ...
- Maven项目- get请求的乱码问题,使用tamcat7出现乱码的解决方法
get请求的乱码问题: 解决方法: 手动处理编码
- sqlserver数据库查询
帮助类 using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; ...