作家
登录

学习用Python编程时要避免的3个错误

作者: 来源: 2017-08-17 12:20:51 阅读 我要评论

【51CTO晃荡】8.26 带你深度懂得清华大年夜学、搜狗基于算法的IT运维实践与摸索


这些缺点会造成很麻烦的问题,须要数小时才能解决。


当你做错事时,承认缺点并不是一件轻易的事,然则犯错是任何进修过程中的一部分,无论是进修走路,照样进修一种新的编程说话都是如许,比如进修 Python。

年青的法度榜样员们可要留意了,这些缺点是会浪费一下昼的!

学惯用Python编程时要避免的3个缺点

1、 可变数据类型作为函数定义中的默认参数

这似乎是对的?你写了一个小函数,比如,搜刮当前页面上的链接,并可选将其附加到另一个供给的列表中。

  1. def search_for_links(page, add_to=[]): 
  2.     new_links = page.search_for_links() 
  3.     add_to.extend(new_links) 
  4.     return add_to 

大年夜外面看,这像是十分正常的 Python 代码,事实上它也是,并且是可以运行的。然则,这里有个问题。如不雅我们给 add_to 参数供给了一个列表,它将按照我们预期的那样工作。然则,如不雅我们让它应用默认值,就会出现一些神奇的工作。

尝尝下面的代码:

  1. b = a.copy() 

谜底正如我们所想的那样。要想获得这种结不雅,精确的办法是:

  1. def fn(var1, var2=[]): 
  2.     var2.append(var1) 
  3.     print var2 
  4. fn(3) 
  5. fn(4) 
  6. fn(5) 

可能你认为我们将看到:

  1. [3] 
  2. [4] 
  3. [5] 

但实际上,我们看到的倒是:

b.urls:

  1. [3] 
  2. [3, 4] 
  3. [3, 4, 5] 

为什么呢?如你所见,每次都应用的是同一个列表,输出为什么会是如许?在 Python 中,当我们编写如许的函数时,这个列表被实例化为函数定义的一部分。当函数运行时,它并不是每次都被实例化。这意味着,这个函数会一向应用完全一样的列表对象,除非我们供给一个新的对象:

  1. fn(3, [4])  
  2. [4, 3] 
  1. def fn(var1, var2=None): 
  2.     if not var2: 
  3.         var2 = [] 
  4.     var2.append(var1) 

或是在第一个例子中:

  1. def search_for_links(page, add_to=None): 
  2.     if not add_to: 
  3.         add_to = [] 
  4.     new_links = page.search_for_links() 
  5.     add_to.extend(new_links) 
  6.     return add_to 

这将在模块加载的时刻移走实例化的内容,以便每次运行函数时都邑产生列表实例化。请留意,对于弗成变数据类型,比如元组、字符串、整型,是不须要推敲这种情况的。这意味着,像下面如许的代码是异常可行的:

  1. class URLCatcher(object): 
  2.     urls = [] 
  3.     def add_url(self, url): 
  4.         self.urls.append(url) 

这和膳绫擎提到的最后一个缺点很相像。思虑以下代码:

  1. a = URLCatcher() 

  2.   推荐阅读

      iOS Public Beta 5值得关注的7个变化

    【51CTO晃荡】8.26 带你深度懂得清华大年夜学、搜狗基于算法的IT运维实践与摸索日前,苹不雅宣布了 iOS 11 的第五个公测版(Public Beta 5)。iOS 11 Beta 根本已经接近尾声,更新内容重要集中在 bug 修>>>详细阅读


    本文标题:学习用Python编程时要避免的3个错误

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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