Python 3. 里filter与generator expression的区别
# -*- coding: utf-8 -*-
"""
A test to show the difference between filter and genrator expression As I believe, generator expression will delay the evaluation of the expression behind if 测试filter与generator expression的区别
根据下面的测试结果,我推测生成式表达式(generator expression)会对if表达式推迟赋值 """ def _odd_iter():
n = 1
while True:
n = n + 2
yield n def _not_divisible(n):
return lambda x: x % n > 0 # 下面四种写法,只有第一种是正确的,其他写法primes0,primes1,primes2,都不会正确筛掉非质数。
def primes():
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一个数
yield n
it = filter(_not_divisible(n), it) # 因为为了完成_not_divisible的调用,n的值已经传进来了。
#据我理解,这个结果是 ...filter((lambda x: x % 7 >0), filter((lambda x: x % 5 >0), filter((lambda x: x % 3 >0), _odd_iter()))) def primes0():
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一个数
yield n
it = filter((lambda x: x % n >0), it) # 此时n的值未传进来;传进来的是n这个变量
#据我理解,这个结果是 ...filter((lambda x: x % n >0), filter((lambda x: x % n >0), filter((lambda x: x % n >0), _odd_iter()))) def primes1():
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一个数
yield n
it = (item for item in it if _not_divisible(n)(item)) # generator这种写法可能把 if 后面的运算都延迟了?
#据我理解,从最后结果反推出,这个结果是 ...(item for item in (item for item in (item for item in _odd_iter() if _not_divisible(n)(item)) if _not_divisible(n)(item)) if _not_divisible(n)(item))
#这里并没有把n的值代进去,而是保留了对n的引用,
#如果我的理解是对的,那么filter跟generator expression是不一样的,generator expression对if后面的表达式是延迟计算的。 def primes2():
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一个数
yield n
it = (item for item in it if (lambda x: x % n > 0)(item)) # 结果同primes1
################ test output
print("output by primes:")
for n in primes():
if n < 20:
print(n)
else:
break
print("output by primes0:")
for n in primes0():
if n < 20:
print(n)
else:
break
print("output by primes1:")
for n in primes1():
if n < 20:
print(n)
else:
break
print("output by primes2:")
for n in primes2():
if n < 20:
print(n)
else:
break
基于廖雪峰python 3教程里的讨论:
http://www.liaoxuefeng.com/discuss/001409195742008d822b26cf3de46aea14f2b7378a1ba91000/001480687071611fab98c8f381a4b63a1a94132134c432d000?page=1
14:49:47 2016-12-03
Python 3. 里filter与generator expression的区别的更多相关文章
- Python中Lambda, filter, reduce and map 的区别
Lambda, filter, reduce and map Lambda Operator Some like it, others hate it and many are afraid of t ...
- 详解Python中的生成器表达式(generator expression)
介绍 1.生成器表达式(generator expression)也叫生成器推导式或生成器解析式,用法与列表推导式非常相似,在形式上生成器推导式使用圆括号(parentheses)作为定界符,而不是列 ...
- Python 列表解析list comprehension和生成表达式generator expression
如果想通过操作和处理一个序列(或其他的可迭代对象)来创建一个新的列表时可以使用列表解析(List comprehensions)和生成表达式(generator expression) (1)list ...
- Python高级编程之生成器(Generator)与coroutine(一):Generator
转载请注明出处:点我 这是一系列的文章,会从基础开始一步步的介绍Python中的Generator以及coroutine(协程)(主要是介绍coroutine),并且详细的讲述了Python中coro ...
- list comprehension & generator expression
List comprehensions(列表推导式) are better when you want to iterate over something multiple times. Howeve ...
- django1.11 启动错误:Generator expression must be parenthesized
错误信息: Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0 ...
- python3.7环境下创建app、运行Django1.11版本项目报错Generator expression must be parenthesized
有些同学喜欢追求新鲜感~但追求新鲜感终归是要付出一点点代价的 在编程领域有一句至理名言:用东西不要用最新的! 就像每次苹果系统的升级都会有相当一部分用户的手机成砖一样 下面我们就介绍一个因版本升级带来 ...
- ORM基础3 在python脚本里调用Django环境
1.查询 1.# all获取所有的object,结果QuerySet,列表 print('all'.center(80, '=')) ret = models.Person.objects.all() ...
- django 启动错误:Generator expression must be parenthesized 错误信息:
错误为: Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x ...
随机推荐
- about js
function: javascript jquery modernizr yepnope code organization requirejs backbonejs http://blog.csd ...
- 如何使用 Java8 实现观察者模式?(下)
[编者按]本文作者是 BAE 系统公司的软件工程师 Justin Albano.在本篇文章中,作者通过在 Java8 环境下实现观察者模式的实例,进一步介绍了什么是观察者模式.专业化及其命名规则,供大 ...
- c# 捕捉键盘按键
//esc退出窗体 protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg , System.Windo ...
- easyui源码翻译1.32--TreeGrid(树形表格)
前言 扩展自$.fn.datagrid.defaults.使用$.fn.treegrid.defaults重写默认值对象.下载该插件翻译源码 树形表格用于显示分层数据表格.它是基于数据表格.组合树控件 ...
- Delphi实现多个图像相互覆盖时无内容处点击穿透
http://www.52delphi.com/list.asp?ID=1405 CM_HITTEST是Delphi自定义的控件消息
- Ember.js demo6
<!DOCTYPE html> <html> <head> <meta name="description" content=" ...
- GML、SVG、VML的比较
转自:http://www.cnblogs.com/3echo/archive/2009/02/19/1394399.html GML.SVG和VML都是基于XML的可用来描述矢量图形的标记语言,都是 ...
- tomcat 服务器全解
①B/S.C/S比较 ⑴C/S C/S结构即客户端/服务器(Client/Server),例如QQ: 需要编写服务器端程序,以及客户端程序,例如我们安装的就是QQ的客户端程序: 缺点:软件更新时需要同 ...
- 【JS】Intermediate2:Events and Callbacks
event-driven :waiting for and reacting to events 2.page loads, user interacts (clicks, hovers, chang ...
- str*函数和大小端判断
#include <stdio.h> #include <assert.h> size_t mstrlen(const char *s) { assert(s != NULL) ...