专栏首页Python数据科学优雅你的Python代码的15个tips

优雅你的Python代码的15个tips

前言:师妹前段时间非常认真地选了下学期的《大数据分析实践》选修课,根据几位师兄的建议买了本书开始自学 Python 语言。然而年后再见,师妹说她看完了书,做了一些习题,但并不觉得 Python 有啥吸引人的地方,对这门语言的激情也就大不如前。

起初笔者很疑惑为什么师妹会有这样的感受,直到看到了师妹写的 Python 代码,才明白了症结所在——师妹一直在用类似 C/C++ 语言的习惯写 Python 代码,而没有利用 Python 语言本身的特性,写的代码和以前的代码差不多冗长,开发效率并没有明显提高。因此自然不觉得 Python 有啥特别之处,也就失去了兴趣。

笔者指出了问题,接着对着师妹的代码,刷刷刷改了起来。不一会儿就将原代码量缩短了几乎一半。看着简洁、直观、自带注释属性的新代码,师妹重新燃起了学习的热情。在她的要求下,笔者整理了如下的15条经验,供大家参考和学习。

文章全文约2000字,共有15个程序样例片段。

测试环境为:python版本 3.7.0 / 操作系统window 7 64位;

Python 环境下,在开始编码之前,输入 importthis,可以看到 Python 为我们准备的彩蛋——

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
......

部分内容简单翻译为:

优美胜于丑陋
明了胜于晦涩
简洁胜于复杂
……
可读性很重要

这就是著名的“Python之禅“。这几句内置的最正确的“废话“,体现了 Python 语言对于简洁与优美的追求。

在 Python 社区,程序员还创造了一个新词 Pythonic 来评价代码是否符合 Python 风格,并以写出 Pythonic 风格的代码而自豪。笔者初次看到这个单词时,首先想到的是日本鼎盛时期的代表企业,索尼和松下公司(Sony,Panasonic),进而联想起90年代这些公司极致、创新的产品和其所代表的精益求精的匠人精神。

扯远了,回到正题。笔者想表达的是,通过熟悉 Python 语言的一些基本特性,加以熟练应用,你也可以写出很 Pythonic 的代码!

话不多说,本文通过15个具体的例子,带你领略 Python 的简洁和优雅。

下文中'P'即表示'Pythonic',很 Python 的写法,'NP'也就是相反,不是很'Pythonic'的写法。

1、为多个变量赋值

### NP:
a = 2
b = 5
c = 12

### P:
a,b,c = 2,5,12

2、变量值互换

a = 50
b = 25

### NP:
temp = a
a = b
b = temp

### P:
a,b = b,a

上面的例子通过了元组的pack和unpack完成了对a,b的互换,避免了使用临时变量temp,而且只用了一行代码。

3、链式比较

a = 50
b = 25

### NP:
0<= b and b<=a and a<100

### P:
0 <= b <= a < 100

后者的写法更接近数学表达式。

4、any/all函数

anyallPython的内置函数。对于 any函数,可迭代参数的任何一个元素为真就返回 True,否则返回 False。对于 all函数,如果可迭代参数的所有元素为真(或迭代器为空),返回 True,否则返回 False

### NP:
xyz = [4641951.185   1393053.923   4133281.067] 
for v in xyz:
    if 0.0==v:
        return False
return True

### P:
return all(xyz)

5、用in代替or简化判断

同样是多重判断问题,判断某个变量是否为多个可能取值之一

### NP:
if 'green'==s0 or 'red'==s0 or 'blue'==s0:
    return True
else:
    return False

### P:
return s0 in ('green', 'red', 'blue')

6、if/else 三目运算

### NP:
if age > 18:
    ss = 'adult'
else:
    ss = 'child'

### P:
ss = 'adult' if age > 18 else 'child'

后者的写法简单易懂,仅需一行代码就完成了常规写法4行代码的功能。

7、字符串列表的连接

lst_str = ["Python", "is", "a", "good", "language"]  

### NP1:
ss = ''
for s0 in lst_str:
    ss += s0 + ' '

### NP2:
ss = '%s %s %s %s %s'%(lst_str[0], lst_str[1], lst_str[2], lst_str[3], lst_str[4])

### P:
ss = ' '.join(lst_str)

使用 join方法可以指定间隔字符(串)将字符串列表合并成一个字符串。

8、匹配字符串开头/结尾

fname1 = 'python.jpg'
fname2 = 'folwer.bmp'
fname3 = 'readme.txt'

### P:
fname1.startswith('python')           #True
fname2.endswith('.jpg')                #False
fname2.endswith(('.jpg', '.bmp'))     #True
fname3.endswith(('.jpg', '.bmp'))      #False

9、列表推导式

从列表中找出符合条件的元素组成新的列表

lst0 = [11, 22, 24, 87, 70]

### NP:
lst1 = []
for v in lst0:
    if v>30:
        lst1.append(v)

### P:
lst1 = [ v for v in lst0 if v>30 ]

可以结合上面两条tips,可以实现快速找出文件夹下指定类型的文件,例如:

picfiles = [nm for nm in os.listdir(mydir) if nm.endswith( ('.jpg', '.bmp', '.tiff', '.gif', '.png') ) ]

