编写python代码时的注意事项及运行时的常见错误

本文探讨了Python编程中需要注意的事项和运行时的常见错误。强调了编写简洁清晰代码的重要性,建议先确保代码可行再进行优化。在编写过程中,应注意语法错误、代码结构和命名规范。在运行时,常见的错误包括命名错误、语法错误、类型错误、索引错误、缩进错误等,以及如何排查和避免这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、编写代码时:
(一)首先做到细心,避免出现的语法错误(少标点符号或者没用英文状态下的标点等);
(二)牢记简约而清晰的理念。

(1)编写一个文档,正确的路径是:
不要一开始就企图编写完美无缺的代码。自定义工作流程时,先尽可能在一个文件中完成所有的工作。确定一切都能正常运行后,再决定是对其做进一步改进。先让代码可行,再让代码有序。
改进时:
a.可将完成大部分工作的代码都移到函数或者类,并储存在独立模块中(注意储存在同一模块中的类和函数数量不受限制,但应存在某种相关性),这会让主程序更清晰。将函数或类储存在独立的文件(模块)中,导入该模块,你依然可以使用其所有功能,只要他们能像你希望的那样工作,你就可以不管这些文件,而专注于主程序的高级逻辑了。如果喜欢模块和文件的交互方式,可在项目开始时就尝试将类存储到模块中。
b.当然主程序的结构也要考虑是否合理,具体的代码内容是够还需要改进.
这里针对的是程序的整体结构(整体的工作路径是否合理及是否还能优化)
以及具体内容,比如while,if结构,for结构的应用,有时候还要考虑到元组,列表,字典甚至单个变量的应用。

(对这一部分应该还需要再学习数据结构和算法才能有进一步了解。)

