如何写出更好的Python代码?这是Python软件基金会的建议

论坛 期权论坛 期权     
真格量化   2019-7-9 09:21   3809   0
1.可变与不可变类型(Mutable and immutable types)


Python有两种内置或用户定义的类型。

可变类型是允许就地修改内容的类型。典型的可变类型是列表和词典:所有列表都有变异方法,如 list.append()或list.pop(),并且可以在适当的位置进行修改。词典也是如此。


不可变类型不提供改变其内容的方法。例如,设置为整数6的变量x没有“增量”方法。如果要计算x + 1,则一般需要创建另一个整数变量并为其指定名称。


比如,我们想得到一个由0到19这些数字拼接而成的字符串,我们可以对比以下的写法:

我们可以体会一下这Best这招,选择是使用map函数,它可以将内置函数类型str映射到迭代器range。这会生成一个map对象,然后就可以像其他示例一样join。在某些情况下,map函数甚至可能比列表理解更快,更简洁。


2.一行一个语句(One statement per line)


每一行一个语句,尤其在复杂的逻辑表达式的时候,这样会清晰很容易阅读。









虽然列表推导等一些复合语句因其简洁性和表达性而被允许和赞赏,但在同一行代码上有两个脱节语句是不好的做法。


3.使用显式代码(Explicit code)


Python因为提供了很多灵活的编码选择,有的时候滥用一些“黑魔法”,过度的使用技巧而反而失去了代码本身的直观性。

字典对象的更新有几种方法,dict(locals)本意是想生成一个新的字典返回。在上面的好代码中,显式地从调用者接收x和y,并返回显式字典。使用此函数的开发人员通过读取第一行和最后一行就能确切地知道函数要做什么,而不是像坏例子的那种情况,比较晦涩难懂,不够直接。


4.控制返回值(Returning values)


关于返回值的处理
当函数的复杂性增加时,在函数体内使用多个return语句并不罕见。但是,为了保持清晰的意图和可持续的可读性水平,最好避免从函数体内的许多输出点返回有意义的值。


在函数中返回值有两种主要情况:函数在正常处理时返回的结果,以及指示错误输入参数的错误情况(比如我们没有取到历史数据)或函数无法完成其计算的任何其他原因或任务。

当一个函数在其正常过程中有多个主要出口时,调试返回的结果变得很困难,因此最好保留一个退出点。这也将有助于分解一些代码路径,如果函数有多个出口点,说明我们的代码可能进一步的重构。


5.解包提取元素(Unpacking)


如果知道列表或元组的长度,则可以通过解压缩为其元素指定名称。比如enumerate()将为列表中的每个项提供两个元素的元组,一个下标一个值:


for index, item in enumerate(some_list):
# do something with index and item


也可以使用它来交换变量:
a, b = b, a




嵌套解包也适用Py3.x:
a, (b, c) = 1, (2, 3)
a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]
a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4


6.在集合中搜索元素(Searching for an item in a collection)


有时我们需要搜索一系列的东西。让我们看看两个选项:列表和集合。


以下面的代码为例:


s = set([ s , p , a , m ])
l = [ s , p , a , m ]


def lookup_set(s):
     return s in s


def lookup_list(l):
     return s in l




虽然两个函数看起来代码都相同,但因为lookup_set利用了Python中的集合是哈希表的事实,两者之间的查找性能是非常不同的,集合有远高于列表的查找性能。


要确定项目是否在列表中,Python必须遍历每个项目,直到找到匹配的项目。


这个过程很费时,特别是对于长列表。另一方面,在集合中项目的哈希将告诉Python在集合中的哪个位置寻找匹配项目。因此,即使集合很大,也可以快速完成搜索。


7.检查变量是否等于常数(Check if variable equals a constan)


我们不需要显式地将值与True或None或空进行比较 - 我们只需将其添加到if语句即可。

8.访问字典元素(Access a Dictionary Element)


不要使用判断dict.has_key()方法。相反使用语法或传递默认参数 比如x in dict ,dict.get(k,default_value)





