文章目录
Tips#21.一行代码计算任意数的阶乘。
Python 2.x.
result = (lambda k: reduce(int.__mul__, range(1,k+1),1))(3)
print(result)
#-> 6
Python 3.x.
import functools
result = (lambda k: functools.reduce(int.__mul__, range(1,k+1),1))(3)
print(result)
#-> 6
Tips#22. 查找列表中出现次数最多的值
test = [1,2,3,4,2,2,3,1,4,4,4]
print(max(set(test), key=test.count))
#-> 4
Tips#23. 重置递归限制
Python将递归限制为1000。我们可以重置它的值.
import sys
x=1001
print(sys.getrecursionlimit())
sys.setrecursionlimit(x)
print(sys.getrecursionlimit())
#1-> 1000
#2-> 1001
Tips#24. 检查对象的内存使用情况
在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
Tips#25.使用__slots__来减少内存开销。
您是否观察过您的Python应用程序消耗大量资源,特别是内存。这里有一个技巧,使用<__slots__>类变量在某种程度上减少内存开销。
import sys
class FileSystem(object):
def __init__(self, files, folders, devices):
self.files = files
self.folders = folders
self.devices = devices
print(sys.getsizeof( FileSystem ))
class FileSystem1(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__。只有在分析应用程序之后才执行此操作。否则,您将使代码难以更改,并且没有真正的好处。
Tips#26. 使用 lambda 来模仿输出方法
import sys
lprint=lambda *args:sys.stdout.write(" ".join(map(str,args)))
lprint("python", "tips",1000,1001)
#-> python tips 1000 1001
Tips#27. 从两个相关的序列构建一个字典
t1 = (1, 2, 3)
t2 = (10, 20, 30)
print(dict (zip(t1,t2)))
#-> {1: 10, 2: 20, 3: 30}
Tips#28. 一行代码搜索字符串的多个前后缀
print("http://www.google.com".startswith(("http://", "https://")))
print("http://www.google.co.uk".endswith((".com", ".co.uk")))
#1-> True
#2-> True
Tips#29. 不使用循环构造一个列表
import itertools
test = [[-1, -2], [30, 40], [25, 35]]
print(list(itertools.chain.from_iterable(test)))
#-> [-1, -2, 30, 40, 25, 35]
如果您有一个包含嵌套列表或元组作为元素的输入列表,那么可以使用下面的技巧。但是,这里的限制是使用for循环。
def unifylist(l_input, l_target):
for it in l_input:
if isinstance(it, list):
unifylist(it, l_target)
elif isinstance(it, tuple):
unifylist(list(it), l_target)
else:
l_target.append(it)
return l_target
test = [[-1, -2], [1,2,3, [4,(5,[6,7])]], (30, 40), [25, 35]]
print(unifylist(test,[]))
#Output => [-1, -2, 1, 2, 3, 4, 5, 6, 7, 30, 40, 25, 35]
统一包含列表和元组的列表的另一种更简单的方法是使用Python的包。它不需要循环。如果还没有的话只要执行pip install more_itertools安装
import more_itertools
test = [[-1, -2], [1, 2, 3, [4, (5, [6, 7])]], (30, 40), [25, 35]]
print(list(more_itertools.collapse(test)))
#Output=> [-1, -2, 1, 2, 3, 4, 5, 6, 7, 30, 40, 25, 35]
Tips#30.在Python中实现一个真正的switch-case语句
下面是使用字典模拟大小写转换结构的代码
def xswitch(x):
return xswitch._system_dict.get(x, None)
xswitch._system_dict = {'files': 10, 'folders': 5, 'devices': 2}
print(xswitch('default'))
print(xswitch('devices'))
#1-> None
#2-> 2