点击关注我哦

一篇文章带你使用正确姿势避坑 Python 中的6个典型错误

Python是一种高级的动态脚本语言。它易于使用的特性使得它非常流行,并且在最近几年得到了扩展。易用性也从易滥用开始。我们列出了初学者在编写python程序时可能犯的典型错误。

1:用isinstance代替type

type和isinstance均可用于验证Python对象类型。但是,这是一个显着的区别:在解决对象类型时,isinstance确保继承,而type则不保证继承。而且它可能不是您经常要用于实例的对象。请参考下图:

def the_number_type(num):if isinstance(num, int):print('Integer')else:raise TypeError('Not an integer')the_number(False)  # prints 'Integer', that is incorrect

上面,由于bool是Python中int的子类,因此isinstance(num,int)也被视为True,这不是我们想要的。对于这种特殊情况,使用type是正确的方法。在此处详细了解这两种方法的行为差异。

2:可变的默认参数

在Python中,有两种类型的对象。在运行时,可变对象可以更改其状态或内容,而不可变对象则不能。大多数内置对象类型都是不可变的,包括int,float,string,bool和tuple。

执行函数定义后,将检查默认的Python参数一次。这意味着在定义函数时仅对表达式进行一次检查,并且对于每个后续调用都使用相同的值。但是,如果您更改了可变的默认参数(列表,字典等),则所有后续调用都会更改它。

错误:

def add_element(new_element, elements=[]):elements.append(new_element)

正确:

def add_element(new_element, elements=None):if elements is None:elements = []elements.append(new_element)

3:Raising NotImplemented

这是相同命名可能误导开发人员的一种情况。NotImplementedError是一个异常类,如果需要派生类,则应创建该类以重写方法。NotImplemented是用于二进制运算符的常量。引发NotImplemented时将创建TypeError。

错误:

class SalesOfficer(item):def get_image_tracking_code(self):raise NotImplemented

正确:

class SalesOfficer(item):def get_image_tracking_code(self):raise NotImplementedError

4:不必要的lambda表达式

Python中的函数是一等公民。这意味着您可以将其指定给某个变量,将其作为参数传递给另一个函数,等等。对于其他编程语言的初学者或开发人员来说,这可能是违反直觉的。

一个典型的例子如下:

def request(self, method, **kwargs):# ...if method not in ("get", "post"):req.get_method = lambda: method.upper()# ...

编写此代码的正确方法是:

def request(self, method, **kwargs):# ...if method not in ("get", "post"):req.get_method = method.upper

5:不会使用迭代器

每个Python初学者都会这样做,而不管他们在其他编程语言方面的专业知识如何。没有例外。

使用列表list_,您将如何使用for循环依次访问列表中的项目?我们知道Python列表已建立索引,因此我们可以使用list_ [i]访问第i个项目。然后,我们可以为for循环构建一个从0到len(list_)范围内的整数的Iterator,如下所示:

for i in range(len(list_)):foo(list_[i])

这确实起作用。没有代码问题。这也是用其他语言构造for循环的一种常用方法。但是在Python中,我们有更好的方法。

通过利用Python的iterable标识,开发人员可以创建更简便的代码:

for item in list_:foo(item)

6:  使用全局变量

全局变量在主脚本中作为变量名列出,而局部变量在具有局部作用域的函数中作为变量名列出。使用Python的global关键字,您可以在本地访问全局变量,并在函数中进行本地修改。下面是一个典型的例子:

k = 1 # a variable    def add1():k+= 1return kdef add2():global k# can make changes to global variable "k"k+= 1 return kadd1()  # UnboundLocalError: local variable 'k' referenced before assignment
add2() # returns 2

虽然许多新手喜欢它,因为似乎使用Global可以避免传递函数的所有参数。但实际上这是不对的。它只是掩盖了行为。

global的使用也不利于调试。函数应该作为块框架处理,并且应该是可重用的。更改全局变量的函数可能很难检测到主脚本的副作用,并且可能会触发复杂的意大利面式的代码,从而使调试更加困难。

更改全局变量是局部函数中有缺陷的编程方法。您可以将变量作为参数传递,更改并在函数末尾返回。

结论

这还远远不够,因为互联网上几乎没有任何完整的常见错误列表。我希望这篇文章向您展示了您正在处理的至少一个Python常见错误,并希望它能够使您编写正确而直观的代码。

·  END  ·

HAPPY LIFE

