有关Python的22个编程技巧


Posted in Python onAugust 29, 2018

1. 原地交换两个数字

Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例:

x,y= 10,20
print(x,y)
x,y= y,x
print(x,y)
#1 (10, 20)
#2 (20, 10)

赋值的右侧形成了一个新的元组,左侧立即解析(unpack)那个(未被引用的)元组到变量 <a> 和 <b>。

一旦赋值完成,新的元组变成了未被引用状态并且被标记为可被垃圾回收,最终也完成了变量的交换。

2. 链状比较操作符

比较操作符的聚合是另一个有时很方便的技巧:

n= 10
result= 1< n< 20
print(result)
# True
result= 1> n<= 9
print(result)
# False

3. 使用三元操作符来进行条件赋值

三元操作符是 if-else 语句也就是条件操作符的一个快捷方式:

[表达式为真的返回值] if [表达式] else [表达式为假的返回值]

这里给出几个你可以用来使代码紧凑简洁的例子。下面的语句是说“如果 y 是 9,给 x 赋值 10,不然赋值为 20”。如果需要的话我们也可以延长这条操作链。

x = 10 if (y == 9) else 20

同样地,我们可以对类做这种操作:

x = (classA if y == 1 else classB)(param1, param2)

在上面的例子里 classA 与 classB 是两个类,其中一个类的构造函数会被调用。

下面是另一个多个条件表达式链接起来用以计算最小值的例子:

def small(a,b,c):
returnaifa<= banda<= celse(bifb<= aandb<= celsec)
print(small(1,0,1))
print(small(1,2,2))
print(small(2,2,3))
print(small(5,4,3))
#Output
#0 #1 #2 #3

我们甚至可以在列表推导中使用三元运算符:

[m**2 if m > 10 else m**4 for m in range(50)]
#=> [0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561, 10000, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401]

4. 多行字符串

基本的方式是使用源于 C 语言的反斜杠:

multiStr= “select * from multi_row
where row_id < 5”
print(multiStr)
# select * from multi_row where row_id < 5

另一个技巧是使用三引号:

multiStr= “””select * from multi_row
where row_id < 5″””
print(multiStr)
#select * from multi_row
#where row_id < 5

上面方法共有的问题是缺少合适的缩进,如果我们尝试缩进会在字符串中插入空格。所以最后的解决方案是将字符串分为多行并且将整个字符串包含在括号中:

multiStr= (“select * from multi_row ”
“where row_id < 5 ”
“order by age”)
print(multiStr)
#select * from multi_row where row_id < 5 order by age

5. 存储列表元素到新的变量中

我们可以使用列表来初始化多个变量,在解析列表时,变量的数目不应该超过列表中的元素个数:【译者注:元素个数与列表长度应该严格相同,不然会报错】

testList= [1,2,3]
x,y,z= testList
print(x,y,z)
#-> 1 2 3

6. 打印引入模块的文件路径

如果你想知道引用到代码中模块的绝对路径,可以使用下面的技巧:

import threading
import socket
print(threading)
print(socket)
#1- <module ‘threading' from ‘/usr/lib/python2.7/threading.py'>
#2- <module ‘socket' from ‘/usr/lib/python2.7/socket.py'>

7. 交互环境下的 “_” 操作符

这是一个我们大多数人不知道的有用特性,在 Python 控制台,不论何时我们测试一个表达式或者调用一个方法,结果都会分配给一个临时变量: _(一个下划线)。

>>> 2+ 1
3
>>> _
3
>>> print_
3
“_” 是上一个执行的表达式的输出。

8. 字典/集合推导

与我们使用的列表推导相似,我们也可以使用字典/集合推导,它们使用起来简单且有效,下面是一个例子:

testDict= {i: i *iforiinxrange(10)}
testSet= {i *2foriinxrange(10)}
print(testSet)
print(testDict)
#set([0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
#{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

注:两个语句中只有一个 <:> 的不同,另,在 Python3 中运行上述代码时,将 <xrange> 改为 <range>。

9. 调试脚本

我们可以在 <pdb> 模块的帮助下在 Python 脚本中设置断点,下面是一个例子:

import pdb
pdb.set_trace()

