Python心得--如何提高代码质量

简介:

  前些日子用python基于prometheus开发了一个vsphere volume卷监控的exporter,于是跟vsphere的api(pyvmomi)接口打上了交道,开发的过程中你会发现pyvmomi的接口返回的对象好多列表类型的,当你取其中一个对象的时候可能需要进行多层的循环遍历。于是促使了我写这一篇文章,记录一下在使用python搬砖过程中的一些心得体会。如有错误,欢迎大家指正。

3f2d0000b47b43cd60e1

Python里面所谓高质量的代码,我自己理解的主要是两方面。一是编写具有python风格的代码,即所谓的Pythonic;二是代码的执行效率。Python的执行效率一直被人诟病,这点我承认,但我更认同的一种说法是“编程语言本身没有好坏,关键在于使用者的使用方法是否恰当。”

以下是个人总结的,在python编程过程中常见的几点提高代码质量的方法:

  1. 变量的赋值

1
2
3
4
5
6
7
8
9
10
In [11]: a, b = 10, 50  # 赋值写在一行
In [12]: a
Out[12]: 10
In [13]: b
Out[13]: 50
In [14]: a, b = b, a  # a, b互换
In [15]: a
Out[15]: 50
In [16]: b
Out[16]: 10

变量交换的时候尽量避免使用中间变量增加开销。

2. 列表推导提高效率和可读性

如下生成一个新的列表:

1
2
In [17]: [n  for  in  range(10)]
Out[17]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

另一方面,列表推导也可能被滥用。通常的原则是,只用列表推导来创建新的列表并且尽量保持简短。 如果列表推导的代码超过了两行,你可能就要考虑是不是得用 for 循环重写了。就跟写文章一样,并没有什么硬性的规则,这个度需要自己把握。

3. 列表和字典的迭代

列表使用enumerate() 获取list的索引和值,字典使用iteritems方法获取索引和值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
In [18]: l1 = [n  for  in  range(10)]
In [21]:  for  k,  v  in  enumerate(l1):
....: print k,  v
....:
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
In [23]: dict1 = { 'a' :1,  'b' :2,  'c' :3,  'd' :4}
In [24]: dict1
Out[24]: { 'a' : 1,  'b' : 2,  'c' : 3,  'd' : 4}
In [25]:  for  k,  v  in  dict1.iteritems():
....: print k,  v
....:
a 1
c 3
b 2
d 4

4. 使用三元表达式进行条件赋值

三元表达式允许用简单的一行快速判断,而不是使用复杂的多行if语句,可以使代码简单、可维护。

1
2
3
4
In [26]: 1  if  5>3  else  0
Out[26]: 1
In [27]: 1  if  5>8  else  0
Out[27]: 0

举一个在实际生产中运用列表推导和三元表达式结合使用的例子:

1
2
dc_list = [datacenter  for  datacenter  in  root_folder.childEntity  if  isinstance(
datacenter, vim.Datacenter)]

这里生成了一个名为dc_list的列表,首先在"root_folder.childEntity"中遍历出datacenter,接着判断这个datacenter是否是一个"vim.Datacenter"的实例,如果为真,加入到dc_list列表中,最终返回该datacenter列表。

5. 使用 with 自动关闭资源

对文件操作完成后应该立即关闭它们,因为打开的文件不仅会占用系统资源,而且可能影响其他程序或者进程的操作,甚至会导致用户期望与实际操作结果不一致。

1
2
3
4
5
6
7
In [5]: with  open ( '111.py' 'rb' ) as  file :
...:  for  line  in  file :
...: print line
...:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
print  "name is %s"  % __file__

6. 使用yield

这里有一个生成斐波那契数列的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
In [8]: def fab(n):
...: a, b = 0, 1
...:  for  in  xrange(n):
...: yield b
...: a, b = b, a + b
...:
In [9]: fab(20)
Out[9]: <generator object fab at 0x1092975a0>
In [10]:  for  in  fab(20):
....: print n
....:
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765

可以看出一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

7. 减少循环内部执行的计算

优化python循环的关键一点,是要减少Python在循环内部执行的工作量。

1
2
3
4
5
6
In [30]: a = range(10000)
In [31]: size_a = len(a)
In [32]: %timeit -n 1000  for  in  a: k = len(a)
1000 loops, best of 3: 658 μs per loop
In [33]: %timeit -n 1000  for  in  a: k = size_a
1000 loops, best of 3: 304 μs per loop

8. 字符串连接优先使用"join",而不是“+”

1
2
3
In [42]: letter = [ 'a' 'b' 'c' 'd' ]
In [43]: print  '' . join (letter)
abcd

9. None类型判断

不要使用‘==’ None的形式:

1
2
if  foo == None:
do_something()

正确用法:

1
2
if  not foo:
do_something()

3f290002e2c8e4c5f747

10. “过早的优化是万恶之源”

最后不得不提一下这句话,借用一下别人的诠释:

