题图:Photo by Andrew Ridley on Unsplash

设计模式是前人多年总结出来的经验,而反设计模式(Anti-Pattern)就是那些违反正确方式写代码的方法,往往这样的代码从可读性、安全性、正确性等方面都有问题。今天列一些平时写代码的坏习惯,避开这些问题使得我们的代码效率更高,可读性更强,Bug更少。

1、使用标准库中的名字

py文件名跟系统自带的模块名一样导致找不到模块是初学者犯错最多的时候,我最开始也犯这样的错,比如学 random 模块时,将自己的文件名也命名为 random.py, 执行的时候报错。为什么?因为 你在import random的时候,解释器有优先从当前目录加载模块,刚好,当前目录有个random.py ,所以就不会去Python的标准库目录找random模块了。

random.py

importrandom

print(random.choice([ 1, 2, 3])) AttributeError: module 'random’has no attribute 'choice’2. 使用内建名称作为变量名

程序员最头疼的事情就是如何给变量命名,如何给类命名,如何给函数命名,有种不好的习惯就是我们为了偷懒或者想不出好的名字时,直接使用内建函数或者内建模块的名字来命名,例如:

id = 5

len = 3

list = [ 1, 2, 3]

str = “jack”

以上几个变量名都是系统内建函数名称,一旦被你自己的变量名占用后,后面要使用该函数时直接报错

str( 1)

TypeError: 'str’object isnotcallable

最佳的命名方式要做到见名知义,避免与内建函数冲突,如果实在想不到更好的名字,可以考虑加下划线

id_ = 5length = 3numbers = [1,2,3]name = “jack” 3、变量作用域

你第一次碰到下面这段代码的时候,可能你会很惊讶,这怎么会报错?

a = 1

deffun():

a += 2

print(a)

fun()

报 UnboundLocalError 错误

UnboundLocalError: local variable ‘a’ referenced before assignment

规则:

  1. 如果变量在函数中被引用没有被赋值,那么就是全局变量
  2. 如果变量在函数的任意位置被赋予过新的值,那么该变量就是局部变量
  3. 如果变量在函数中重新赋予了值,又希望是全部变量,则需要用关键字 global 修饰该变量

a = 1

deffun():

globala

a += 2

print(a)

fun() 4、使用可变对象作为默认参数

这个例子可能你在其他地方有看过,如果面试官问题,为什么会这样的时候,你是否能答出来。

deffunc(i=0, nums=[]):

nums.append(i)

print(i)

print(nums)

func(i= 1)

func(i= 1)

输出结果

1

[ 1]

1

[ 1, 1]

一个函数调用两次,结果却不一样,这是什么原因?初学者以为这是 Python 的 bug,其实这是陷阱,函数自身也是对象,默认参数会作为该函数对象的两个属性存在。类似于:func.i, func.nums。函数创建之后,nums 已经有一个默认值 [],第一次调用时,相当于 func.nums.append(1), 第二次调用相当于 func.nums.append(2),因为列表是可变对象,所以,每调用一次,就往列表里面增加了一个元素。

正确的实现方法是:

deffunc(i=0, nums=None):

ifnums isNone:

nums = []

nums.append(i)

print(i)

print(nums)

func(i= 1)

func(i= 1) 5、 不使用列表推导式

将一个列表中的所有元素做平方处理,普通的做法就是新建一个列表,逐个迭代计算出每个值的平方,再加入到新数组中。喜欢装X的可能会把代码写的巨难懂,各种技巧都给你用上,最后只为实现一个简单的需求。90% 的情况下,列表推导式可以代替 map、filter 函数。

普通写法

items = [1, 2, 3, 4, 5]squared = []for i in items: squared.append(i**2)

装B写法

items = [1, 2, 3, 4, 5]squared = list(map(lambda x: x**2, items))

最佳写法

items = [ 1, 2, 3, 4, 5]

squared = [x** 2forx initems] 6、不使用 enumerate 函数获取列表元素下标索引

在某些场景,不可避免需要用到列表元素中的下标索引位置,一般程序员的做法就是按照最原始C语言的写法

普通写法

color = [ “red”, “blue”, “green”]

fori inrange(len(color)):

print(i, color[i])

装B写法

color = [ “red”, “blue”, “green”]

fori, item inzip(range(len(color)), color):

print(i, item)

最佳写法

color = [ “red”, “blue”, “green”]

