`

Python 编码时应该注意的几件事情

阅读更多

在编程过程中,多了解语言周边的一些知识,以及一些技巧,可以让你加速成为一个优秀的程序员。

对于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

20
25
分享到:
评论

相关推荐

    Python编码时应该注意的几个情况

    对于Python程序员,你需要注意一下本文所提到的这些事情。你也可以看看Zen of Python(Python之禅),这里面提到了一些注意事项,并配以示例,可以帮助你快速提高。 1. 漂亮胜于丑陋 实现一个功能:读取一列数据,只...

    python中读写文件及中文编码处理方法.docx

    ### Python中读写文件及中文编码处理方法 ...通过以上介绍可以看出,在Python中读写文件以及处理中文编码并不是一件复杂的事情,只要掌握了基本的方法和技巧,就能够轻松应对各种场景下的文件操作需求。

    Python中文乱码详解参考.pdf

    于是就有两个组织,他们开始着手做这件事情,UCS和Unicode诞生了。 6. CodePage CodePage,代码页,把一种字符编码方式(和字符集有区别,稍后讲解)放在一个CodePage上,编码解码就像翻书查字典似的。 7. Python...

    总结了90条简单实用的Python编程技巧!.docx

    在Python2中编码是一个很让人头痛的事情,但Python3就不用过多考虑了 包管理: * 构建合理的包层次来管理Module 模块导入: * 有节制的使用from…import语句,防止污染命名空间 * 优先使用absolute import来导入...

    Mod_Python 3.2.8中文手册.rar

    数据库往往都很大,并将大量时间浪费在数据库的连接/认证等"意义重大"的事情上,像DNS查询、编码与解码、内存分配等等。在应用提速的压力下,我尝试过使用Python和多种工具的综合使用。我并不迷信微软的ASP,又被...

    编写高质量代码:改善Python代码的91个建议-中文版

    - 函数应该具有单一职责,只做一件事情,并且做得好。 6. **模块化设计**:强调将相关功能组织到单独的模块中的重要性。 - 模块化可以提高代码的复用性,降低维护成本。 #### 第2章:编程习惯与技巧 7. **使用...

    Google 编码风格

    - 类的设计应遵循单一职责原则,每个类只做一件事情。 - 尽量减少类的成员变量,尽可能使用私有成员,仅通过公共接口暴露必要的行为。 - 对象间的关系应清晰,尽量减少强耦合。 5. **作用域**(scoping.html):...

    基于 GPT3 的多乐器MIDI音乐AI实现_python_Jupyter_代码_下载

    现在采用 TMIDIX 改进了 MuseNet 多乐器 TXT 编码的再现 原始基线性能音乐 AI 实现:Optimus-VIRTOOSO 这是一种自回归实现(基于字符的方法),有其优点但也有缺点。然而,这是最有趣、最灵活、最通用的实现,它允许...

    编码实践:代码

    在编程世界中,编码实践是提升软件质量、可读性和可维护性的重要环节。本文将深入探讨Python编程语言中的编码实践,旨在帮助开发者...通过深入研究和实践,你可以不断提升你的Python编码技巧,编写出更加优秀的代码。

    PyPI 官网下载 | appel_geocode-0.1.1-py3-none-any.whl

    需要注意的是,确保你的Python环境已经配置了pip,并且版本与文件所支持的Python版本匹配。 "appel_geocode"库的具体功能和用法,由于信息有限,我们无法深入探讨。但根据其名字,我们可以推测它可能提供了一种接口...

    cx_Freeze-4.3.3.win32-py3.3.msi

    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图像内的文本消息

    iStegIO iStegIO是一种易于使用的python脚本/程序,用于在PNG图片中隐藏文本消息。图片或图片主要由像素(r,g,b)组成,而像素又由八位表示。我们的目标是修改“最低有效位” ,这样就不会引起太大的注意。 这种...

    gotchas:有趣的编程花絮和需要记住的事情

    11. **Unicode编码**:Python 3默认处理字符串为Unicode,但在处理文件或网络数据时要注意编码问题,避免乱码。 12. **迭代器耗尽**:迭代器一旦遍历完,就无法再次使用。使用`itertools.islice()`或重新生成迭代器...

    http 连接 使用socket

    在异步I/O中,当等待Socket读写时,程序可以去做其他事情,而不是简单地阻塞。 例如,使用Python的asyncio库编写异步HTTP客户端: ```python import asyncio import aiohttp async def fetch(session, url): ...

    CodeINN:CodeINN是即时代码编辑器:page_with_curl:,它使编程和开发更加容易。 无需任何设置,即可直接从Web浏览器快速练习。 CodeINN为开发人员技术人员,编码员计算机和极客提供了理想的环境,使他们可以利用自己的技术做更多的事情

    CodeINN为开发人员提供了完美的环境 :man::laptop: ,编码员 :laptop: 和极客 :nerd_face: 用他们的技术做更多的事情。 查看托管版本 特征 用于Web开发,编程和减价的单一平台,而无需不断切换工具 实时预览代码...

    可爱的matlab代码-DocsForBeginners:我希望在我刚开始做程序员时就知道的事情

    我希望在我刚开始成为一名程序员时就知道的事情。 我不是专家。 实际上远非如此。 但是我有两个优点: 我在大学里大部分时间都逃课——这意味着我几乎所有关于 CS/编程的知识都是自学的。 这意味着我是通过偶然发现...

    Requests 2.18.1 文档.pdf

    1. 每当执行一个类似 requests.get() 的调用时,实际上发生了两件事情:首先,构建了一个 Request 对象;其次,当从服务器获得响应时,生成了一个 Response 对象。 2. Request 对象包含用于构建请求的所有信息,...

    华为编程规范

    - 遵循单一职责原则(SRP),一个类或方法只做一件事情。 - 使用适当的设计模式,如工厂模式、观察者模式等,提高代码复用性和可扩展性。 4. **错误处理** - 代码中应有恰当的异常处理,避免异常未捕获导致程序...

    MachineLearningGoogleSeries:此库包含运行Google系列所有机器学习食谱示例所需的所有源代码-Source code learning

    添加额外的代码(例如,使数据中的内容可视化,从文件中导入数据而不是对其进行硬编码等)。 摆脱Docker。 为了使事情变得更容易,某些食谱使用了预先构建的Docker映像。 但是,我相信当他们自己设置一些东西时,...

Global site tag (gtag.js) - Google Analytics