面向python程序员的30个基本Python小技巧(下)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值