1
2
3
4
Make it Work.
Make it Right.
Make it Fast.
不要跳过前面两个直奔第三个!






      本文转自Jx战壕  51CTO博客,原文链接:http://blog.51cto.com/xujpxm/1971832,如需转载请自行联系原作者


相关文章
|
2天前
|
设计模式 缓存 监控
Python中的装饰器:代码的魔法增强剂
在Python编程中,装饰器是一种强大而灵活的工具,它允许程序员在不修改函数或方法源代码的情况下增加额外的功能。本文将探讨装饰器的定义、工作原理以及如何通过自定义和标准库中的装饰器来优化代码结构和提高开发效率。通过实例演示,我们将深入了解装饰器的应用,包括日志记录、性能测量、事务处理等常见场景。此外,我们还将讨论装饰器的高级用法,如带参数的装饰器和类装饰器,为读者提供全面的装饰器使用指南。
|
2天前
|
存储 算法 搜索推荐
Python高手必备!揭秘图(Graph)的N种风骚表示法,让你的代码瞬间高大上
在Python中,图作为重要的数据结构,广泛应用于社交网络分析、路径查找等领域。本文介绍四种图的表示方法:邻接矩阵、邻接表、边列表和邻接集。每种方法都有其特点和适用场景,掌握它们能提升代码效率和可读性,让你在项目中脱颖而出。
13 5
|
2天前
|
数据库 Python
异步编程不再难!Python asyncio库实战,让你的代码流畅如丝!
在编程中,随着应用复杂度的提升,对并发和异步处理的需求日益增长。Python的asyncio库通过async和await关键字,简化了异步编程,使其变得流畅高效。本文将通过实战示例,介绍异步编程的基本概念、如何使用asyncio编写异步代码以及处理多个异步任务的方法,帮助你掌握异步编程技巧,提高代码性能。
11 4
|
3天前
|
缓存 开发者 Python
探索Python中的装饰器:简化和增强你的代码
【10月更文挑战第32天】 在编程的世界中,简洁和效率是永恒的追求。Python提供了一种强大工具——装饰器,它允许我们以声明式的方式修改函数的行为。本文将深入探讨装饰器的概念、用法及其在实际应用中的优势。通过实际代码示例,我们不仅理解装饰器的工作方式,还能学会如何自定义装饰器来满足特定需求。无论你是初学者还是有经验的开发者,这篇文章都将为你揭示装饰器的神秘面纱,并展示如何利用它们简化和增强你的代码库。
|
2天前
|
API 数据处理 Python
探秘Python并发新世界:asyncio库,让你的代码并发更优雅!
在Python编程中,随着网络应用和数据处理需求的增长,并发编程变得愈发重要。asyncio库作为Python 3.4及以上版本的标准库,以其简洁的API和强大的异步编程能力,成为提升性能和优化资源利用的关键工具。本文介绍了asyncio的基本概念、异步函数的定义与使用、并发控制和资源管理等核心功能,通过具体示例展示了如何高效地编写并发代码。
10 2
|
4天前
|
机器学习/深度学习 自然语言处理 API
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程。通过简单的代码示例,展示如何将文本转换为自然流畅的语音,适用于有声阅读、智能客服等场景。
21 3
|
6天前
|
设计模式 缓存 测试技术
Python中的装饰器:功能增强与代码复用的艺术####
本文将深入探讨Python中装饰器的概念、用途及实现方式,通过实例演示其如何为函数或方法添加新功能而不影响原有代码结构,从而提升代码的可读性和可维护性。我们将从基础定义出发,逐步深入到高级应用,揭示装饰器在提高代码复用性方面的强大能力。 ####
|
4天前
|
算法 IDE API
Python编码规范与代码可读性提升策略####
本文探讨了Python编码规范的重要性,并深入分析了如何通过遵循PEP 8等标准来提高代码的可读性和可维护性。文章首先概述了Python编码规范的基本要求,包括命名约定、缩进风格、注释使用等,接着详细阐述了这些规范如何影响代码的理解和维护。此外,文章还提供了一些实用的技巧和建议,帮助开发者在日常开发中更好地应用这些规范,从而编写出更加清晰、简洁且易于理解的Python代码。 ####
|
7天前
|
缓存 测试技术 数据安全/隐私保护
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第29天】本文通过深入浅出的方式,探讨了Python装饰器的概念、使用场景和实现方法。文章不仅介绍了装饰器的基本知识,还通过实例展示了如何利用装饰器优化代码结构,提高代码的可读性和重用性。适合初学者和有一定经验的开发者阅读,旨在帮助读者更好地理解和应用装饰器,提升编程效率。
|
14天前
|
开发者 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第22天】在Python的世界里,装饰器是一个强大的工具,它能够让我们以简洁的方式修改函数的行为,增加额外的功能而不需要重写原有代码。本文将带你了解装饰器的基本概念,并通过实例展示如何一步步构建自己的装饰器,从而让你的代码更加高效、易于维护。
下一篇
无影云桌面