1. 迭代时修改一个列表

删除列表中的奇数

>>>numbers = [i for i in range(10)]
>>>numbers
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>>odd = lambda x: bool(x%2)
>>>for i in range(len(numbers)):
...    if odd(i):
...        del numbers[i]
IndexError: list assignment index out of range

迭代时,从一个列表(List)或数组中删除元素,这是一个总所周知的错误。尽管上述程序的错误十分明显,但在开发某些大型程序时,有时则并非那么故意而为之。

幸运的是,python包含大量简洁而优雅的编程范式,若使用得当,将大大简化代码。针对上例,一个优雅的范例是通过递推式列表(list comprehensions):

>>>evens = [i for i in numbers if not odd(i)]
>>>evens
[0, 2, 4, 8]

2. 滥用表达式作为函数参数的默认值

def foo(bar=[]):bar.append('baz')return bar
>>>foo()
['baz']
>>>foo()
['baz', 'baz']
>>>foo()
['baz', 'baz', 'baz']

这段代码的错误之处在于误以为:函数在没有指定形参时总是将形参设置为默认值,然而事实并非如此,对这段代码的调试以及如何使用PyCharm可参看之前的一篇文章<Python 基础——一张图告诉你PyCharm如何进行断点调试>。

正确的形式如下:

def foo(bar=None):if not bar:bar = []bar.append('baz')return bar
>>>foo()
['baz']
>>>foo()
['baz']
>>>foo()
['baz']

3. 不明白闭包环境变量的绑定时机

理解Python闭包与延迟绑定

闭包:把函数当做一个对象,因此可以作为某个函数的返回值。同时闭包必须满足下列三个条件:

  • 必须是一个嵌套的函数。
  • 闭包必须返回嵌套函数。
  • 嵌套函数必须引用一个外部的非全局的局部自由变量。
def create_multipliers():return [lambda x: i*x for i in range(5)]# 符合闭包的三个条件:存在嵌套函数且将嵌套函数返回,引用了一个非全局的局部自由变量 i;
>>>for multiplier in create_mupliiers(5):
...    print(multiplier(2))
...

期望输出的结果:

0
2
4
8

然而输出的结果是:

8
8
8
8
8

只是因为python的迟绑定——闭包中用到的环境变量(闭包所依赖的变量)只有在函数被调用时才会被赋值,在上述的代码中,任何时候,当返回的函数被调用时,Python会在该函数被调用时的作用域中查找i对应的值(此时循环已经结束,i被附上了最终的值4)

解决方案:

def multipliers():return [lambda x, i=i: i*x for i in range(5)]>>>for multiplier in multipliers():
...    print(multiplier(2))
...
0
2
4
8

利用默认参数生成匿名函数,以实现我们想要的结果。

Python 基础 —— Python程序员常犯的那些错误相关推荐

  1. Python程序员常犯的十个错误

    不管是在学习还是工作过程中,人都会犯错.虽然Python的语法简单.灵活,但也一样存在一些不小的坑,一不小心,不管是初学者还是资深Python程序员都有可能会栽跟头. 常见错误1:错误地将表达式作为函 ...

  2. python编程新手常犯的错误_Python程序员常犯的10个错误

    BY- SENIOR SOFTWARE ENGINEER @TOPTAL About Python 关于Python Python is an interpreted, object-oriented ...

  3. 初级程序员常犯错误一览

    作者 | 饶全成 来源 | 码农桃花源(ID:CoderPark) 最近接手其他人做的项目,导致之前的一些幻想破灭了.因为刚工作的时候做项目是php,而php本身的web框架一般只简单区分mvc,稍微 ...

  4. 程序员常犯的五个非技术性错误

    一个好的程序员需要培养两种技能:技术技能和非技术技能.然而有些开发者只注重技术的部分,而忽视了其他部分. 下面是程序员最常犯的 5 个非技术性错误: 缺乏自律 Jim Rohn 曾经说过:自律是目标和 ...

  5. 后端技术:Java 程序员常犯的 10 个 SQL 错误!

    Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用"模式-模式" ...

  6. 程序员常犯的5个非技术性错误

    一个好的软件开发人员需要培养两种技能:技术技能和非技术技能.不幸的是一些开发者只注重技术的部分,以致养成一些陋习,下面是最常犯的5个非技术性错误: 0. 缺乏自律 Jim Rohn曾经说过:自律是目标 ...

  7. Java 程序员常犯的 10 个 SQL 错误!

    往期热门文章: 1.摸鱼王!2.抖音服务器带宽有多大,才能供上亿人同时刷?3.Spring新版本抛弃JVM,可独立部署,网友:要自立门户???4.记一次因 Redis 使用不当导致应用卡死 bug 的 ...

  8. Java程序员常犯的几类错误

    1.忽视异常 相信很多小伙伴在编程的过程中经常对异常置之不理.针对初学者和有经验的 Java 程序员,最佳实践仍是处理它们.异常抛出通常是带有目的性的,因此在大多数情况下需要记录引起异常的事件.不要小 ...

  9. 程序员常犯的4大错误,快看你有没有中招

    作者 | 侯菲艳 出品 | CSDN(ID:CSDNnews) CRUD,代码能跑起来就行 大多数的程序员在写代码的时候,都只关心这个程序能不能跑起来,而这恰恰就是普通程序员和高手程序员之间的分水岭. ...

最新文章

  1. chrome浏览器调试手机端h5页面
  2. [翻译练习] #selector() 和响应者链
  3. 躲开职业生涯的“甜蜜陷阱”
  4. x内存满白苹果解决_苹果最佳MacBook和Mac:顶级苹果台式机和笔记本电脑
  5. 主梁弹性模量计算_混凝土松弛系数的实用计算
  6. 解决IDEA连接mysql时出现Server returns invalid timezone问题一劳永逸的方法
  7. 别跑!JAVA!-----------一篇关于JAVA的博客
  8. 流量贵?裂变营销或是低成本营销的最佳选择!
  9. DirextX Training笔记
  10. b站下载器,支持分辨率登录,带弹幕,简洁bilili
  11. PHP Include文件
  12. android 手机信号软件增强方案
  13. [转]jackson json字符串、map、java对象的转换例子
  14. UIUC简介 -- 写给今年得到UIUC Offer并在犹豫中的同学
  15. uniapp中使用iconfont多色图标
  16. numpy序列预处理dna序列_?12个很棒的Pandas和NumPy函数,让分析事半功倍
  17. 欧姆龙SYSMAC STUDIO如何与基恩士DL-EP1进行EIP通信
  18. 步进电机中的力矩(g.cm),转矩(n.m),扭矩(kg.m)有什么区别?
  19. iOS_预编译(宏)#if #ifdef #ifndef #elif #else #endif
  20. matlab打开bmp,Matlab 读取文件夹中所有的bmp文件

热门文章

  1. mysql备份-a是什么_MySQL主从备份和主主备份配置+Keepalived+MySQL读写分离
  2. linux6.4添加源,RHEL6.4更改为CentOS源
  3. localhost 拒绝了我们的连接请求。_Zipkin请求链路日志聚合
  4. 剑指offer面试题15. 二进制中1的个数(位运算)
  5. LeetCode 106. 从中序与后序遍历序列构造二叉树(递归)
  6. Stanford机器学习---第二讲. 多变量线性回归 Linear Regression with multiple variable
  7. linux环境安装jdk啊
  8. 单例设计模式之间的区别
  9. I - Destroy Walls (HDU - 6187)
  10. 类的继承查询策略:广度优先