# -*- 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的区别的更多相关文章

  1. 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 ...

  2. 详解Python中的生成器表达式(generator expression)

    介绍 1.生成器表达式(generator expression)也叫生成器推导式或生成器解析式,用法与列表推导式非常相似,在形式上生成器推导式使用圆括号(parentheses)作为定界符,而不是列 ...

  3. Python 列表解析list comprehension和生成表达式generator expression

    如果想通过操作和处理一个序列(或其他的可迭代对象)来创建一个新的列表时可以使用列表解析(List comprehensions)和生成表达式(generator expression) (1)list ...

  4. Python高级编程之生成器(Generator)与coroutine(一):Generator

    转载请注明出处:点我 这是一系列的文章,会从基础开始一步步的介绍Python中的Generator以及coroutine(协程)(主要是介绍coroutine),并且详细的讲述了Python中coro ...

  5. list comprehension & generator expression

    List comprehensions(列表推导式) are better when you want to iterate over something multiple times. Howeve ...

  6. django1.11 启动错误:Generator expression must be parenthesized

    错误信息: Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0 ...

  7. python3.7环境下创建app、运行Django1.11版本项目报错Generator expression must be parenthesized

    有些同学喜欢追求新鲜感~但追求新鲜感终归是要付出一点点代价的 在编程领域有一句至理名言:用东西不要用最新的! 就像每次苹果系统的升级都会有相当一部分用户的手机成砖一样 下面我们就介绍一个因版本升级带来 ...

  8. ORM基础3 在python脚本里调用Django环境

    1.查询 1.# all获取所有的object,结果QuerySet,列表 print('all'.center(80, '=')) ret = models.Person.objects.all() ...

  9. django 启动错误:Generator expression must be parenthesized 错误信息:

    错误为: Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x ...

随机推荐

  1. java代码整理---正则表达式

    1. 邮箱验证 : package javaRegx2016311; import java.util.regex.Matcher; import java.util.regex.Pattern; p ...

  2. cocos2d-x mac or windows eclipse android ------ Eclipse工程里面还会有许多警告

    由于公司的游戏项目比较特殊,  coco2d-x 的  ios  和  android  的游戏 代码 没有采用 共享目录的开发方式.所以android 内的 c++ 游戏代码全部放在 jni 下, ...

  3. 132. Palindrome Partitioning II

    题目: Given a string s, partition s such that every substring of the partition is a palindrome. Return ...

  4. 栈和队列的面试题Java

    栈和队列: 面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min ...

  5. 【HDOJ】1253 胜利大逃亡

    经典的BFS,需要注意的是当前时间超过最小时间,输出-1.同时,队列为空时还未返回,证明并未找到终点(可能终点为墙).此时也应该输出-1,这个部分容易wa. #include <cstdio&g ...

  6. UVA_11468_Substring_(AC自动机+概率动态规划)

    描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  7. 调试MSBuild脚本

    http://blogs.msdn.com/b/visualstudio/archive/2010/07/06/debugging-msbuild-script-with-visual-studio. ...

  8. 物联网操作系统HelloX V1.77(beta)版本发布

    物联网操作系统HelloX V1.77发布 经过近半年的努力,物联网操作系统HelloX V1.77版本正式完成,源代码已上载到github(github.com/hellox-project/Hel ...

  9. c语言时间库函数#include<time.h>

    日期与时间函数<time.h> 头文件<time.h>中说明了一些用于处理日期和时间的类型和函数.其中的一部分函数用于处理当地时间,因为时区等原因,当地时间与日历时间可能不相同 ...

  10. feed4junit 实现junit4框架体系下数据驱动

    junit 是一款很好用的测试框架,但是该框架在并行和数据驱动方面没有提供支持,往往我们队这2个需求是很迫切的,不过有需求就会有人去做,有心思的人出现了,feed4junit 出现了,弥补了junit ...