在编程过程中,多了解语言周边的一些知识,以及一些技巧,可以让你加速成为一个优秀的程序员。
对于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. 漂亮胜于丑陋 实现一个功能:读取一列数据,只...
数据库往往都很大,并将大量时间浪费在数据库的连接/认证等"意义重大"的事情上,像DNS查询、编码与解码、内存分配等等。在应用提速的压力下,我尝试过使用Python和多种工具的综合使用。我并不迷信微软的ASP,又被...
现在采用 TMIDIX 改进了 MuseNet 多乐器 TXT 编码的再现 原始基线性能音乐 AI 实现:Optimus-VIRTOOSO 这是一种自回归实现(基于字符的方法),有其优点但也有缺点。然而,这是最有趣、最灵活、最通用的实现,它允许...
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)组成,而像素又由八位表示。我们的目标是修改“最低有效位” ,这样就不会引起太大的注意。 这种...
CodeINN为开发人员提供了完美的环境 :man::laptop: ,编码员 :laptop: 和极客 :nerd_face: 用他们的技术做更多的事情。 查看托管版本 特征 用于Web开发,编程和减价的单一平台,而无需不断切换工具 实时预览代码...
我希望在我刚开始成为一名程序员时就知道的事情。 我不是专家。 实际上远非如此。 但是我有两个优点: 我在大学里大部分时间都逃课——这意味着我几乎所有关于 CS/编程的知识都是自学的。 这意味着我是通过偶然发现...
添加额外的代码(例如,使数据中的内容可视化,从文件中导入数据而不是对其进行硬编码等)。 摆脱Docker。 为了使事情变得更容易,某些食谱使用了预先构建的Docker映像。 但是,我相信当他们自己设置一些东西时,...
分形压缩在1990年代是一件很重要的事情,但是后来业界对它的兴趣减弱了,而诸如JPEG之类的计算密集型格式盛行。 分形压缩是一个非常不对称的过程,其中编码非常昂贵,解码非常简单。 当时(仍然是),我对这个想法...
它可能在某些或多个已经编写了特定蜘蛛的网站上开箱即用(请参阅下文),但是请注意,网页抓取工具本质上有些脆弱:它们取决于每个网站的基本格式和结构页,当这些更改时,它们往往会断裂。 尽管RISJbot的后备抓取...
该程序适用于在观看视频,玩游戏或在PC上进行任何操作时需要提醒自己做一些重要事情的人。 特征 我尝试将很多功能编码到该程序中,到目前为止,它具有: 能够导出和导入您的设置(提醒) 在启动时自动启动的能力...
cc2是适用于Windows和MacOS的易于使用的视频编码器。 假设您需要将.mp4视频作为.webm和.ogv ? 在小的文件中,没有质量损失吗? 只需将视频拖放到预定义的文件夹中,便会看到神奇的事情发生。 安装 最简单的入门...
为了使事情在新文件系统上运行,我使用的数据文件的新路径必须进行硬编码。它所调用的脚本和函数已被很好地记录下来,并且应该具有很强的自我解释性。 生成的图应全部贴好标签,并且无需说明即可解释。 另外,请注意...
自述文件注意:这是一个WIP,但是鉴于已经在使用此数据,因此我认为很有可能我们会做一些有意义的事情...用法: 会是这样的: node main.js pgdb pgusername应该提示输入密码并清除数据库应该根据选项填充缓存中的...
这是Chris Albon收集的有关编码,统计信息,机器学习和技术管理的个人笔记。 这些说明在公开发布。 此回购中的内容对其他人不会有用。 总览 笔记的主记录可以是Jupyter Notebook或Markdown文件。 这些文件位于...
多尺度图灵图案,彩色。 这个项目很旧,我在2011年就完成了,所以我可能不记得所有事情了。 最初,我看到一些作品时就受到了... 请注意,我早在几年前就参与了这个项目,但是值得庆幸的是,我似乎写了一些非常详细的文
3.5.4 Python、Lua、更多 65 第4章 前Windows 时代 67 4.1 386保护模式 68 4.2 VGA 到VESA 70 4.2.1 超越 BGI 70 4.2.2 VGA 72 4.2.3 VESA 标准 72 4.2.4 花絮 74 4.3 保护模式下的开发工具 75 4.4 闲话 Allegro 81 ...
3.5.4 Python、Lua、更多 65 第4章 前Windows 时代 67 4.1 386保护模式 68 4.2 VGA 到VESA 70 4.2.1 超越 BGI 70 4.2.2 VGA 72 4.2.3 VESA 标准 72 4.2.4 花絮 74 4.3 保护模式下的开发工具 75 4.4 闲话 Allegro 81 ...
简而言之:Feign能干Ribbon和Hystrix的事情,但是要用Ribbon和Hystrix自带的注解必须要引入相应的jar包才可以。 3)Spring Cloud Bus Spring Cloud Bus 将分布式系统的节点通过轻量级消息代理连接起来。用于在集群...
通过这样的途径当你更换使用的数据库时,可以轻松的更改编码以适应这样的变化。PHPLIB就是最常用的可以提供一般事务需要的一系列基库。 - 可扩展性 就像前面说的那样,PHP已经进入了一个高速发展的时期。对于一个...