9.过滤列表元素(Filtering a list)
过滤列表坏的不良方法,也是初学者经常会犯的错误。

好的做法是使用filter函数,从Python 3.0开始,该filter()函数返回迭代器而不是列表。如果你真的需要一个列表,前面加一个list()即可。



10.读取文件(Read From a File)


使用正确的方法从文件中读取数据,这将自动为您关闭文件,建议使用with open。





11.处理长代码(Line Continuations)


当我们的逻辑代码行长于可接受的限制时(PEP8规定是79个字符),需要将其拆分为多个物理行。


如果行的最后一个字符是反斜杠,Python解释器将连接连续的行。这在某些情况下很有用,但通常应该避免,因为它的脆弱性。


在反斜杠之后添加到行尾的空格会破坏代码并可能产生意外结果。



更好的做法是在元素周围使用括号。在行尾留下一个未闭合的括号,Python解释器将加入下一行,直到括号被关闭。对于大括号和方括号,同样的行为也适用。




希望通过对些代码细节的改善,我们的策略代码性能和可读性能够进一步提升。

内容来源:https://edisciplinas.usp.br/pluginfile.php/3252433/mod_resource/content/1/b_python_guide-docs.pdf

— — — — — — E N D — — — — — —
往期文章:
Numpy处理tick级别数据技巧
真正赚钱的期权策略曲线是这样的
多品种历史波动率计算
如何实现全市场自动盯盘
AI是怎样看懂研报的
真格量化策略debug秘籍
真格量化对接实盘交易
常见高频交易策略简介

如何用撤单函数改进套利成交

Deque提高处理队列效率

策略编程选Python还是C++

如何用Python继承机制节约代码量

十大机器学习算法
如何调用策略附件数据

如何使用智能单

如何扫描全市场跨月价差

如何筛选策略最适合的品种

活用订单类型规避频繁撤单风险

真格量化回测撮合机制简介

如何调用外部数据

如何处理回测与实盘差别

如何利用趋势必然终结获利

常见量化策略介绍

期权交易“七宗罪”

波动率交易介绍

推高波动率的因素

波动率的预测之道

趋势交易面临挑战
如何构建知识图谱
机器学习就是现代统计学

AI技术在金融行业的应用

如何避免模型过拟合

低延迟交易介绍

架构设计中的编程范式

交易所视角下的套利指令撮合

距离概念与特征识别

气象风险与天气衍生品

设计量化策略的七个“大坑”

云计算在金融行业的应用

机器学习模型评估方法
真格量化制作期权HV-IV价差
另类数据介绍

TensorFlow中的Tensor是什么?

机器学习的经验之谈

用yfinance调用雅虎财经数据

容器技术如何改进交易系统
Python调用C++
如何选择数据库代理
统计套利揭秘
[h1]一个Call搅动市场?让我们温习一下波动率策略[/h1][h1]如何用真格量化设计持仓排名跟踪策略[/h1][h1]还不理解真格量化API设计?我们不妨参考一下CTP平台[/h1][h1]理解同步、异步、阻塞与非阻塞[/h1][h1]隐波相关系数和偏度——高维风险的守望者[/h1]Delta中性还不够?——看看如何设计Gamma中性期权策略
[h1]Python的多线程和多进程——从一个爬虫任务谈起[/h1]线程与进程的区别皮尔逊相关系数与历史K线匹配
Python2和Python3的兼容写法Python代码优化技巧
理解Python的上下文管理器
[url=http://mp.weixin.qq.com/s?__biz=MzU4OTg0NjkyOA==&mid=2247484143&idx=1&sn=ada4798da2ab523d2fe2cacfa1ac8e6a&chksm=fdc60210cab18b067df920123b9337c324d0eefd17c4780feaa62a1e68220739388c7e9f1a4b&scene=21#wechat_redirect][/url]



真格量化可访问:
https://quant.pobo.net.cn


真格量化微信公众号,长按关注:

遇到了技术问题?欢迎加入真格量化Python技术交流QQ群  726895887



内容




















































分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:870
帖子:180
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP