分享Python开发中要注意的十个小贴士


Posted in Python onAugust 30, 2016

大家请注意:这篇文中假设我们都用的是Python 3

1. 列表推导式

你有一个list:bag = [1, 2, 3, 4, 5]

现在你想让所有元素翻倍,让它看起来是这个样子: [2, 4, 6, 8, 10]

大多初学者,根据之前语言的经验会大概这样来做

bag = [1, 2, 3, 4, 5] 
for i in range(len(bag)): 
 bag[i] = bag[i] * 2

但是有更好的方法:

bag = [elem * 2 for elem in bag]

很简洁对不对?这叫做Python的列表推导式。

2. 遍历列表

继续,还是上面的列表。

如果可能尽量避免这样做:

bag = [1, 2, 3, 4, 5] 
for i in range(len(bag)): 
 print(bag[i])

取而代之的应该是这样:

bag = [1, 2, 3, 4, 5] 
for i in bag: 
 print(i)

如果x是一个列表,你可以对它的元素进行迭代。多数情况下你不需要各元素的索引,但如果你非要这样做,那就用enumerate函数。它像下边的样子:

bag = [1, 2, 3, 4, 5] 
for index, element in enumerate(bag): 
 print(index, element)

非常直观明了。

3. 元素互换

如果你是从java或者C语言转到Python来,可能会习惯于这样:

a = 5 
b = 10

# 交换 a 和 b
tmp = a 
a = b 
b = tmp

但Python提供了一个更自然更好的方法!

a = 5 
b = 10 
# 交换a 和 b
a, b = b, a

够漂亮吧?

4. 初始化列表

假如你要一个是10个整数0的列表,你可能首先想到:

bag = [] 
for _ in range(10): 
 bag.append(0)

换个方式吧:

bag = [0] * 10

看,多优雅。

注意:如果你列表包含了列表,这样做会产生浅拷贝。

举个例子:

bag_of_bags = [[0]] * 5 # [[0], [0], [0], [0], [0]] 
bag_of_bags[0][0] = 1 # [[1], [1], [1], [1], [1]]

Oops!所有的列表都改变了,而我们只是想要改变第一个列表。

改一改啦:

bag_of_bags = [[0] for _ in range(5)] 
# [[0], [0], [0], [0], [0]]

bag_of_bags[0][0] = 1 
# [[1], [0], [0], [0], [0]]

同时记住:

“过早优化是万恶之源”
问问自己,初始化一个列表是必须的吗?

5. 构造字符串

你会经常需要打印字符串。要是有很多变量,避免下面这样:

name = "Raymond" 
age = 22 
born_in = "Oakland, CA" 
string = "Hello my name is " + name + "and I'm " + str(age) + " years old. I was born in " + born_in + "." 
print(string)

额,这看起来多乱呀?你可以用个漂亮简洁的方法来代替, .format

这样做:

name = "Raymond" 
age = 22 
born_in = "Oakland, CA" 
string = "Hello my name is {0} and I'm {1} years old. I was born in {2}.".format(name, age, born_in) 
print(string)

好多了!

6. 返回tuples(元组)

Python允许你在一个函数中返回多个元素,这让生活更简单。但是在解包元组的时候出出线这样的常见错误:

def binary(): 
 return 0, 1

result = binary() 
zero = result[0] 
one = result[1]

这是没必要的,你完全可以换成这样:

def binary(): 
 return 0, 1

zero, one = binary()

要是你需要所有的元素被返回,用个下划线_:

zero, _ = binary()

就是这么高效率!

7. 访问Dicts(字典)

你也会经常给dicts中写入keypair(键,值)。

如果你试图访问一个不存在的于dictkey,可能会为了避免KeyError错误,你会倾向于这样做:

countr = {} 
bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7] 
for i in bag: 
 if i in countr:
  countr[i] += 1
 else:
  countr[i] = 1

for i in range(10): 
 if i in countr:
  print("Count of {}: {}".format(i, countr[i]))
 else:
  print("Count of {}: {}".format(i, 0))

但是,用get()是个更好的办法。

countr = {} 
bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7] 
for i in bag: 
 countr[i] = countr.get(i, 0) + 1

for i in range(10): 
 print("Count of {}: {}".format(i, countr.get(i, 0)))

当然你也可以用setdefault来代替。

这还用一个更简单却多费点开销的办法:

bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7] 
countr = dict([(num, bag.count(num)) for num in bag])

for i in range(10): 
 print("Count of {}: {}".format(i, countr.get(i, 0)))

你也可以用dict推导式。

countr = {num: bag.count(num) for num in bag}

这两种方法开销大是因为它们在每次count被调用时都会对列表遍历。

8 使用库

现有的库只需导入你就可以做你真正想做的了。

还是说前面的例子,我们建一个函数来数一个数字在列表中出现的次数。那么,已经有一个库就可以做这样的事情。

