送你90条写Python程序的建议

嵌入式ARM 2021-05-15 14:00


自己写 Python 也有四五年了,一直是用自己的“强迫症”在维持自己代码的质量。都有去看Google的Python代码规范,对这几年的工作经验,做个简单的笔记,如果你也在学pythpn,准备要学习python,希望这篇文章对你有用。


   1.首先

建议1、理解Pythonic概念—-详见Python中的《Python之禅》

建议2、编写Pythonic代码

(1)避免不规范代码,比如只用大小写区分变量、使用容易混淆的变量名、害怕过长变量名等。有时候长的变量名会使代码更加具有可读性。

(2)深入学习Python相关知识,比如语言特性、库特性等,比如Python演变过程等。深入学习一两个业内公认的Pythonic的代码库,比如Flask等。

建议3:理解Python与C的不同之处,比如缩进与{},单引号双引号,三元操作符?,Switch-Case语句等。

建议4:在代码中适当添加注释

建议5:适当添加空行使代码布局更加合理

建议6:编写函数的4个原则

(1)函数设计要尽量短小,嵌套层次不宜过深

(2)函数声明应该做到合理、简单、易用

(3)函数参数设计应该考虑向下兼容

(4)一个函数只做一件事,尽量保证函数粒度的一致性

建议7:将常量集中在一个文件,且常量名尽量使用全大写字母


   2.编程惯用法

建议8:利用assert语句来发现问题,但要注意,断言assert会影响效率

建议9:数据交换值时不推荐使用临时变量,而是直接a, b = b, a

建议10:充分利用惰性计算(Lazy evaluation)的特性,从而避免不必要的计算

建议11:理解枚举替代实现的缺陷(最新版Python中已经加入了枚举特性)

建议12:不推荐使用type来进行类型检查,因为有些时候type的结果并不一定可靠。如果有需求,建议使用isinstance函数来代替

建议13:尽量将变量转化为浮点类型后再做除法(Python3以后不用考虑)

建议14:警惕eval()函数的安全漏洞,有点类似于SQL注入

建议15:使用enumerate()同时获取序列迭代的索引和值

建议16:分清==和is的适用场景,特别是在比较字符串等不可变类型变量时(详见评论)

建议17:尽量使用Unicode。在Python2中编码是很让人头痛的一件事,但Python3就不用过多考虑了

建议18:构建合理的包层次来管理Module


   3.基础用法

建议19:有节制的使用from…import语句,防止污染命名空间

建议20:优先使用absolute import来导入模块(Python3中已经移除了relative import)

建议21:i+=1不等于++i,在Python中,++i前边的加号仅表示正,不表示操作

建议22:习惯使用with自动关闭资源,特别是在文件读写中

建议23:使用else子句简化循环(异常处理)

建议24:遵循异常处理的几点基本原则

(1)注意异常的粒度,try块中尽量少写代码

(2)谨慎使用单独的except语句,或except Exception语句,而是定位到具体异常

(3)注意异常捕获的顺序,在合适的层次处理异常

(4)使用更加友好的异常信息,遵守异常参数的规范

建议25:避免finally中可能发生的陷阱

建议26:深入理解None,正确判断对象是否为空。

建议27:连接字符串应优先使用join函数,而不是+操作

建议28:格式化字符串时尽量使用.format函数,而不是%形式

建议29:区别对待可变对象和不可变对象,特别是作为函数参数时

建议30:[], {}和():一致的容器初始化形式。使用列表解析可以使代码更清晰,同时效率更高

建议31:函数传参数,既不是传值也不是传引用,而是传对象或者说对象的引用

建议32:警惕默认参数潜在的问题,特别是当默认参数为可变对象时

建议33:函数中慎用变长参数 args和 kargs

(1)这种使用太灵活,从而使得函数签名不够清晰,可读性较差

(2)如果因为函数参数过多而是用变长参数简化函数定义,那么一般该函数可以重构

建议34:深入理解str()和repr()的区别

(1)两者之间的目标不同:str主要面向客户,其目的是可读性,返回形式为用户友好性和可读性都比较高的字符串形式;而repr是面向Python解释器或者说Python开发人员,其目的是准确性,其返回值表示Python解释器内部的定义

