作家
登录

程序员老司机都要错的Python陷阱与缺陷列表

作者: 来源: 2017-10-12 11:04:09 阅读 我要评论


法度榜样员老司机都要错的Python陷阱与缺点列表

create_multipliers函数的返回值时一个列表,列表的每一个元素都是一个函数 -- 将输入参数x乘以一个倍数i的函数。预期的结不雅时0,2,4,6,8. 但结不雅是5个8,不测不料外。

我小我对陷阱的定义是如许的:代码看起来可以工作,但不是以你“想当然“”的方法。如不雅一段代码直接掉足,抛出了异常,我不认为这是陷阱。比如,Python法度榜样员应当都碰到过的“UnboundLocalError”, 示例:

  1. >>> a=1 
  2. >>> def func(): 
  3. ...     a+=1 
  4. ...     print a 
  5. ... 
  6. >>> func() 
  7. Traceback (most recent call last): 
  8. File "<stdin>", line 1, in <module> 
  9. File "<stdin>", line 2, in func 
  10. UnboundLocalError: local variable 'a' referenced before assignment 

对于“UnboundLocalError”,还有更高等的版本:

  1. import random 
  2.   
  3. def func(ok): 
  4.     if ok: 
  5.         a = random.random() 
  6.     else
  7.         import random 
  8.         a = random.randint(1, 10) 
  9.     return a 
  10.   
  11. func(True)# UnboundLocalError: local variable 'random' referenced before assignment 

如不雅逻辑比较简单,应用list comprehension是不错的留意

可能对于很多python新手来说,这个Error让人摸不着脑筋。但我认为这不算陷阱,因为这段代码必定会报错,而不是默默的以缺点的方法运行。不怕真小人,就怕伪正人。我认为缺点就比如伪正人。

那么Python中哪些真正算得上陷阱呢?

第一:以mutable对象作为默认参数

这个估计是最广为人知的了,Python和其他很多说话一样,供给了默认参数,默认参数确切是个好器械,可以让函数调用者忽视一些细节(比如GUI编程,Tkinter,QT),对于lambda表达式也异常有效。然则如不雅应用了可变对象作为默认参数,那么工作就不那么竽暌逛快了。

  1. >>> def f(lst = []): 
  2. ...     lst.append(1) 
  3. ...     return lst 
  4. ... 
  5. >>> f() 
  6. [1] 
  7. >>> f() 
  8. [1, 1] 

惊喜不惊喜?!究其原因,python一一切都是对象,函数也不列外,默认参数只是函数的一个属性。而默认参数在函数定义的时刻已经求值了。

  1. Default parameter values are evaluated when the function definition is executed. 

stackoverflow上有一个更恰当的例子来解释默认参数是在定义的时刻求值,而不是调用的时刻。

  1. l = [] 
     1/5    1 2 3 4 5 下一页 尾页

      推荐阅读

      从开发到部署会用到的 Docker 命令

    本文的目标是懂得容器开辟在目标情况中安排的端到端流程,并列出这些操作所需的 Docker 敕令。1. 介绍全部流程包含应用代码、依附软件和设备来开辟容器映像,在开辟情况中运行和测试容器,将容器映像宣>>>详细阅读


    本文标题:程序员老司机都要错的Python陷阱与缺陷列表

    地址:http://www.17bianji.com/lsqh/37834.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)