我们可以在脚本中任何位置指定 <pdb.set_trace()> 并且在那里设置一个断点,相当简便。

10. 开启文件分享

Python 允许运行一个 HTTP 服务器来从根路径共享文件,下面是开启服务器的命令:

# Python 2
python -m SimpleHTTPServer
# Python 3
python3 -m http.server

上面的命令会在默认端口也就是 8000 开启一个服务器,你可以将一个自定义的端口号以最后一个参数的方式传递到上面的命令中。

11. 检查 Python 中的对象

我们可以通过调用 dir() 方法来检查 Python 中的对象,下面是一个简单的例子:

test= [1,3,5,7]
print(dir(test))
[‘__add__', ‘__class__', ‘__contains__', ‘__delattr__', ‘__delitem__', ‘__delslice__', ‘__doc__', ‘__eq__', ‘__format__', ‘__ge__', ‘__getattribute__', ‘__getitem__', ‘__getslice__', ‘__gt__', ‘__hash__', ‘__iadd__', ‘__imul__', ‘__init__', ‘__iter__', ‘__le__', ‘__len__', ‘__lt__', ‘__mul__', ‘__ne__', ‘__new__', ‘__reduce__', ‘__reduce_ex__', ‘__repr__', ‘__reversed__', ‘__rmul__', ‘__setattr__', ‘__setitem__', ‘__setslice__', ‘__sizeof__', ‘__str__', ‘__subclasshook__', ‘append', ‘count', ‘extend', ‘index', ‘insert', ‘pop', ‘remove', ‘reverse', ‘sort']

12. 简化 if 语句

我们可以使用下面的方式来验证多个值:

if m in [1,3,5,7]:

而不是:

if m==1 or m==3 or m==5 or m==7:

或者,对于 in 操作符我们也可以使用 ‘{1,3,5,7}' 而不是 ‘[1,3,5,7]',因为 set 中取元素是 O(1) 操作。

13. 一行代码计算任何数的阶乘

Python 2.x.
result= (lambdak: reduce(int.__mul__,range(1,k+1),1))(3)
print(result)
#-> 6
Python 3.x.
import functools
result= (lambdak: functools.reduce(int.__mul__,range(1,k+1),1))(3)
print(result)
#-> 6

14. 找到列表中出现最频繁的数

test= [1,2,3,4,2,2,3,1,4,4,4]
print(max(set(test),key=test.count))
#-> 4

15. 重置递归限制

Python 限制递归次数到 1000,我们可以重置这个值:

import sys
x=1001
print(sys.getrecursionlimit())
sys.setrecursionlimit(x)
print(sys.getrecursionlimit())
#1-> 1000
#2-> 1001

请只在必要的时候采用上面的技巧。

16. 检查一个对象的内存使用

在 Python 2.7 中,一个 32 比特的整数占用 24 字节,在 Python 3.5 中利用 28 字节。为确定内存使用,我们可以调用 getsizeof 方法:

在 Python 2.7 中

import sys
x=1
print(sys.getsizeof(x))
#-> 24
在 Python 3.5 中
import sys
x=1
print(sys.getsizeof(x))
#-> 28

17. 使用 __slots__ 来减少内存开支

你是否注意到你的 Python 应用占用许多资源特别是内存?有一个技巧是使用 __slots__ 类变量来在一定程度上减少内存开支。

import sys
classFileSystem(object):
def __init__(self,files,folders,devices):
self.files= files
self.folders= folders
self.devices= devices
print(sys.getsizeof(FileSystem))
classFileSystem1(object):
__slots__= [‘files','folders','devices']
def __init__(self,files,folders,devices):
self.files= files
self.folders= folders
self.devices= devices
print(sys.getsizeof(FileSystem1))
#In Python 3.5
#1-> 1016
#2-> 888

很明显,你可以从结果中看到确实有内存使用上的节省,但是你只应该在一个类的内存开销不必要得大时才使用 __slots__。只在对应用进行性能分析后才使用它,不然地话,你只是使得代码难以改变而没有真正的益处。

【译者注:在我的 win10 python2.7 中上面的结果是:

#In Python 2.7 win10
#1-> 896
#2-> 1016

所以,这种比较方式是不那么让人信服的,使用 __slots__ 主要是用以限定对象的属性信息,另外,当生成对象很多时花销可能会小一些,具体可以参见 python 官方文档:

The slots declaration takes a sequence of instance variables and reserves just enough space in each instance to hold a value for each variable. Space is saved because dict is not created for each instance. 】

18. 使用 lambda 来模仿输出方法

import sys
lprint=lambda *args:sys.stdout.write(” “.join(map(str,args)))
lprint(“python”,”tips”,1000,1001)
#-> python tips 1000 1001

19.从两个相关的序列构建一个字典

t1= (1,2,3)
t2= (10,20,30)
print(dict(zip(t1,t2)))
#-> {1: 10, 2: 20, 3: 30}

20. 一行代码搜索字符串的多个前后缀

print(“http://www.google.com”.startswith((“http://”,”https://”)))
print(“http://www.google.co.uk”.endswith((“.com”,”.co.uk”)))
#1-> True
#2-> True

21. 不使用循环构造一个列表

import itertools
test= [[-1,-2],[30,40],[25,35]]
print(list(itertools.chain.from_iterable(test)))
#-> [-1, -2, 30, 40, 25, 35]

22. 在 Python 中实现一个真正的 switch-case 语句

下面的代码使用一个字典来模拟构造一个 switch-case。

def xswitch(x):
returnxswitch._system_dict.get(x,None)
xswitch._system_dict= {‘files': 10,'folders': 5,'devices': 2}
print(xswitch(‘default'))
print(xswitch(‘devices'))
#1-> None
#2-> 2

总结

以上所述是小编给大家介绍的有关Python的22个编程技巧,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python正则匹配查询港澳通行证办理进度示例分享
Dec 27 Python
介绍Python的Django框架中的静态资源管理器django-pipeline
Apr 25 Python
Python定时执行之Timer用法示例
May 27 Python
Python增量循环删除MySQL表数据的方法
Sep 23 Python
Python 装饰器使用详解
Jul 29 Python
JavaScript实现一维数组转化为二维数组
Apr 17 Python
pandas 对series和dataframe进行排序的实例
Jun 09 Python
Pycharm无法使用已经安装Selenium的解决方法
Oct 13 Python
python实现超市商品销售管理系统
Nov 22 Python
python读取ini配置文件过程示范
Dec 23 Python
Python基础之变量基本用法与进阶详解
Jan 03 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
Jan 15 Python
Python实现多线程的两种方式分析
Aug 29 #Python
Python运维自动化之nginx配置文件对比操作示例
Aug 29 #Python
python单例模式实例解析
Aug 28 #Python
Python3.7实现中控考勤机自动连接
Aug 28 #Python
python实现遍历文件夹修改文件后缀
Aug 28 #Python
Python绘制正余弦函数图像的方法
Aug 28 #Python
Python logging模块用法示例
Aug 28 #Python
You might like
PHP中文汉字验证码
2007/04/08 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
2016/03/21 PHP
Zend Framework校验器Zend_Validate用法详解
2016/12/09 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
ExtJS Store的数据访问与更新问题
2010/04/28 Javascript
javascript取消文本选定的实现代码
2010/11/14 Javascript
两个listbox实现选项的添加删除和搜索
2013/03/01 Javascript
JavaScript获取多个数组的交集简单实例
2013/11/11 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
jQuery中click事件用法实例
2014/12/26 Javascript
高效利用Angular中内置服务$http、$location等
2016/03/22 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
2017/01/20 Javascript
前后端如何实现登录token拦截校验详解
2018/09/03 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
python中常用检测字符串相关函数汇总
2015/04/15 Python
Python浅拷贝与深拷贝用法实例
2015/05/09 Python
Python骚操作之动态定义函数
2019/03/26 Python
python3安装crypto出错及解决方法
2019/07/30 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
2020/07/14 Python
详解python中的异常捕获
2020/12/15 Python
html5 的a标签 Href 拨电话的写法
2013/11/04 HTML / CSS
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
英国在线汽车和面包车零件商店:Car Parts 4 Less
2018/08/15 全球购物
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
一些.net面试题
2014/10/06 面试题
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
办公室主任主任岗位责任制
2014/02/11 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
在K8s上部署Redis集群的方法步骤
2021/04/27 Redis