一、生成器

在Python中,使用生成器可以很方便的支持迭代器协议。生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果,在每个结果之间挂起和继续它们状态,来自动实现迭代协议。

下面通过几个实例来了解生成器的工作:

例子1:

def fun(n):i=0while i<n:print("开始",i)yield ii+=1print("结束",i)
b=fun(5)
next(b)
next(b)输出:
开始 0结束 1
开始 1

执行过程:第一个next(b),执行到print(“开始”,0),遇到yeild就停止。第二个next(b),会从上一个yield之后开始执行,一直到下一个yield。也就是输出结束1,开始1.

特点1:函数里面加入yield之后,函数就是生成器

也就是说,yield是一个语法糖,内部实现支持了迭代器协议,同时yield内部是一个状态机,维护着挂起和继续的状态。
生成器函数返回生成器的迭代器。 “生成器的迭代器”这个术语通常被称作”生成器”。
要注意的是生成器就是一类特殊的迭代器。作为一个迭代器,生成器必须要定义一些方法,其中一个就是__next__()。如同迭代器一样,我们可以使用__next__()函数来获取下一个值。

在一个 generator function 中,如果没有 return,则默认执行至函数完毕,如果在执行过程中 return,则直接抛出 StopIteration 终止迭代。

实例2:生成器实现斐波那契数列

先看一下传统的方法:
def fab(maxs):n,a,b = 0,0,1while n < maxs:print(b)a,b = b,a+bn = n + 1fib = fab(6)一次性输出:
1
2
3
5
8

加入生成器:
def fab(maxs):n,a,b = 0,0,1while n < maxs:yield b ##yield只能依次读取,不能从中间读取a,b = b,a+bn = n + 1fib = fab(6)
print(next(fib))
print(next(fib))
print(next(fib))
print(next(fib))
print(next(fib))

依次输出:11235

可以看到生成器实现的时候,我们可以按照需要进行取值,而不用一次性输出全部的数据。这个功能在读文件的时候,如果文件很大,我们可以用生成器去读,就不会占很大的内存空间

二、面试题

1.小数位步长实现:range函数的步长都是》=1的,我们实现一个函数,支持小数位的步长。例如 rangex(0,1,0.1).依次返回0,0.1,0.2,0.3.。。。

def range_powerfull(start,end,step):if isinstance(start,(int,float)) and isinstance(end,(int,float)):while start <end:startyield float(start)start+=stepelse:print('输入错误,开始和结束位置请输入整数或者浮点数')a = range_powerfull(0,1,0.1)
b = range_powerfull(3,10,0.75)
c = range_powerfull('c',5,0.23)for x in a:print(x)for y in b:print(y)输出:
0.0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.99999999999999993.0
3.75
4.5
5.25
6.0
6.75
7.5
8.25
9.0
9.75

可以通过for循环一次全部取出值,也可以通过next()函数一个一个的取值。

2.

实现装饰器测试函数的运行时间,现在要求,在这个装饰器的基础上,完善这个装饰器。使其:
1. 依然可以测试函数运行的时间
2. 依然可以将函数运行的时间输出到屏幕上
3. 除了以上两点,还可以将运行时间,以日志的形式记录在指定的文件中(当作日志)。
4.测试函数大家自己选取

import timedef run_time(func):def new_fun(*args):t0 = time.time()back = func(*args)times = time.time() - t0print('run time: %s' % (times))with open('log.txt', 'a+') as f:f.write('---%s\t' % (str(time.asctime(time.localtime()))))f.write('run time: %f\n' % (times))return back, timesreturn new_fun@run_time
def bu(x):for i in range(len(x)):for j in range(i,len(x)):if x[i]>=x[j]:x[i],x[j]=x[j],x[i]return xprint(bu([2,3,6,1,3,2,7]))

输出:([1, 2, 2, 3, 3, 6, 7], 0.0)并且追加写入log

3.在编辑文本中,我们经常需要在文本中找到某个模式出现的位置。比如我要在文本中找到某个字符串出现的次数和位置,这种问题称为字符串匹配问题。我们简化为在一个字符串中找到模式出现的位置。

如:字符串为:str1='adhvahabcabcabcfjiaohgio'
模式为:str2='abc'
找出str1中模式出现的位置(6,9,12)

str1='adhvahabcabcabcfjiaohgio'
str2='abc'str11='das3212345mn*1232123)'
str22='32123'def find_index(pattern,original):li = []for i in range(len(original)):if original[i]==pattern[0] and original[i:i+len(pattern)]==pattern:li.append(i)return liprint(find_index(str2,str1))
print(find_index(str22,str11))输出:

[6, 9, 12]
[3, 15]

4.字符串里面的count可以统计字符出现的次数,现在要求大家定义这样的一个类,这个类里有一个方法可以统计字符串里的所有的字符出现的次数,并作为一个字典返回,同时这个类还有字符串的所有方法。

import os, hashlibclass new_str(str): ##继承str就可以有字符串的全部方法def __init__(self, str1):self.str1 = str1def count(self):dic = {}for i in set(self):dic[i] = int(super().count(i))return dicrandstr = hashlib.sha1(os.urandom(32)).hexdigest()a = new_str(randstr)
print(a.count())