from collections import Counter 
bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7] 
countr = Counter(bag)

for i in range(10): 
 print("Count of {}: {}".format(i, countr[i]))

一些用库的理由:

      1、代码是正确而且经过测试的。

      2、它们的算法可能会是最优的,这样就跑的更快。

      3、抽象化:它们指向明确而且文档友好,你可以专注于那些还没有被实现的。

      4、最后,它都已经在那儿了,你不用再造轮子了。

9. 在列表中切片/步进

你可以指定start的点和stop点,就像这样list[start:stop:step]

我们取出列表中的前5个元素:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for elem in bag[:5]: 
 print(elem)

这就是切片,我们指定stop点是5,再停止前就会从列表中取出5个元素。

要是最后5个元素怎么做?

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for elem in bag[-5:]: 
 print(elem)

没看明白吗?-5意味着从列表的结尾取出5个元素。

如果你想对列表中元素间隔操作,你可能会这样做:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for index, elem in enumerate(bag): 
 if index % 2 == 0:
  print(elem)

但是你应该这样来做:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for elem in bag[::2]: 
 print(elem)

# 或者用 ranges
bag = list(range(0,10,2)) 
print(bag)

这就是列表中的步进。list[::2]意思是遍历列表同时两步取出一个元素。

你可以用list[::-1]很酷的翻转列表。

10. tab键还是空格键

长时间来看,将tab和空格混在一起会造成灾难,你会看到IndentationError: unexpected indent。不管你选择tab键还是空格键,你应该在你的文件和项目中一直保持使用。

一个使用空格而不是tab的原因是,tab不是在所有编辑器中都一样的。视呢所用的编辑器,tab可能会被当作2到8个空格。

你也可以在写代码时用空格来定义tab。这样你可以自己选择用几个空格来当做tab。大多数Python用户是用4个空格。

总结

以上就是为大家总结的Python开发中要注意的小贴士,希望对大家学习和使用python能有所帮助,如果有疑问可以留言交流。

Python 相关文章推荐
python3使用tkinter实现ui界面简单实例
Jan 10 Python
Python如何快速上手? 快速掌握一门新语言的方法
Nov 14 Python
程序员写Python时的5个坏习惯,你有几条?
Nov 26 Python
详解Python3 基本数据类型
Apr 19 Python
Pytorch 实现数据集自定义读取
Jan 18 Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 Python
python实现拼图小游戏
Feb 22 Python
浅析python表达式4+0.5值的数据类型
Feb 26 Python
Python代码中如何读取键盘录入的值
May 27 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 14 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
Jun 26 Python
使用opencv-python如何打开USB或者笔记本前置摄像头
Jun 21 Python
Python将图片批量从png格式转换至WebP格式
Aug 22 #Python
利用Python批量生成任意尺寸的图片
Aug 29 #Python
Python自定义类的数组排序实现代码
Aug 28 #Python
Python 基于Twisted框架的文件夹网络传输源码
Aug 28 #Python
Django URL传递参数的方法总结
Aug 28 #Python
python 网络编程常用代码段
Aug 28 #Python
Fabric 应用案例
Aug 28 #Python
You might like
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
PHP内置加密函数详解
2016/11/20 PHP
PHP中抽象类,接口功能、定义方法示例
2019/02/26 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
jquery 表单取值常用代码
2009/12/22 Javascript
关于eval 与new Function 到底该选哪个?
2013/04/17 Javascript
CSS图片响应式 垂直水平居中
2015/08/14 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
JS获得多个同name 的input输入框的值的实现方法
2017/01/09 Javascript
使用JS在浏览器中判断当前网络连接状态的几种方法
2017/05/05 Javascript
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
使用Angular自定义字段校验指令的方法示例
2019/02/01 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
2019/08/26 Javascript
vue学习之Vue-Router用法实例分析
2020/01/06 Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
2020/07/11 Javascript
python构造icmp echo请求和实现网络探测器功能代码分享
2014/01/10 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
2016/02/18 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
2016/06/16 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
2016/07/01 Python
安装Python和pygame及相应的环境变量配置(图文教程)
2017/06/04 Python
python实现俄罗斯方块游戏
2020/03/25 Python
python正则表达式之对号入座篇
2018/07/24 Python
对TensorFlow的assign赋值用法详解
2018/07/30 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
分享unittest单元测试框架中几种常用的用例加载方法
2020/12/02 Python
css3实现多个元素依次显示效果
2017/12/12 HTML / CSS
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
DogBuddy荷兰:找到你最完美的狗保姆
2019/04/17 全球购物
中学生班主任评语
2014/01/30 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
2014年生产部工作总结
2014/12/17 职场文书
教师考核鉴定意见
2015/06/05 职场文书
Python Socket编程详解
2021/04/25 Python
Python下opencv库的安装过程及问题汇总
2021/06/11 Python
python 安全地删除列表元素的方法
2022/03/16 Python