正确姿势避坑 Python 中的6个典型错误相关推荐

  1. python中常见的几种错误

    python中常见的几种错误: 1.end前面一定加逗号 2.命令输入错误 3.冒号中英文切换 4.命令缩进错误 5.等于号要双等于,否则一个等于号是赋值 6.命令之间正确搭配

  2. 关于python中的复数类型、下列说法错误的是_关于 Python中的复数,下列说法错误的是( )_学小易找答案...

    [单选题]下列关于运算符优先级的描述中,错误的是 . [判断题]Java 语言中定义符号常量使用final关键字.( ) [判断题]捕获异常时try语句后面通常跟有一个或多个catch()方法用来处理 ...

  3. python中以下关于列表描述错误的_10. 以下关于列表操作的描述,错误的是:_学小易找答案...

    [单选题]Python 语句 a=121+1.21 print(type(a)) 的输出结果为( ) [单选题]Python语句序列"s1 = [4, 5, 6]; s2 = s1; s1[ ...

  4. python中以下关于列表描述错误的_在Python中,以下关于函数的描述错误的是哪一项?...

    [判断题]Python内置函数len____可以返回列表.元组.字典.集合.字符串以及range对象中元素个数. [判断题]Python内置函数max____用来返回序列中的最大元素. [判断题]Py ...

  5. 关于python语言、下列说法不正确的是-关于Python中的字符串,下列说法错误的是()...

    儿茶味淡五倍子C的药冰片材是金沙.关于海青黛. 祖B宗D帝唐太高宗宋太.中的字符隋汉武.清,中使庙号"的称谓是(用"下列. 正确的是,串错误南和正道主要.道台湾身养省C以修与江性为 ...

  6. python中import cv2遇到的错误及安装方法_独家利用OpenCV,Python和Ubidots来构建行人计数器程序(附代码amp;解析)...

    作者:Jose Garcia 翻译:吴振东 校对:张一豪 本文约4000字,建议阅读14分钟. 本文将利用OpenCV,Python和Ubidots来编写一个行人计数器程序,并对代码进行了较为详细的讲 ...

  7. python中nrows_sheet.nrows有一个错误的值 – python excel文件

    sheet.nrows有一个错误的值 – python excel文件 我有一个很奇怪的问题 我试图从Excel文件中读取一些数据,但属性nrows有一个错误的值. 尽pipe我的文件有很多行,但它只 ...

  8. python中eof表示什么语句错误_python中pickle的EOF错误

    根据这些评论,我对最有可能的问题有一个猜测,但至少有50%的可能性我猜错了,在这种情况下--告诉我,我会删除答案.在 我猜你是在尝试使用流套接字,就好像它是一个消息序列一样.这是网络编程新手中非常常见 ...

  9. Python中fastapi关于异常或者错误的处理

    fastapi关于接口异常或者错误的处理介绍位于:https://fastapi.tiangolo.com/tutorial/handling-errors

最新文章

  1. 全部与精简切换显示jQuery实例教程
  2. 计算机二级c语言题库缩印,2011年9月份计算机二级C语言上机题库(可缩印做小抄)百分百准确...
  3. python 中的接口_python中接口
  4. 通过onActivityResult()先跳转到联系人界面,然后把传回来的手机号显示到应用的EditText上...
  5. 反思本地测试没有问题 但测试服务器存在问题的解决方法:1.文件夹2.分支切换
  6. 反射获取构造方法并使用【应用】
  7. 24dian(牛客多校第三场)
  8. pcb过孔漏铜_【企业资讯】大正瑞地:专注PCB药水二十年,品质、性能可靠
  9. matlab中右三角形方向,《有限元基础教程》_【MATLAB算例】4.7.1(2) 基于3节点三角形单元的矩形薄板分析(Triangle2D3Node)...
  10. 配置 Syslog 守护程序
  11. python怎么写运维脚本_python运维脚本实例
  12. 树大招风:英伟达证实遭遇攻击,核心源代码惨遭泄露,75GB机密数据被公开
  13. 《linux核心应用命令速查》连载八:kill:杀掉进程
  14. 2013年最新省市区三级联动mysql数据库_使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例...
  15. 实时采集Canal快速入门
  16. win10应用商店打不开及打开之后下载失败问题解决方法
  17. 金蝶怎么录入数量金额_金蝶KIS迷你版初始化数量金额怎样录入
  18. 2019中南大学计算机考研分数线,中南大学2019考研分数线已公布
  19. JAVA删除pdf空白页_如何编辑PDF文件,如何删除PDF文档中的空白页
  20. SDN之NOS概述——云原生

热门文章

  1. 2020年高压电工答案解析及高压电工考试平台
  2. java 时间段重叠_java 判断两个时间段是否重叠的案例
  3. 由Debuggerd导致的Android系统死机问题分析
  4. 《Web安全攻防 渗透测试实战指南》学习笔记(2) - Sqlmap
  5. 交易中 你的加仓策略是怎样的?背后的逻辑是什么?
  6. IE浏览器版本判断之 Trident (排版引擎)
  7. php 生成 sitemap,PHP生成SiteMap文件代码的方法
  8. matlab 识别箭头方向,怎么判断箭头方向,求代码。。。
  9. SQL Server 2016 KB2919355 安装失败
  10. iphone11各机型对比_iphone11系列3款新苹果手机有哪些区别?3款新苹果手机对比解析...