fori, item inenumerate(color):

print(i, item) 7、使用 from xxx import *

偷懒的程序员喜欢直接 import * ,虽然能节省一些代码,但是 import *里面隐藏着一些潜在的危险。如果 a,b 两个包里面都有一个叫做 foo 的模块,那么其中一个就会被覆盖。正确的做法就是显示地把需要用到的模块 import 进来,如果遇到重名的模块,则用 as 将其重命名。

froma importfoo asfoo_a

fromb importfoo asfoo_b 8、使用Python2.X

Python2.7 在2020年官方不再维护,现在都2019年了,所以如果你的系统特别是新系统还用Python2.7的话,不失为最差的开发实践,所以,赶紧升级到Python3.6吧

Python最差实践相关推荐

  1. 【Python】远离 Python 最差实践,避免挖坑

    原文链接:http://blog.guoyb.com/2016/12/03/bad-py-style/ 最近在看一些陈年老系统,其中有一些不好的代码习惯遗留下来的坑:加上最近自己也写了一段烂代码导致服 ...

  2. 【2020新书】Python Pro专业实践原则,Practices of the Python Pro,250页pdf

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 转自:专知 Manning2020新书<Practices of the Pyt ...

  3. python如何导入txt数据集-终于找到python入门到实践数据集

    Python是一款功能强大的脚本语言,具有丰富和强大的库,重要的是,它还具有很强的可读性,易用易学,非常适合编程初学者入门.以下是小编为你整理的python入门到实践数据集 环境配置:下载Python ...

  4. python机器学习及实践_Python机器学习及实践

    Python机器学习及实践/Chapter_1/.ipynb_checkpoints/Chapter_1.1-checkpoint.ipynb Python机器学习及实践/Chapter_1/.ipy ...

  5. 《Python数据科学实践指南》——0.2节如何成为数据科学家

    本节书摘来自华章社区<Python数据科学实践指南>一书中的第0章,第0.2节如何成为数据科学家,作者纪路,更多章节内容可以访问云栖社区"华章社区"公众号查看 0.2 ...

  6. Python基础项目实践之:学生信息管理系统

    Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...

  7. python基础项目实践之: 学生通讯录管理系统

    Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...

  8. Python基础项目实践之:面向对象方法模拟简单计算器

    Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...

  9. Python基础项目实践之:面向对象方法实现模拟银行管理系统

    Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...

最新文章

  1. 学习笔记——Java
  2. Android动画 详解(一 补间动画)
  3. 如何用Postman做接口测试
  4. 链表(单链表、双链表、内核链表)
  5. android html转pdf工具,android – 使用iText库将html转换为pdf时未应用hr的内联CSS
  6. jQuery学习笔记02:核心部分
  7. java addslashes_PHP防止注入攻击
  8. 使用webpack 打包出错[webpack-cli] TypeError: Cannot read property ‘tap‘ of undefined
  9. 左右c++与java中国的垃圾问题的分析与解决
  10. 技术,要拿得起,更要放得下
  11. Kubernetes 系统强化 Pod安全策略 PSP
  12. 怎么通过创新再造58
  13. 会员管理系统单机版哪里有?
  14. 郝斌JAVASE大纲
  15. 项目管理体制改革的经验和成效(转)
  16. android Room框架学习
  17. vue-baidu-map添加覆盖物-点
  18. 浅谈触摸屏技术以及未来的发展趋势
  19. 微服务轮子项目(45) -Jenkins自动化部署
  20. C语言读写ini、json、csv文件

热门文章

  1. 3D 机器视觉 02 - FPGA生成N位元格雷码
  2. 设置网页打开默认全屏_微信公众号里的视频不能进行全屏播放的解决方法
  3. html2canvas截图地图和看到的不一样_认知高度不同的人,看到的世界是不一样的...
  4. mysql 密码eba_MySQL-体系结构及授权管理
  5. CentOS7安装 MySQL主从集群
  6. html5 打包ios.上架,iOS帮客户打包App上架的正确姿势
  7. python 数据分析 实际案例_python在实际工作中运用的案例
  8. virtualenv environment怎么选_2020年阿里云双11内容安全怎么选? - 云计算分享家
  9. php中的rand,php rand() 随机数生成的方法介绍
  10. 模拟实现请求分页虚存页面替换算法_河北串口屏厂家:玻璃清洗机触摸屏实现数据交互功能...