python的编程美学

1、前言

写python的同学会经常听到pythonic这个词,但对于这个词语具体的语义,python社区每个人都有自己的独到的见解,因为pythonic自身就是人为造的单词。结合社区的观点可以知道:pythonic是python编程中的惯用方法,也就是写出简洁,优雅的代码,写出具有python独特风格的代码。

尝试运行下面这行代码,显示的结果便是python编程之禅

1
>>> import this

the zen of python

2、举个列子

大部分同学的入门语言都是c语言,这导致在写python的过程中,会不自觉地借用c语言的思想,写出类c语言风格的代码,比如在对一个数组遍历操作时, 我们使用c语言会经常这么写

1
2
3
4
int arr[4]={1, 2, 3, 4};
for (int i=0; i<4; i++){
do something(arr[i]);
}

于是,在使用python编写程序的时候,习惯性的会按照下面的方法写:

1
2
3
4
arr = [1, 2, 3, 4]
i = 0
for x in range(len(arr)):
do something(arr[x])

python以简洁优雅著称,上面的写法并没有很好的体现这一点,在python里面,任何可迭代的对象都能用for in来进行处理,更加优雅的实现方式是:

1
2
3
arr = [1, 2, 3, 4]
for element in arr:
do something(element)

编写更加pythonic的代码,不仅能让程序更加简洁优雅,还能提高程序的运行效率。下面介绍一些常用的更加pythonic的写法。

3、一些常见替代写法

  • (1)、 数字交换
1
2
3
a = 1
b = 2
a, b = b, a
  • (2)、使用字符串切片,对字符串快速操作
1
2
s = 'hello'
s_reverse = s[::-1] # 注意字符串切片的使用非常灵活
  • (3)、字符串拼接
1
2
str_arr   = ['hello', 'world']
res = ' '.join(str_arr) # 避免使用+拼接字符串,+操作会降低程序运行效率
  • (4)、列表生成式(快速生成有规律的列表)
1
2
3
4
for x in range(1, 5):
print x # 使用range构造了一个列表[1, 2, 3, 4]并迭代它,不用手动构造。当需要构造的list非常大时,使用xrange()会更好
num = [x for x in range(1, 5)] # 生成num = [1, 2, 3, 4]
num = [x for x in range(1, 5) if x%2 == 0] # 在上面的基础上过滤掉奇数
  • (5)、真值判断

    在python中,每种数据类型在空与非空的时候都有对应的真值与其匹配,掌握默认的真值能减 少冗余的代码:

True False
True False
非空字符串 空字符串
非0数字 数字0
非空容器 空的容器如[]{}
其它非False None
1
2
3
4
5
x = 'hello, world'
if x is not None:
pass
if x:
pass # 两种等效
  • (6)、使用for else语句快速跳出循环
1
2
3
4
5
6
for x in range(1,5):
if x == 3:
print 'find 3'
break
else:
print 'can not find 3!' # 可以检查循环是否跳出
  • (7)、zip(izip)迭代多个list
1
2
3
4
5
names = ['tom', 'alice', 'amy']
grades = [100, 90, 88]
for name, grade in zip(names, grades):
print name, grade # 同时迭代了两个list
d = dict(zip(names, grades)) # 使用zip快速构造字典
  • (8)、排序使用默认方法,不要自己造轮子
1
2
3
nums = [2, 1, 3, 0]
for num in sorted(nums):
print num # 对python而言,默认的排序方法sorted()方法效率非常高
  • (9)、字典默认值

在访问字典的时候,访问不存在的键值程序会报KeyError的操作。解决方式可以使用字典的get()方法,当然也可以使用默认字典

1
d = defautdict(int)
  • (10)、解构list
1
2
l = [1, 2, 3]
a, b , c = l # 避免使用a = l[0] 这种写法
  • (11)、同时迭代对象的值和索引
1
2
3
4
for x in range(1, 5):
do something(x) # 只能取出值
for index, x in enumerate(range(1, 5)):
print index, x # 使用enumerate()方法可以同时取出索引和值

4、参考资料

热评文章