输出:{'a': 1, '3': 3, '4': 2, '9': 3, '6': 2, 'f': 2, '7': 6, 'd': 3, '8': 2, 'c': 5, '1': 2, '0': 4, '5': 2, '2': 3}

转载于:https://www.cnblogs.com/forfreewill/articles/9407530.html

【Python3_进阶系列_010】Python3-生成器相关推荐

  1. 【Python3_进阶系列_006】Python3-单例模式

    一.单例模式 Python3中常见的实现单例模式的方法有2种:__new__()和装饰器写法 例子:__new__()方法实现单例 class Singleton():def __new__(cls, ...

  2. 【Python3_进阶系列_004】Python3-工厂设计模式

    一.工厂设计模式 设计模式是编程语言中非常重要的优秀代码,常见的设计模式,这里列举三种:工厂模式,单例模式,代理模式.现在介绍常见的常见的工厂设计模式的实现和优化. 工厂设计模式可以有很多种实现方式: ...

  3. 【Python3_进阶系列_013】Python3-实现文件夹文件的过滤

    1.实现一个函数,可以输出指定目录下的指定后缀的文件,也可以排除指定后缀的文件 os.listdir可以列出指定目录下的全部文件名,子文件夹名.但是无法循环列出子文件夹下的子文件夹和文件名.因此函数需 ...

  4. 超全PHP学习资源整理:入门到进阶系列

    PHP是少数几门在语言层面饱受诟病,但在实际开发和应用上却又让人无法撒手的语言之一.就好比路边摊小吃,一遍骂人家不卫生,一遍却又说:真香.所谓接地气,不外如此,大道理不说,PHP光是轮子多.市场占有率 ...

  5. malloc开辟的空间在哪一个区间_C++进阶系列之STL(2)SGI版本空间配置器

    1.STL中的空间配置器在STL中,空间配置器分了2组,分别为一级空间配置器和二级空间配置器,但是它们都有自己各自运用的场合:一般说来,一级空间配置器一般分配的空间大于128B,二级空间配置器的分配空 ...

  6. C#进阶系列——WebApi 身份认证解决方案:Basic基础认证

    阅读目录 一.为什么需要身份认证 二.Basic基础认证的原理解析 1.常见的认证方式 2.Basic基础认证原理 三.Basic基础认证的代码示例 1.登录过程 2./Home/Index主界面 3 ...

  7. C#进阶系列——WebApi 接口参数不再困惑:传参详解

    看这边文章时的疑惑是:WebApi中的参数加了[FromBody],不知所以然,就百度了下,看到了以下文章,和大家分享下: 原文链接:http://www.cnblogs.com/landeanfen ...

  8. C#进阶系列——WebApi 跨域问题解决方案:CORS

    C#进阶系列--WebApi 跨域问题解决方案:CORS 参考文章: (1)C#进阶系列--WebApi 跨域问题解决方案:CORS (2)https://www.cnblogs.com/landea ...

  9. C#进阶系列——DDD领域驱动设计初探(五):AutoMapper使用

    前言:前篇搭建了下WCF的代码,就提到了DTO的概念,对于为什么要有这么一个DTO的对象,上章可能对于这点不太详尽,在此不厌其烦再来提提它的作用: 从安全上面考虑,领域Model都带有领域业务,让Cl ...

最新文章

  1. 数据蒋堂 | 多维分析预汇总的功能盲区
  2. AgileEAS.NET平台之ORM设计器
  3. Android消息处理机制
  4. 转!mysql 查询 distinct多个字段 注意!!
  5. android 判断是否正在扫描蓝牙_判断蓝牙是否连接
  6. fastdfs 集群 java_FastDFS集群部署(转载 写的比较好)
  7. matlab conv2
  8. pydev插件安装方法
  9. 重磅!滴滴全员会宣布过冬:将裁员15% 涉及员工超2000人
  10. Java OpenCV之Mat类的概述、常用构造方法、常用函数
  11. Linux 部署ASP.NET SQLite 应用 的坎坷之旅 附demo及源码
  12. poj 1743 Musical Theme【后缀自动机】
  13. GO -- 一个经验
  14. 整点小浪漫~Python27行代码绘制一幅满天星
  15. 01使用ILDasm.exe将可执行文件反编译成IL代码
  16. 公司找域名怎么找?有什么技巧?
  17. 你走后 爱情的遗址像是空城
  18. MFC+Opencv以图拼图
  19. c语言中 让小球 发射小球,小球发射问题求大神解决(让小球向鼠标蓄力方向发射)...
  20. (三十)信号——信号产生原因以及信号处理行为的简介

热门文章

  1. Apollo通过客户端openApi方式更新、获取、发布配置
  2. Vue中的join(),reverse()与 split()函数
  3. java 线程 原子性_深入理解Java多线程与并发框架——Java内存模型与原子性、可见性、有序性...
  4. mycat核心配置详解(schema.xml配置)
  5. Cocos2dx源码记录(6) CCTrianglesCommand
  6. FreeSWITCH的NAT穿越
  7. RestExpress response中addHeader 导致stackOverflow
  8. C#—Dev XtraTabControl操作总结如动态增加Tab和关闭选项卡方法等
  9. 如何改变Myeclipse编辑区背景色(转)
  10. CSS 之 样式优先级机制