原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/

上一篇:翻译《Writing Idiomatic Python》(二):函数、异常

下一篇:翻译《Writing Idiomatic Python》(四):字典、集合、元组

2.1 变量

2.1.1 对多个变量要赋同一个值时,使用链式赋值让语句变得简明

Python支持链式赋值使多个变量可以在一次链式赋值中被设置为同一个值,这使得语句更加简明。

不良风格:

 x = 'foo'
y = 'foo'
z = 'foo'

地道Python:

 x = y = z = 'foo'

2.1.2 避免使用临时变量来实现值交换

在Python中完全没有必要使用一个额外的临时变量来实现值交换。使用元组来实现不仅方便并且可读性更强。

不良风格:

 foo = 'Foo'
bar = 'Bar'
temp = foo
foo = bar
bar = temp

地道Python:

 foo = 'Foo'
bar = 'Bar'
(foo, bar) = (bar, foo)

2.2 字符串

2.2.1 对字符串相关的函数使用链式调用使意图更简明

当对某个字符串数据进行一系列的处理时,直接在上一个调用后接下一个调用常常比起创建一系列临时变量的方法更加明确和简单。当然,如果链式调用太多也会破坏可读性,一般来说如果操作不超过三个使用链式调用会更好。

不良风格:

 book_info = ' The Three Musketeers: Alexandre Dumas'
formatted_book_info = book_info.strip()
formatted_book_info = formatted_book_infor.upper()
formatted_book_info = formatted_book_infor.replace(':', 'by')

地道Python:

 book_info = ' The Three Musketeers: Alexandre Dumas'
formatted_book_info = book_info.strip().upper().replace(':', 'by')

2.2.2 使用''.join连接列表中的字符串元素

这样做更快,占用更低内存,并且这个用法在Python中非常普遍。注意下面的例子中使用的是用''连接字符串,实际在使用的时候可以替换为你想要的分隔符。

不良风格:

 result_list = ['True', 'False', 'File not found']
result_string = ''
for result in result_list:
result_string += result

地道Python:

 result_list = ['True', 'False', 'File not found']
result_string = ''.join(result_list)

2.2.3 使用ord获取字符的ASCII码,使用chr从ASCII码获取字符

获取一个字符的ASCII码是一个有用的功能(比如字符串散列化),相应的,从ASCII得到对应的字符也常常很有用。

Python中提供了两个内建的函数,chrord,可以实现字符和ASCII码之间的相互转化。

不良风格:

 hash_value = 0
character_hash = {
'a': 97,
'b': 98,
'c': 99,
# ...
'y': 121,
'z': 122,
}
for e in some_string:
hash_value += character_hash[e]
return hash_value

地道Python:

 hash_value = 0
for e in some_string:
hash_value += ord(e)
return hash_value

2.2.4 用format函数来进行字符串格式化

一般来说又三种方式来进行字符串格式化:最简单但是最不推荐的就是用+来连接字符串。另一种方式是老式的利用%来格式化字符串的办法,在其他许多语言中也能看到这种方式,比如一些语言中的printf。这种方法比用+的方法好一些。

在Python中,最地道和清晰的用法当属用format函数来进行字符串格式化。和老式的格式化方法类似,这种办法用带有格式的字符串作为模板并用一些值替换占位符生成最终字符串。比老式的格式化方法更好的地方是,在format函数中,我们可以命名占位符,获取占位符的对应变量的属性,控制字符宽度和填充等。format函数让字符串格式化显得简明。

不良风格:

 def get_formatted_user_info_worst(user):
# Tedious to type and prone to conversion errors
return 'Name: ' + user.name + ', Age: ' + str(user.age) + ', Sex: ' + user.sex def get_formatted_user_info_slightly_better(user):
# No visible connection between the format string placeholders
# and values to use. Also, why do I have to know the type?
# Don't these types all have __str__ functions?
return 'Name: %s, Age: %i, Sex: %c' % (user.name, user.age, user.sex)

地道Python:

 def get_formatted_user_info(user):
