资讯专栏INFORMATION COLUMN

python高阶函数中一个容易犯的错

booster / 3563人阅读

摘要:究其原因,在于的惰性计算以及匿名函数的闭包特性。上面的代码中,是一个变量,匿名函数只有在时才会真正调用,而此时,的值已经是当前的值,而不是之前的值了,比如,应当是的倍数,但此时的值并不是,导致成立。

问题

python对函数式编程有一定的支持,具体表现在高级函数,map,reduce,filter,partial function等几个方面。在应用函数式编程中,需要关注函数式编程中的变量不变性,惰性计算等原则,否则容易踩到坑。

def f():
   def num_gen():
       x = 2
       while True:
           yield x
           x+=1
   l=num_gen()
   while True:
       n = next(l)
       yield n
       l = filter(lambda x:x%n!=0,l)
primes = f()
for i in primes:
    print(i)

这段代码本意在于返回一个素数列表,但实际在运行中返回的并不是想要的。究其原因,在于filter的惰性计算以及lambda匿名函数的闭包特性。上面的代码中,n是一个变量,lambda匿名函数只有在next(f())时才会真正调用,而此时,n的值已经是当前n的值,而不是之前的值了,比如9,应当是3的倍数,但此时n的值并不是3,导致9%n>0成立。

要修改这段代码,一个方法是利用lambda的闭包,避开n变量,生成一个和n无关的函数。

def f():
   def g(n):
       return lambda x:x%n!=0
   def num_gen():
       x = 2
       while True:
           yield x
           x+=1
   l = num_gen()
   while True:
       n = next(l)
       yield n
       l = filter(g(n),l)
primes = f()
for i in primes:
    print(i)

这样修改后,g(n)是实时调用的,返回一个和n无关的函数,这样在next惰性调用时,就不会出错。

总结

类似的错误在返回函数的高阶函数中也容易出错,如果返回的函数和一个变量绑定了,就会出现问题,解决的方法都是一样,增加一个闭包函数,使得返回函数和变量无关。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45434.html

相关文章

  • [19051501]记录一次日常的错

    摘要:随后就进行了纠结现在都想敲死自己,应该不用纠结,在编辑器跑一遍,问题就暴露出来了。至于为什么在服务器上没有抛异常出来,很可能是被框架给吃掉了,需要进一步排查。 Parameter array not found. Available parameters are [collection, list] 莫名其妙,今天写代码遇到个低级错误,困扰了好久,测试突然给提了个缺陷,说业务逻辑有问...

    graf 评论0 收藏0
  • [翻译]使用Python一步一步地来进行数据分析

    摘要:原文链接译文链接使用一步一步地来进行数据分析翔你已经决定来学习,但是你之前没有编程经验。在我看来精通用开发好的软件才能够高效地进行数据分析,这观点是没有必要的。 原文链接:Step by step approach to perform data analysis using Python 译文链接:使用Python一步一步地来进行数据分析--By Michael翔 你已经决定来学习P...

    forsigner 评论0 收藏0
  • 我是如何在自学编程9个月后找到工作的

    摘要:昨天在我在国外网站上看到一篇文章,作者分享了他自学编程个月后找到工作的经历。而本文中,我主要针对想要通过学习编程找工作的角度来谈。我在年月犯了一个错误我认为首要任务是找到一份前端开发的工作。 昨天在我在国外网站 reddit 上看到一篇文章,作者分享了他 自学编程 9 个月后找到工作 的经历。文章不到一天就得到3千多赞,2百条回复。我看了下内容,非常中肯,其中有不少建议也是我在编程教室...

    gaosboy 评论0 收藏0
  • python编码的意义

    摘要:而他们的中文释义,就是对新手的最大陷阱编码。而码,也就是美国信息交换标准码,年发布,位字符编码中影响最大的一种。 编码,还是编码! python2的直钩——编码异常 当你用python打开一篇中文文档,准备读取里面的数据开始实验...当你处理好你的数据,打算打印出易于阅读的结果给boss检查...甚至当你刚刚开始编写自己的代码,就写了一句话... text = 什么鬼 只要你开始运行自...

    e10101 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<