为了与其他程序员合作,你还应该编写并及时更新注释(针对函数、文档内部的某一代码块,用#)及文档字符串(用三个引号,针对于描述某个模块,函数及整个文档的作用P154)。

(2)编写其中的某一部分模块,路径应是:
同样不要一开始就企图编写完美无缺的代码;不要一开始就设置过分复杂的代码结构或者考虑太多的特殊情况。先考虑大部分的普遍现象,对其编写行之有效的代码,再决定是对其做进一步改进,还是转而去编写新代码。
改进(重构)时要考虑下面abc三点:

首先说一下重构的含义(P183下):
重构是指:代码能够正确的运行,但可做进一步的改进——将代码划分为一系列完成具体工作的函数的过程。重构让代码更清晰、更易于理解、更容易扩展

a.是否已将情况都考虑全面,如何合理地将遗漏情况加进去;
(P183下的例题中:重构时依次将没有考虑进去的问题考虑上:新注册用户和已经注册的老用户。其实我觉得这两点在一开始编写时就该考虑进去,这个还是比较简单容易想到的。但是如果提前就考虑多种情况,写代码时的难度会加大,思路要十分清楚。如果实在混乱写不下去,不要忘记还可以回到这里,先考虑最通常的情况,再将特殊情况一个一个的加进去。)

b.以及函数结构是否还能优化,如何优化;
这里针对的是函数体中的具体内容,比如while,if结构,for结构的应用,有时候还要考虑到元组,列表,字典甚至单个变量的应用。(对这一部分应该还需要再学习数据结构和算法才能有进一步了解。)

c.每个函数完成的任务等是否还需要再进行拆分。(重构的结果)

(P185)在重构得到的最终版本中,每个函数都执行单一而清晰的任务。
要编写出清晰而易于维护和扩展的代码,这种划分工作必不可少。

注意:(P128下)使用函数时的一种理念:即每个函数都应只负责一项具体的工作,这优于使用一个函数来完成两项或多项工作。编写函数时,如果你发现它执行的任务太多了,请尝试将这些代码划分到两个函数中去,这有助于我们将复杂的任务划分成一系列的步骤便于我们解决问题。

为了与其他程序员合作,你还应该使用描述性的函数名及描述性的的变量名,还应该编写并及时更新注释(针对函数、文档内部的某一代码块,用#)及文档字符串(用三个引号,针对于描述某个模块,函数及整个文档的作用P154)。

(三)程序员的目标之一就是:编写简单的代码来完成任务。(这就需要用到函数,类等。)

《Python编程从入门到实践》P29 Python之禅:牢记简约而清晰的理念。经验丰富的程序员倡导尽可能避繁就简。编程是要解决问题的,设计良好、高效而漂亮的解决方案都会让程序员心生敬意。如果有两个解决方案,一个简单,一个复杂,但都行之有效,就选择简单的解决方案吧。这样,你编写的代码将更容易维护,你或他人以后改进这些代码时也会更容易。现实是复杂的,有时候可能没有简单的解决方案。在这种情况下,就选择最简单可行的解决方案吧。即便是复杂的代码,也要让它易于理解。开发的项目涉及复杂代码时,一定要为这些代码编写有益的注释。

如果让两名Python程序员去解决同一个问题,他们提供的解决方案应大致相同。这并不是说编程没有创意空间,而是恰恰相反!然而,大部分编程工作都是使用常见解决方案来解决简单的小问题,但这些小问题都包含在更庞大、更有创意空间的项目中。在你的程序中,各种具体细节对其他Python程序员来说都应易于理解。
你可以将余生都用来学习Python和编程的纷繁难懂之处,但这样你什么项目都完不成。不要企图编写完美无缺的代码;先编写行之有效的代码,再决定是对其做进一步改进,还是转而去编写新代码。

研究更复杂的主题时,务必牢记这种简约而清晰的理念。如此,经验丰富的程序员定将对你编写的代码心生敬意,进而乐意向你提供反馈,并与你合作开 发有趣的项目。

(四)我们在编写程序时,经常需要命名方法和变量。
(1)首先,在大的逻辑上你要清楚,自己每个变量的意义和参与的过程,不能混乱,这是最基本的。

(2)其次(来自于知乎https://www.zhihu.com/question/27097399/answer/78619944,@unbug的回答)
平时命名时的步骤应该是:1.查单词;2. 比较单词语义,比较近义词;3. 比较代码上下文,Google一下与我们期望表达的关联性;4.确定命名。

但总会有词穷的时候,所以要多积累经验。堆经验是很慢长的过程且是很笨的,但没有捷径,只能靠多看书和源码。参与的越多经验自然就越多,找个大型的开源项目参与翻译文档是个不错的开始,但如果你并不用到这个项目或者说这个项目与你当前从事的领域关联不大,收效并不明显。因为缺乏实践。

但平时我们只要把这上面四个步骤缩短就能节省大量时间。
CODELF 就是帮我们缩短这些步骤的一个变量名搜索工具,网址:https://unbug.github.io/codelf/
CODELF支持直接搜索中文,当你查中文的时候,Codelf 会直接查好单词和单词的近义词给你,然后再搜索Github, Bitbucket, Google Code, Codeplex, Sourceforge, Fedora Project上的开源项目的源码匹配出与这些词汇相关的变量名和函数名。

Codelf 可以选择开发语言进行搜索,结果会把同个源码文件里匹配的变量名排在一起
在这里插入图片描述
点一下语言,你可以立即查看对应的源码,多少能学习到别人的设计,如果代码的业务与自己相投,对梳理自己的业务是有帮助的。:
在这里插入图片描述
在这里插入图片描述

(3)最后,是变量命名时的一些规则:
①要具有描述性,这是最基本的要求;

②是驼峰体studentNumber还是下划线student_number?变量名称多用下划线;
注意:只能以下划线,数字和字母组成。不可以是特殊字符(*,^,……),空格也不可以。
不能以数字开头
不能以大写开头,Python程序员为了区分经常用大写的名字表示自己定义的常量
(其实python中不区分变量和常量,所有的变量都是可变的。一般规定,全部大写的变量名代表常量。)

③不能以中文为变量名,也不要以拼音为变量名(中文的二意性不可忽视,最经典的二意性,我去,和我去(去字拉长音就不是一个意思了)。
程序的命名要尽量避免二意性,这样可以提高可读性,过长无法命名时分析其主要作用,用主要作用来命名,同时辅助完整注释给排错和修改提供便利。另外当你发现一个函数命名过长其实这是这个函数实现太多功能导致,尝试分函数来写也是一种策略。(来自知乎https://www.zhihu.com/question/27097399/,@ming yang)
④保留字符不可以被使用(如print等)

另外,关于python中带下划线的变量和函数的意义可见链接文章中的总结:https://blog.youkuaiyun.com/ai_s_ye/article/details/44685139

(五)注意《Python编程从入门到实践》P152:当你进入了程序员的另一个境界:解决上述问题,你从较高的逻辑层面(而不是语法层面)考虑;你考虑的不是Python,而是如何使用代码来表示实物。到达这种境界后,你经常会发现,现实世界的建模方法并没有对错之分。有些方法的效率更高,但要找出效率最高的表示法,需要经过一定的实践。只要代码像你希望的那样运行,就说明你做得很好!即便你发现自己不得不多次尝试使用不同的方法来重写类,也不必气馁;要编写出高效、准确的代码,都得经过这样的过程。

二,python运行时的常见错误
1,命名错误 NameError. P17
2,语法错误 SyntaxError. P22
所有代码中的标点符号都不能用中文状态下的
定义函数中指定形参的默认值,必须将该形参放在最后,否则会出现语法错误P118-119
导入模块时,出现的编码错误:
①Windows的记事本和pycharm(UTF8)不互相兼容,如果将windows的文本文档.txt改为.py作为模块导入就会出现语法中的编码错误互不兼容
在这里插入图片描述
②解决办法是:从notepad++中保存为py文件,并当做模块导入即可
3,类型错误 TypeError. P25
例如:字符串和数值类型错误;
符号的使用错误,如圆括号与方括号:列表后面指定元素用方括号;函数后面指定元素用圆括号。
修改了元组中的元素–P59
4,索引错误 IndexError. P42 差一错误,多出现在列表的引用中。
出现索引错误,可尝试将其列表或长度打印出来。
5,缩进错误 IndentationError. P47
忘记缩进
不必要的缩进
6,逻辑错误(属于5)
忘记缩进额外的代码行
循环后不必要的缩进
7,单字符错误。
难以发现,意料之外。寻找这种错误,花费的时间难以估计。
!一定要细心
如:for循环后忘记加冒号;
列表中各元素之间,或多个函数参数之间错用了逗号以外的其他符号(也可能是类型错误)

6,属性错误 AttributeError
比如将函数参数在后面括号中的写到了前面,
如: list.sort(),而不是sort(list)
list.sort(reverse=True),而不是sort(list,reverse=True)
sorted(list),而不是list.sorted()
sorted(list,reverse=True),而不是list.sorted(reverse=True)
即sort的列表要在前面指定,后面括号里的是参数;而sorted的列表和参数都应该写在后面的括号中。
(疑问:为什么会有函数间列表指定位置,及参数指定位置(如sort与len)的不同?
7,值错误 ValueError P102下笔记
如使int()函数接受了浮点型字符串数据(直接接受:比如直接输入 ‘5.18’ 这样的数据;间接接触:比如在回应input函数时输入了浮点型数字,而后面又有int的操作 )
8, 许可错误PermissionError P165上
如果open函数中的路径没有写到具体的文件及后缀,就会出现这样的错误

在这里插入图片描述
9,ValueError: I/O operation on closed file. 值错误:对已关闭文件执行I/O操作。P314上,下

课本P166中,其实应该加上一个词“文件内容”,变为:使用关键字with时,open()返回的文件对象 及 read()或reader()函数的读取的 文件内容 只在with代码块内可用。

如果要在with代码块外访问文件内容,需要对文件内容进行二次加工,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表。

但是在P314上,可以不用缩进for遍历:因为在for循环中使用的是既不是文件对象 f 也不是整体的文件内容reader,而是对文件内容操作返回的部分文件内容对象header_row,是通过对文件内容的二次加工形成的。

而在P314下,必须要缩进for遍历:因为在for循环中运用的是文件的整体内容reader.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值