# Clear and concise. At a glance I can tell exactly what
# the output should be. Note: this string could be returned
# directly, but the string itself is too long to fit on the
# page.
output = 'Name: {user.name}, Age: {user.age}, Sex: {user.sex}'.format(user=user)
return output

2.3 列表

2.3.1 使用列表解析从一个列表生成新的列表

在恰当使用的情况下,列表解析会增加代码从一个列表中创建新列表的明确性。尤其是当新创建的列表是源列表的某种变换或者条件检查时。

除了使代码更清晰,列表解析在执行效率上也非常高(CPython中)。

不良风格:

 some_other_list = range(10)
some_list = list()
for element in some_other_list:
if is_prime(element):
some_list.append(element + 5)

地道Python:

 some_other_list = range(10)
some_list = [element + 5 for element in some_other_list if is_prime(element)]

2.3.2 使用负数下标

一个常被很多Python初用者忽视的特性是,在Python的列表和字符串中是可以使用负数下标的。和正数下标从列表开头向后数不同,附属下标从列表的末尾往回数。

不良风格:

 def get_suffix(word):
word_length = len(word)
return word[word_length - 2:]

地道Python:

 def get_suffix(word):
return word[-2:]

2.3.3 和内建的map()以及filter()函数相比,优先使用列表解析

Python是一门自诞生以来就一直在演化的语言。也正因为如此,一直有一些历史遗留被保留了下来。mapfilter函数就是例子,尽管曾经在一些情况下用mapfilter是最佳的选择,但是现在几乎所有的使用都可以用列表解析来代替。并且列表解析的可读性和清晰性更好,所以至少在我的书里我认为应该优先使用列表解析而不是mapfilter的组合。

不良风格:

 the_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def is_odd(number):
return number % 2 == 1
odd_numbers = filter(is_odd, the_list)
odd_numbers_times_two = list(map(lambda x: x * 2, odd_numbers))

地道Python:

 the_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
odd_numbers_times_two = [n * 2 for n in the_list if n % 2 == 1]

// 其实这是个很见仁见智的问题,在stackoverflow上也有很多关于map/filter和list comprehension的争论,就效率而言,对不同的情况下两种办法互有胜负,就可读性而言其实我觉得map和filter比list comprehension好很多。。另外别忘了还有个函数叫reduce

2.3.4 使用内建的sum函数对列表中的元素求和

对于一些已经用习惯sum的人来说可能会觉得这条比较奇怪。然而对更多的Python新手而言他们做的是自己重新实现了sum函数。如果一个函数已经是内建的,那么我们不应该重新发明轮子。

不良风格:

 the_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
the_sum = 0
for element in the_list:
the_sum += element

地道Python:

 the_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
the_sum = sum(the_list)

2.3.5 使用all检查一个可遍历结构中是否所有元素都是真

sum一样,all也是一个被新手频繁重写的内建函数。它可以检查一个可遍历结构中的元素是否都为真。

不良风格:

 def contains_zero(iterable):
for e in iterable:
if e == 0:
return True
return False

地道Python:

 def contains_zero(iterable):
# 0 is "Falsy," so this works
return not all(iterable)

2.3.6 优先使用xrange而不是range,除非你需要的就是range生成的列表

xrangerange都能让你遍历一个数值列表。区别是,xrange不会再内存中存储一个完整的列表。大多数情况下这两者不会再实际使用时产生区别,但是当你需要遍历的数值范围非常大时,在内存占用和执行效率上就能看到很大差别了。

不良风格:

 # A loop over a large range that breaks out
# early: a double whammy!
even_number = int()
for index in range (1000000):
if index % 2 == 0:
even_number = index
break

地道Python:

 even_number = int()
for index in xrange(1000000):
if index % 2 == 0:
even_number = index
break

转载请注明出处:達聞西@博客园

上一篇:翻译《Writing Idiomatic Python》(二):函数、异常

下一篇:翻译《Writing Idiomatic Python》(四):字典、集合、元组