10、使用zip同步处理多个列表

当想要对多个列表对应的元素进行操作时

income = [201, 198, 195, 210, 199]
cost_rent = [80, 83, 77, 81, 80]
cost_food = [47, 64, 53, 51, 79]
balance = []

### NP:
nlen = len(income)
for i in range(nlen):
    balance.append(income[i] - cost_rent[i] - cost_food[i])

### P:
for i0, cr, cf in zip(income, cost_rent, cost_food):
    balance.append(i0 - cr - cf)

zip(a,b) 会生成一个可返回元组 (x,y) 的迭代器,其中x来自a,y来自b。 一旦其中某个序列到底结尾,迭代宣告结束。 因此迭代长度跟参数中最短序列长度一致。

11、列表去重

### NP:
lst_new = []

for v in lst_old:
    if not v in lst_new:
        lst_new.append(v)

### P:
lst_new = list(set(lst_old))

12、文件打开与关闭/上下文管理

### NP:
fp = open('result.txt', 'w')
try:
    fp.write('just for fun!')
except IOError:
    print('something error')
finally:
    fp.close()

### P:
with open('result.txt', 'w') as fp:
    fp.write('just for fun!')

with 关键字实现了上下文管理器,是一种更简洁也更安全的操作方法。上例中当离开 with 代码块的时候,系统会自动调用 fp.close() 方法关闭文件, 哪怕中间遇到异常,close 方法也会被调用。

13、Enumerate

枚举函数,用于枚举可迭代对象,并且同时返回元素的下标索引值。

如果你想在迭代一个序列的同时,得到被处理元素的索引下标。内置的 enumerate() 函数可以很好的解决这个问题:

array = ['Stone', 'Tom', 'Jobs', 'Jack']

### NP:
narr = len(array)
for i in range(narr):
    print (i, array[i])

### P:
for i, a0 in enumerate(array):
    print (i, a0)

#0 Stone
#1 Tom
#2 Jobs
#3 Jack

14、对齐字符串

有时,你想通过某种对齐方式来格式化字符串,输出一些提示信息

ss = 'Summary'

### NP:
print ('%s%s%s', '-'*20, ss, '-'*20)

### P:
print (ss.center(50,'-'))
#--------------------Summary--------------------

类似地,想让字符串左对齐或者右对齐,可以用 .ljust(50, '-') 或 rjust(50, '-')

15、解包

解压列表/元祖的元素,赋值给不同的变量

lst = ['jack', 18, 'Python', 'Good']

### NP:
name = lst[0]
age = lst[1]
lang = lst[2]
score = lst[3]

### P:
name, age, lang, score = lst

如果想解包一个长列表,只得到其中部分元素,例如第一个和最后一个元素:

### P:
head, *mid, tail = lst

该例子中,除了头、尾元素之外,中间不受关注的元素作为一个子列表全部赋值给了 mid 。

本文分享自微信公众号 - Python数据科学(PyDataScience)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Ptython命名自喜剧团体,宅男程序员三个月写出的编程语言是如何改变世界的?

    1989年,荷兰的一位叫Guido Van Rossum的宅男程序员觉得其他语言都不好用,于是花三个月创造了一种新的编程语言。

    用户2769421
  • Python 官网宣布,正式发布 Python 3.8.0!

    那么,这次新发布的 Python 3.8.0 有哪些重要的改进呢?以下是是 Python 3.8 相比 3.7 的新增特性。

    用户2769421
  • 27 个问题,告诉你Python为什么这么设计?

    本文选自 Python 的官方文档。它列举了 27 个设计及历史的问题,其中有些问题我曾经分享过,例如为什么使用显式的 self、浮点数的问题、len(x) 而...

    用户2769421
  • 我用 Python 爬取了全国 4500 个热门景点,告诉你国庆哪里去不得?

    金秋九月,丹桂飘香,在这秋高气爽,阳光灿烂的收获季节里,我们送走了一个个暑假余额耗尽哭着走向校园的孩子们,又即将迎来一年一度伟大祖国母亲的生日趴体(无心上班,迫...

    CDA数据分析师
  • Python爬取4500个景点:用echarts热力图分析国庆哪里最堵?

    于是我萌生了通过旅游网站的景点销量来判断近期各景点流量情况的想法(这个想法很危险啊)。

    机器学习AI算法工程
  • dump和load怎么用?

    在写代码的时候,有的时候不知道什么时候用何种格式,字符串跟对象转换的时候,到底是用dump还是load.dumps或者loads, 每次都是蒙的,要么就去查,一...

    赵云龙龙
  • [接口测试 - 基础篇] 04 无法绕过的json解析

    概述 我们先看一下什么是json。 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交...

    苦叶子
  • 假期苦短,我用Python!这有个自动回复拜年信息的小程序

    大年三十到年初一,有没有也被拜年短信(大部分是群发)搞得很焦虑?不回复似乎显得很没有礼貌,一一回复又累心劳神。

    大数据文摘
  • Apache支持Python之CGI编程环境

    AlicFeng
  • 如何调试SAP CRM产品主数据应用后台ABAP端抛出的错误消息

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.bl...

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动