(2)在解释器中直接输入变量,默认调用repr函数,而print(var)默认调用str函数

(3)repr函数的返回值一般可以用eval函数来还原对象

(4)两者分别调用对象的内建函数 __str__ ()和 __repr__ ()

建议35:分清静态方法staticmethod和类方法classmethod的使用场景


   4.库的使用


建议36:掌握字符串的基本用法

建议37:按需选择sort()和sorted()函数

sort()是列表在就地进行排序,所以不能排序元组等不可变类型。

sorted()可以排序任意的可迭代类型,同时不改变原变量本身。

建议38:使用copy模块深拷贝对象,区分浅拷贝(shallow copy)和深拷贝(deep copy)

建议39:使用Counter进行计数统计,Counter是字典类的子类,在collections模块中

建议40:深入掌握ConfigParse

建议41:使用argparse模块处理命令行参数

建议42:使用pandas处理大型CSV文件

Python本身提供一个CSV文件处理模块,并提供reader、writer等函数。

Pandas可提供分块、合并处理等,适用于数据量大的情况,且对二维数据操作更方便。

建议43:使用ElementTree解析XML

建议44:理解模块pickle的优劣

优势:接口简单、各平台通用、支持的数据类型广泛、扩展性强

劣势:不保证数据操作的原子性、存在安全问题、不同语言之间不兼容

建议45:序列化的另一个选择JSON模块:load和dump操作

建议46:使用traceback获取栈信息

建议47:使用logging记录日志信息

建议48:使用threading模块编写多线程程序

建议49:使用Queue模块使多线程编程更安全


   5.设计模式
建议50:利用模块实现单例模式
建议51:用mixin模式让程序更加灵活
建议52:用发布-订阅模式实现松耦合
建议53:用状态模式美化代码

   6.内部机制

建议54:理解build-in对象

建议55:__init__ ()不是构造方法,理解 __new__ ()与它之间的区别

建议56:理解变量的查找机制,即作用域

局部作用域

全局作用域

嵌套作用域

内置作用域

建议57:为什么需要self参数

建议58:理解MRO(方法解析顺序)与多继承

建议59:理解描述符机制

建议60:区别 __getattr__ ()与 __getattribute__ ()方法之间的区别

建议61:使用更安全的property

建议62:掌握元类metaclass

建议63:熟悉Python对象协议

建议64:利用操作符重载实现中缀语法

建议65:熟悉Python的迭代器协议

建议66:熟悉Python的生成器

建议67:基于生成器的协程和greenlet,理解协程、多线程、多进程之间的区别

建议68:理解GIL的局限性

建议69:对象的管理和垃圾回收


   7.使用工具辅助项目开发

建议70:从PyPI安装第三方包

建议71:使用pip和yolk安装、管理包

建议72:做paster创建包

建议73:理解单元测试的概念

建议74:为包编写单元测试

建议75:利用测试驱动开发(TDD)提高代码的可测性

建议76:使用Pylint检查代码风格

代码风格审查

代码错误检查

发现重复以及不合理的代码,方便重构

高度的可配置化和可定制化

支持各种IDE和编辑器的集成

能够基于Python代码生成UML图

能够与Jenkins等持续集成工具相结合,支持自动代码审查

建议77:进行高效的代码审查

建议78:将包发布到PyPI


   8.性能剖析与优化

建议79:了解代码优化的基本原则

建议80:借助性能优化工具

建议81:利用cProfile定位性能瓶颈

建议82:使用memory_profiler和objgraph剖析内存使用

建议83:努力降低算法复杂度

建议84:掌握循环优化的基本技巧

减少循环内部的计算

将显式循环改为隐式循环,当然这会牺牲代码的可读性

在循环中尽量引用局部变量

关注内层嵌套循环

建议85:使用生成器提高效率

建议86:使用不同的数据结构优化性能

建议87:充分利用set的优势

建议88:使用multiprocessing模块克服GIL缺陷

建议89:使用线程池提高效率

建议90:使用Cythonb编写扩展模块


END

来源:网络

版权归原作者所有,如有侵权,请联系删除。

推荐阅读
你怎样选择开源免费RTOS?
GD32也开始假货翻新泛滥了
工程师姓什么很重要!别再叫我“X工”!!!