翻译《Writing Idiomatic Python》(三):变量、字符串、列表的更多相关文章

  1. 《Writing Idiomatic Python》前两部分的中文翻译

    汇总了一下这本小书前两部分的内容: 翻译<Writing Idiomatic Python>(一):if语句.for循环 翻译<Writing Idiomatic Python> ...

  2. 翻译《Writing Idiomatic Python》(四):字典、集合、元组

    原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...

  3. 翻译《Writing Idiomatic Python》(二):函数、异常

    原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...

  4. 翻译《Writing Idiomatic Python》(五):类、上下文管理器、生成器

    原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...

  5. 翻译《Writing Idiomatic Python》(一):if语句、for循环

    开篇废话 这是在美国Amazon上评价很不错的一本书,其实严格来说这可能不算书,而是一本小册子.就像书名一样,里面的内容主要是用一些例子讲述地道的Python的代码是怎样写的.书中把很多例子用不良风格 ...

  6. 分享书籍[writing idiomatic python ebook]

    你是不是总是觉得学了python好久,蓦然回首,总是感觉写的代码不是那么有pythonic的味道.看看别人的代码(django,webpy),再看看自己的代码,觉得就是一java-python的混合体 ...

  7. python 三种遍历列表里面序号和值的方法

    list = ['html', 'js', 'css', 'python'] # 方法1 # 遍历列表方法1:' for i in list: print("序号:%s 值:%s" ...

  8. 分享书籍[writing idiomatic python ebook] 二

    对多个变量设置相同的值时,用连等号一起赋值 x = 10 y = 10 z = 10 改成: x = y = z = 10 交换变量值时,可以避免定义新的临时变量 x = 10 y = 5 temp ...

  9. Python自动化开发 - 字符串, 列表, 元组, 字典和和文件操作

    一.字符串 特性:字符串本身不可修改,除非字符串变量重新赋值.Python3中所有字符串都是Unicode字符串,支持中文. >>> name  = "Jonathan&q ...

随机推荐

  1. 20个免费的 AngularJS 资源和开发教程

    曾经,jQuery 无疑是最受欢迎的开源的 JavaScript 库,如今它有了很多的竞争对手,像 AngularJS.React.KnockoutJS 等等.在这里,我想重点关注一下 Angular ...

  2. 灵感来自 Google & YouTube 的苗条的进度栏效果

    NProgress.js 是纳米级的进度条插件.拥有逼真的的涓涓细流动画效果来告诉你的用户,某些事情正在发生.它的灵感来自于谷歌,YouTube,应用了,这款苗条的进度条是完美的,适用于 Turbol ...

  3. SharePoint如何关掉mysite. how to disable mysite creation

    一个很简单的问题 center admin --> application managment -->manage service application -->user profi ...

  4. GDataXMLNode应用

    一.GDataXMLNode的安装配置过程 1.将GDataXMLNode文件加入至工程中 2.向Frameworks文件中添加libxml2.dylib库 3.在Croups & Files ...

  5. 【C语言】C语言局部变量和全局变量

    目录: [局部变量] · 定义 · 作用域 · 生命周期 · 用static修饰局部变量 [全局变量] · 定义 · 作用域 · 生命周期 1.局部变量 · 定义 在函数(代码块)内部定义的变量称为局 ...

  6. Android 手机卫士--阶段小结1

    本文地址:http://www.cnblogs.com/wuyudong/p/5904528.html,转载请注明源地址. 本文对之前手机卫士开发进行一个小结. 1.SplashActivity 版本 ...

  7. Swift开发第八篇——方法嵌套&命名空间

    本篇分为两部分: 一.Swift中的方法嵌套 二.Swift中的命名空间 一.Swift中的方法嵌套 在 swift 中我们可以让方法嵌套方法,如: func appendQuery(var url: ...

  8. 我的android学习经历5

    android在strings.xml文件中,写string对象时,如何加入空格 <string name="password">密    码:</string& ...

  9. 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式

    PS:下面是性能测试的主要概念和计算公式,记录下: 一.系统吞度量要素: 一个系统的吞度量(承压能力)与request对CPU的消耗.外部接口.IO等等紧密关联.单个reqeust 对CPU消耗越高, ...

  10. (视频)《快速创建网站》 3.3 国际化高大上 - WordPress多语言支持

    本文是<快速创建网站>系列的第7篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 访问本系列目录,请点击:http://devopshub.cn/tag ...