在编程过程中,多了解语言周边的一些知识,以及一些技巧,可以让你加速成为一个优秀的程序员。
对于Python程序员,你需要注意一下本文所提到的这些事情。 你也可以看看Zen of Python(Python之禅),这里面提到了一些注意事项,并配以示例,可以帮助你快速提高。
1. 漂亮胜于丑陋
实现一个功能:读取一列数据,只返回偶数并除以2。下面的代码,哪个更好一些呢?
halve_evens_only = lambda nums: map(lambda i: i/2, filter(lambda i: not i%2, nums))
VS
def halve_evens_only(nums):
return [i/2 for i in nums if not i % 2]
2. 记住Python中非常简单的事情
# 交换两个变量
a, b = b, a
# 切片(slice)操作符中的step参数。(切片操作符在python中的原型是[start:stop:step],即:[开始索引:结束索引:步长值])
a = [1,2,3,4,5]
>>> a[::2] # 遍历列表中增量为2的数据
[1,3,5]
# 特殊情况下,`x[::-1]`是实现x逆序的实用的方式
>>> a[::-1]
[5,4,3,2,1]
# 逆序并切片
>>> x[::-1]
[5, 4, 3, 2, 1]
>>> x[::-2]
[5, 3, 1]
3. 不要使用可变对象作为默认值
def function(x, l=[]): #不要这样
def function(x, l=None): # 好的方式
if l is None:
l = []
这是因为当def声明被执行时,默认参数总是被评估。
4. 使用iteritems而不是items
iteritems 使用generators ,因此当通过非常大的列表进行迭代时,iteritems 更好一些。
d = {1: "1", 2: "2", 3: "3"}
for key, val in d.items() # 当调用时构建完整的列表
for key, val in d.iteritems() # 当请求时只调用值
5. 使用isinstance ,而不是type
# 不要这样做
if type(s) == type(""): ...
if type(seq) == list or \
type(seq) == tuple: ...
# 应该这样
if isinstance(s, basestring): ...
if isinstance(seq, (list, tuple)): ...
原因可参阅:stackoverflow
注意我使用的是basestring 而不是str,因为如果一个unicode对象是字符串的话,可能会试图进行检查。例如:
>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False
这是因为在Python 3.0以下版本中,有两个字符串类型str 和unicode。
6. 了解各种容器
Python有各种容器数据类型,在特定的情况下,相比内置容器(如list 和dict ),这是更好的选择。
我敢肯定,大部分人不使用它。我身边一些粗心大意的人,一些可能会用下面的方式来写代码。
freqs = {}
for c in "abracadabra":
try:
freqs[c] += 1
except:
freqs[c] = 1
也有人会说下面是一个更好的解决方案:
freqs = {}
for c in "abracadabra":
freqs[c] = freqs.get(c, 0) + 1
更确切来说,应该使用collection 类型defaultdict。
from collections import defaultdict
freqs = defaultdict(int)
for c in "abracadabra":
freqs[c] += 1
其他容器:
namedtuple() # 工厂函数,用于创建带命名字段的元组子类
deque # 类似列表的容器,允许任意端快速附加和取出
Counter # dict子类,用于哈希对象计数
OrderedDict # dict子类,用于存储添加的命令记录
defaultdict # dict子类,用于调用工厂函数,以补充缺失的值
7. Python中创建类的魔术方法(magic methods)
__eq__(self, other) # 定义 == 运算符的行为
__ne__(self, other) # 定义 != 运算符的行为
__lt__(self, other) # 定义 < 运算符的行为
__gt__(self, other) # 定义 > 运算符的行为
__le__(self, other) # 定义 <= 运算符的行为
__ge__(self, other) # 定义 >= 运算符的行为
8. 必要时使用Ellipsis(省略号“...”)
Ellipsis 是用来对高维数据结构进行切片的。作为切片(:)插入,来扩展多维切片到所有的维度。例如:
>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)
# 现在,有了一个4维矩阵2x2x2x2,如果选择4维矩阵中所有的首元素,你可以使用ellipsis符号。
>>> a[..., 0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
# 这相当于
>>> a[:,:,:,0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
原文:a few things to remember while coding in python
分享到:
相关推荐
对于Python程序员,你需要注意一下本文所提到的这些事情。你也可以看看Zen of Python(Python之禅),这里面提到了一些注意事项,并配以示例,可以帮助你快速提高。 1. 漂亮胜于丑陋 实现一个功能:读取一列数据,只...
### Python中读写文件及中文编码处理方法 ...通过以上介绍可以看出,在Python中读写文件以及处理中文编码并不是一件复杂的事情,只要掌握了基本的方法和技巧,就能够轻松应对各种场景下的文件操作需求。
于是就有两个组织,他们开始着手做这件事情,UCS和Unicode诞生了。 6. CodePage CodePage,代码页,把一种字符编码方式(和字符集有区别,稍后讲解)放在一个CodePage上,编码解码就像翻书查字典似的。 7. Python...
在Python2中编码是一个很让人头痛的事情,但Python3就不用过多考虑了 包管理: * 构建合理的包层次来管理Module 模块导入: * 有节制的使用from…import语句,防止污染命名空间 * 优先使用absolute import来导入...
数据库往往都很大,并将大量时间浪费在数据库的连接/认证等"意义重大"的事情上,像DNS查询、编码与解码、内存分配等等。在应用提速的压力下,我尝试过使用Python和多种工具的综合使用。我并不迷信微软的ASP,又被...
- 函数应该具有单一职责,只做一件事情,并且做得好。 6. **模块化设计**:强调将相关功能组织到单独的模块中的重要性。 - 模块化可以提高代码的复用性,降低维护成本。 #### 第2章:编程习惯与技巧 7. **使用...
- 类的设计应遵循单一职责原则,每个类只做一件事情。 - 尽量减少类的成员变量,尽可能使用私有成员,仅通过公共接口暴露必要的行为。 - 对象间的关系应清晰,尽量减少强耦合。 5. **作用域**(scoping.html):...
现在采用 TMIDIX 改进了 MuseNet 多乐器 TXT 编码的再现 原始基线性能音乐 AI 实现:Optimus-VIRTOOSO 这是一种自回归实现(基于字符的方法),有其优点但也有缺点。然而,这是最有趣、最灵活、最通用的实现,它允许...
在编程世界中,编码实践是提升软件质量、可读性和可维护性的重要环节。本文将深入探讨Python编程语言中的编码实践,旨在帮助开发者...通过深入研究和实践,你可以不断提升你的Python编码技巧,编写出更加优秀的代码。
需要注意的是,确保你的Python环境已经配置了pip,并且版本与文件所支持的Python版本匹配。 "appel_geocode"库的具体功能和用法,由于信息有限,我们无法深入探讨。但根据其名字,我们可以推测它可能提供了一种接口...
32位系统下python3.3 程序打包成exe文件, python3.3 cx_freeze-4.3.3 installer ended prematurely because of an error. your system has not been modified 第二步:如果安装正确,那么接下来的事情就非常简单...
iStegIO iStegIO是一种易于使用的python脚本/程序,用于在PNG图片中隐藏文本消息。图片或图片主要由像素(r,g,b)组成,而像素又由八位表示。我们的目标是修改“最低有效位” ,这样就不会引起太大的注意。 这种...
11. **Unicode编码**:Python 3默认处理字符串为Unicode,但在处理文件或网络数据时要注意编码问题,避免乱码。 12. **迭代器耗尽**:迭代器一旦遍历完,就无法再次使用。使用`itertools.islice()`或重新生成迭代器...
在异步I/O中,当等待Socket读写时,程序可以去做其他事情,而不是简单地阻塞。 例如,使用Python的asyncio库编写异步HTTP客户端: ```python import asyncio import aiohttp async def fetch(session, url): ...
CodeINN为开发人员提供了完美的环境 :man::laptop: ,编码员 :laptop: 和极客 :nerd_face: 用他们的技术做更多的事情。 查看托管版本 特征 用于Web开发,编程和减价的单一平台,而无需不断切换工具 实时预览代码...
我希望在我刚开始成为一名程序员时就知道的事情。 我不是专家。 实际上远非如此。 但是我有两个优点: 我在大学里大部分时间都逃课——这意味着我几乎所有关于 CS/编程的知识都是自学的。 这意味着我是通过偶然发现...
1. 每当执行一个类似 requests.get() 的调用时,实际上发生了两件事情:首先,构建了一个 Request 对象;其次,当从服务器获得响应时,生成了一个 Response 对象。 2. Request 对象包含用于构建请求的所有信息,...
- 遵循单一职责原则(SRP),一个类或方法只做一件事情。 - 使用适当的设计模式,如工厂模式、观察者模式等,提高代码复用性和可扩展性。 4. **错误处理** - 代码中应有恰当的异常处理,避免异常未捕获导致程序...
添加额外的代码(例如,使数据中的内容可视化,从文件中导入数据而不是对其进行硬编码等)。 摆脱Docker。 为了使事情变得更容易,某些食谱使用了预先构建的Docker映像。 但是,我相信当他们自己设置一些东西时,...