→点关注,不迷路←
嵌入式ARM 关注这个时代最火的嵌入式ARM,你想知道的都在这里。
评论 (0)
  • 安装Ubuntu后,可能会影响到Windows 10的启动方式,特别是在使用双系统引导时。这可能是导致您无法通过按F8进入安全模式的原因。以下是一些可能的原因和解决方法:启动管理器更改:安装Ubuntu后,GRUB或其他启动管理器可能成为默认的启动引导程序。这些启动管理器可能不会像Windows那样响应F8键进入安全模式的指令。快速启动功能:Windows 10的“快速启动”功能可能会影响您进入安全模式的能力。当启用快速启动时,系统会跳过某些启动步骤,这可能会阻止您通过F8进入安全模式。系统文件
    丙丁先生 2024-03-19 08:54 21浏览
  • RD-03E_V1.0的使用手册包含设备的基本功能、硬件规格、软件配置和安装条件等详细信息。以下是一些可能包含在手册中的关键信息:基本功能:介绍RD-03E的主要功能和技术特点,例如精准测距或手势识别能力。硬件规格:提供RD-03E模块的详细硬件参数,包括尺寸、接口类型、电气特性等。软件配置:说明如何进行软件设置,包括固件升级、参数调整等操作指南。安装条件:描述模块的工作环境要求,如温度范围、湿度限制等。烧录说明:指导如何使用支持的工具(如keil 5 IDE)和烧录器(如CMSIS-DAP、J
    丙丁先生 2024-03-16 12:54 76浏览
  • 总结:科普量子计算机的水书。至少第一章是在科普量子计算机。唯一有点用的就是我上面这一张照片里面的笔记。上面说了为什么量子计算机会比传统计算机运算速度快的原因:因为传统计算机一位只能有一个数字,但是量子计算机可以0和1叠加起来显示。这样就造成了传统计算机需要运行很多遍的东西,而量子计算机不管多少多难都只用计算一次。(前提是量子比特位够长)---------------------------------------------------------------------------------
    youyeye 2024-03-17 17:04 125浏览
  • 汽车氛围灯,顾名思义,是烘托车内氛围的照明灯,是汽车内饰情感化设计的一种体现。 一般有暖色(红色等)和冷色系(蓝色、紫色等)两种,在夜晚开启后绚丽浪漫,可营造车内情调,使得旅途并不是那么的枯燥无味,让人们拥有独特的驾驶体验。关于汽车氛围灯浪涌保护上海雷卯EMC小哥分析难点有以下几个方面:1. 复杂的电气环境:汽车的电气系统较为复杂,存在各种干扰源,如点火系统、电机、电子设备等,这可能会对氛围灯的浪涌保护造成挑战。2. 电压波动:汽车运行过程中,电源电压可能会出现较大的波动,例如启动引擎或电器设备
    上海雷卯电子 2024-03-16 13:51 82浏览
  • 使美国在21世纪保持安全,美国防部发布最新投资战略,12项领先发展科技,两项是传感器技术!近日(3月8日),美国国防部官网公布了《2024财年投资战略》(INVESTMENT STRATEGY FOR THE OFFICE OF STRATEGIC CAPITAL),确定了战略资本办公室(OSC)重点关注的优先关键组件技术行业投资战略,这是美国最新重量级投资计划。2022 年 12 月,美国国防部长劳埃德·奥斯汀三世 (Lloyd J. Austin III) 启动了战略资本办公室 (OSC),
    传感器专家网 2024-03-18 19:31 24浏览
  • 导读:相信使用过PCAN工具的朋友都知道虹科PCAN-View这款免费软件,它具有直观的用户界面,可以实时监测和分析CAN总线上的数据帧,并提供过滤、发送和报文记录。但你知道吗?它其实不只是简单收发报文,虹科PCAN-View还能自动检测和报告CAN总线上的错误帧,帮助用户快速发现和解决通信问题。无论是在汽车、工业自动化还是嵌入式系统领域, 虹科PCAN-View都是一个功能丰富且广泛应用的工具,为用户优化CAN总线系统的性能和提升通信的可靠性提供了极大的帮助。本文带你一起走进这些功能细节,深入
    虹科汽车智能互联 2024-03-18 13:54 109浏览
  • 来源:虹科汽车电子 虹科技术 | PCAN View功能细讲:从实时监测到错误帧分析原文链接:https://mp.weixin.qq.com/s/yOonZ5NqSCnKjURr9hNC6A欢迎关注虹科,为您提供最新资讯!#PCAN #CAN总线 #工业通讯导读相信使用过PCAN工具的朋友都知道虹科PCAN-View这款免费软件,它具有直观的用户界面,可以实时监测和分析CAN总线上的数据帧,并提供过滤、发送和报文记录。但你知道吗?它其实不只是简单收发报文,虹科PCAN-View还能自动检测和报
    虹科电子科技 2024-03-18 15:48 94浏览
  • 导读:网关设备是确保数据流畅通信的关键。虹科PCAN系列网关凭借卓越性能和创新技术,为众多应用提供了高效稳定的解决方案。本文将深入探讨虹科PCAN系列网关内部存储空间,特别是EEPROM和SPI Flash的配置与利用,并解析如何通过C编程实现快速实时的信号存读。通过虹科PCAN-Router FD的实例,我们将展示这些存储空间如何助力网关设备在复杂环境中保持卓越性能。一、网关内部存储空间概览网关的内部存储空间经过精心设计,旨在满足快速、稳定的数据处理需求。除了常规的RAM外,虹科PCAN系列网
    虹科汽车智能互联 2024-03-18 13:56 89浏览
  • 艾迈斯欧司朗全新“样片申请”小程序,逾160种LED、传感器、多芯片组合等产品样片一触即达。轻松3步完成申请,境内免费包邮到家!本期推荐艾迈斯欧司朗首款支持UV-A辐射、环境光闪烁检测功能的微型环境光传感器TSL2585。TSL2585尺寸小巧,采用L2.0mm xW1.0mm xH0.35mm 6引脚OLGA超薄封装,非常适用于可穿戴设备以及手机等这类产品尺寸和厚度受到限制的应用。基于先进的干涉滤光技术,TSL2585的每一个感光像素上都精确沉积了特定光学设计的滤光膜,整体约5µm厚,由60多
    艾迈斯欧司朗 2024-03-18 18:35 94浏览
  • 直流电机是现代社会中无处不在的动力装置,但它们也不是永远运转的机器。让我们一起来了解一下,为什么直流电机会失效,以及我们可以采取哪些措施来延长它们的寿命。  1. 人为因素的影响: 操作失误是直流电机失效的一个重要因素。粗暴地操控电机,比如不小心让它掉落或者使用不当,都可能导致内部零件的损坏,从而使电机无法正常工作。此外,静电放电也是一个需要重视的问题,特别是对于无刷电机而言。静电放电可能会损坏电机内部的传感器,进而影响其控制与反馈系统。 2. 环境因素的考量: 环境条件对直流电
    艾迈斯电子 2024-03-16 11:29 73浏览
  • 1. 整流桥功能介绍整流桥在电子领域中扮演着至关重要的角色,为各种电子设备和电路提供了稳定的电源。整流桥的主要作用是将交流电信号转换为直流电信号。当交流电信号通过整流桥时,它会使得只有一个方向的电流能够通过,从而实现了将交流电信号转换为单向的直流电信号。在一些手持设备需要小巧轻便的整流桥来将交流电转换为直流电。医疗器械:一些便携式医疗器械或医疗监测设备,由于需要经常携带和移动,通常采用小体积的整流桥设计。智能家居产品:如智能插座、智能灯具等,由于需要集成在家居环境中,因此需要小体积的整流桥来满足
    上海雷卯电子 2024-03-16 14:07 102浏览
  • 电脑上的很多东西都是赚钱的手段,知道了就轻松自在。如果你在Win10、11等安装应用程序,出现:应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行sxstrace.exe工具。你各种删除再安装,清理注册表,各种残留清理,各种模块开关设置、甚至重装系统,都不行,你可以考虑安装一下:通过微软网站:Microsoft visual C++ 2005Microsoft visual C++ 2008因为微软自带系统没有这两个基础程序,旧的应用程序多数要用的
    老黄姓黄 2024-03-17 15:59 184浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