python yield关键词案例测试

测试环境

win10

python 3.5

yield功能简介

简单来说,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator

代码演示

例子1: 输出斐波那契數列前 N 个数

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
def fab(max):
  n, a, b = 0, 0, 1
  result = []
  while n < max:
    result.append(b)
    a, b = b, a + b
    n = n + 1
  return result
for n in fab(5):
  print(n)

以上代码虽然可以满足需求,但是存在的问题:该函数在运行中占用的内存会随着参数 max 的增大而增大,如果要控制内存占用,最好不要用 List

改进 使用yield

def fab(max):
  n, a, b = 0, 0, 1
  while n < max:
    yield b   # 使用 yield
    a, b = b, a + b
    n = n + 1
for n in fab(5):
  print(n)

例子2:读二进制方式取文件并生成文件副本

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
def read_file(fpath):
  BLOCK_SIZE = 1024
  with open(fpath, 'rb') as f:
    while True:
      block = f.read(BLOCK_SIZE)
      if block:
        yield block
      else:
        return
with open('D:\Downloads\\channels-2.1.7-copy.tar.gz', 'wb') as f:
  for data in read_file('D:\Downloads\\channels-2.1.7.tar.gz'):
    f.write(data)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 由浅入深讲解python中的yield与generator

    前言 本文将由浅入深详细介绍yield以及generator,包括以下内容:什么generator,生成generator的方法,generator的特点,generator基础及高级应用场景,generator使用中的注意事项.本文不包括enhanced generator即pep342相关内容,这部分内容在之后介绍. generator基础 在python的函数(function)定义中,只要出现了yield表达式(Yield expression),那么事实上定义的是一个generator

  • Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解

    本文实例讲述了Python 协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法.分享给大家供大家参考,具体如下: 实现多任务:进程消耗的资源最大,线程消耗的资源次之,协程消耗的资源最少(单线程). gevent实现协程,gevent是通过阻塞代码(例如网络延迟等)来自动切换要执行的任务,所以在进行IO密集型程序时(例如爬虫),使用gevent可以提高效率(有效利用网络延迟的时间去执行其他任务). GIL(全局解释器锁)是C语言版本的Python

  • 深入浅析Python中的yield关键字

    前言 python中有一个非常有用的语法叫做生成器,所利用到的关键字就是yield.有效利用生成器这个工具可以有效地节约系统资源,避免不必要的内存占用. 一段代码 def fun(): for i in range(20): x=yield i print('good',x) if __name__ == '__main__': a=fun() a.__next__() x=a.send(5) print(x) 这段代码很短,但是诠释了yield关键字的核心用法,即逐个生成.在这里获取了两个生成

  • 彻底理解Python中的yield关键字

    阅读别人的python源码时碰到了这个yield这个关键字,各种搜索终于搞懂了,在此做一下总结: 通常的for...in...循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件.它可以是mylist = [1, 2, 3],也可以是mylist = [x*x for x in range(3)].它的缺陷是所有数据都在内存中,如果有海量数据的话将会非常耗内存. 生成器是可以迭代的,但只可以读取它一次.因为用的时候才生成.比如 mygenerator = (x*x

  • python函数式编程学习之yield表达式形式详解

    前言 yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法.最近又重新学习了下,所以整理了下面这篇文章,供自己和大家学习参考,下面话不多说了,来一起看看详细的介绍吧. 先来看一个例子 def foo(): print("starting...") while True: res = yield print("res:",res) g = foo() next(g) 在上面的例子里,因为foo函数中有yield关键字,所以

  • Python 3中的yield from语法详解

    前言 最近在捣鼓Autobahn,它有给出个例子是基于asyncio 的,想着说放到pypy3上跑跑看竟然就--失败了. pip install asyncio直接报invalid syntax,粗看还以为2to3处理的时 候有问题--这不能怪我,好-多package都是用2写了然后转成3的--结果发 现asyncio本来就只支持3.3+的版本,才又回头看代码,赫然发现一句 yield from:yield我知道,但是yield from是神马? PEP-380 好吧这个标题是我google出来

  • python异步编程 使用yield from过程解析

    前言 yield from 是 Python3.3 后新加的语言结构.yield from的主要功能是打开双向通道,把最外层的调用方法与最内层的子生成器连接起来.这两者就可以进行发送值和返回值了,yeild from结构的本质是简化嵌套的生产器,不理解这个是什么意思的话,下面我将用几个例子来对其使用方法进行讲解. yield from 是 Python3.3 后新加的语言结构.yield from的主要功能是打开双向通道,把最外层的调用方法与最内层的子生成器连接起来.这两者就可以进行发送值和返回

  • Python中xrange与yield的用法实例分析

    本文实例分析了Python中xrange与yield的用法.分享给大家供大家参考,具体如下: range和xrange Python提供了生成和返回整数序列的内置函数range及xrange,虽然这两个函数在功能上是差不多的,但其实现原理还是有差别的.range(n, m)返回的是一个从n到(m-1)的连续的整数列表,而xrange(n, m)返回的却是一个特殊的目的对象,即xrange对象本身. >>> range(1, 5) [1, 2, 3, 4] >>> xra

  • python yield关键词案例测试

    测试环境 win10 python 3.5 yield功能简介 简单来说,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator 代码演示 例子1: 输出斐波那契數列前 N 个数 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'shouke' def fab(max): n, a, b = 0, 0, 1 result =

  • Python yield 关键词,

    1.迭代器 当您创建一个列表时,你可以逐个读取它的项.逐项读取其项称为迭代: mylist是一个可迭代的对象.当你使用列表解析式时,你创建了一个列表,因此也是一个迭代器: 所有你可以用"for... in ...."都是迭代器,包括列表.字符串.文件-等等. 这些迭代器非常方便,因为你可以随心所欲地读取它们,但是你将所有的值都存储在内存中,当你有很多值时,这就非常浪费内存了. 为了解决这样的问题,Python有了生成器的概念. 2.生成器 生成器是迭代器,这种迭代器只能迭代一次.生成器

  • Python yield 关键词,

    要理解yield的作用,你必须理解生成器是什么.在理解生成器之前,必须先理解迭代器. 1.迭代器 当您创建一个列表时,你可以逐个读取它的项.逐项读取其项称为迭代: 640.webp mylist是一个可迭代的对象.当你使用列表解析式时,你创建了一个列表,因此也是一个迭代器: 640.webp 所有你可以用"for... in ...."都是迭代器,包括列表.字符串.文件-等等. 这些迭代器非常方便,因为你可以随心所欲地读取它们,但是你将所有的值都存储在内存中,当你有很多值时,这就非常浪

  • python多线程并发及测试框架案例

    这篇文章主要介绍了python多线程并发及测试框架案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.循环创建多个线程,并通过循环启动执行 import threading from datetime import * from time import sleep # 单线程执行 def test(): print('hello world') t = threading.Thread(target=test) t.start() # 多线

  • 简单的Python解密rsa案例

    目录 ️ 本次反反爬实战案例背景 ️ JS 代码扣取 登录加密逻辑.js ️ 总结 ️ 本次反反爬实战案例背景 本篇博客选择的案例是由 VX 好友提出,他希望有一篇博客能简单的介绍清楚下面这个问题. 快速定位加密参数逻辑,快速扣取 JS,使用 JS 文件在 Python 中复现逻辑. 为此我翻找了一下橡皮擦的历史案例库(还没有写过的站点),发现如下一个目标站点,当乐. 一看就是一个老平台了,看人家域名 d.cn. 通过点击登录按钮,定位到如下数据请求. 可以看到其请求方式是 GET,相关参数都在

  • Python Ajax爬虫案例分享

    目录 1. 抓取街拍图片 2. 分析街拍图片结构 3. 按功能不同编写不同方法组织代码 3.1 获取网页json格式数据 3.2 从json格式数据提取街拍图片 3.3 将街拍图片以其md5码命名并保存图片 3.4 main()调用其他函数 4 抓取20page今日头条街拍图片数据 1. 抓取街拍图片 街拍图片网址 2. 分析街拍图片结构 keyword: 街拍 pd: atlas dvpf: pc aid: 4916 page_num: 1 search_json: {"from_search

  • Python+Pytest实现压力测试详解

    目录 1.程序说明 1.1 设置测试参数 1.2 初始化测试结果 1.3 定义测试函数 1.4 创建线程.执行线程.等待 1.5 计算测试结果 1.6 将测试结果写入文件 2.程序执行 2.1 直接执行 2.2 加个装饰器然后出报告 3.案例缺陷 4 完整源码 在现代Web应用程序中,性能是至关重要的.为了确保应用程序能够在高负载下正常运行,我们需要进行性能测试. 今天,应小伙伴的提问, 田辛老师来写一个Pytest进行压力测试的简单案例. 这个案例的测试网站我们就隐藏了,不过网站的基本情况是:

  • Python中DJANGO简单测试实例

    本文实例讲述了Python中DJANGO简单测试的用法.分享给大家供大家参考.具体如下: 这里以facebook台湾的测试版为例. 仅仅测试用户登录,主要说明测试的使用和django环境的设置. 代码如下: import os import sys import unittest import hashlib TEST_MEMBER_ID = 11 SNS_ID = 100002309745702 TEST_SESSION_KEY = '125737724171219|2.AQCp7ctCYXJ

  • python 通过xml获取测试节点和属性的实例

    写在前面:通过xml获取测试数据,主要是为了使数据参数化.测试脚本和测试数据分离,使得脚本清晰容易维护,方便排查问题. XML:可扩展的标记语言,是一种用于标记电子文件使其具有结构行的标记语言. 自动化测试中的使用场景: 1. 经常变动的测试数据: 2. 数据量大,不方便放在脚本中: 3. 数据作用于多个地方: 4. 相同测试用例,可以使用不同的数据: 5. 例:不稳定,后续改动较多功能:容易出错的功能 XML特征 • 具有自我描述性,本身不做任何事情 • 声明部分 <?xml version=

  • Python yield与实现方法代码分析

    yield的功能类似于return,但是不同之处在于它返回的是生成器. 生成器 生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器). 如果一个函数包含yield关键字,这个函数就会变为一个生成器. 生成器并不会一次返回所有结果,而是每次遇到yield关键字后返回相应结果,并保留函数当前的运行状态,等待下一次的调用. 由于生成器也是一个迭代器,那么它就应该支持next方法来获取下一个值. 基本操作 # 通过`yield`来创建生成器 def f

随机推荐