点击上方”python宝典”,关注获取python全套视频,
技术文章第一时间送达!
在这里列举一些我使用Python时积累的小技巧。这些技巧是我在使用Python过程中经常使用的。之前很零碎的记在笔记本中,现在整理出来,和大家分享。
一、import模块
在Python经常使用import声明,以使用其他模块(也就是其它.py文件)中定义的对象。
- 使用__name__
当我们编写Python库模块的时候,我们往往运行一些测试语句。当这个程序作为库被import的时候,我们并不需要运行这些测试语句。一种解决方法是在import之前,将模块中的测试语句注释掉。Python有一种更优美的解决方法,就是使用__name__。
下面是一个简单的库程序TestLib.py。当直接运行TestLib.py时,__name__为”main“。如果被import的话,__name__为”TestLib”。
def lib_func(a):
return a + 10
def lib_func_another(b):
return b + 20
if __name__ == '__main__':
test = 101
print(lib_func(test))
我们在user.py中import上面的TestLib。
import TestLib
print(TestLib.lib_func(120))
你可以尝试不在TestLib.py中使用if name==’main‘, 并对比运行结果。
- 更多import使用方式
import TestLib as test # 引用TestLib模块,并将它改名为t
比如:
import TestLib as t
print(t.lib_func(120))
from TestLib import lib_func # 只引用TestLib中的lib_func对象,并跳过TestLib引用字段
这样的好处是减小所引用模块的内存占用。
比如:
from TestLib import lib_func
print(lib_func(120))
from TestLib import * # 引用所有TestLib中的对象,并跳过TestLib引用字段
比如:
from TestLib import *
print(lib_func(120))
二、查询
- 查询函数的参数
当我们想要知道某个函数会接收哪些参数的时候,可以使用下面方法查询。
import inspect
print(inspect.getargspec(func))
- 查询对象的属性
除了使用dir()来查询对象的属性之外,我们可以使用下面内置(built-in)函数来确认一个对象是否具有某个属性:
hasattr(obj, attr_name) # attr_name是一个字符串
例如:
a = [1,2,3]
print(hasattr(a,'append'))
- 查询对象所属的类和类名称
a = [1, 2, 3]
print(a.__class__)
print(a.__class__.__name__)
- 查询父类
我们可以用__base__属性来查询某个类的父类:
cls.base
例如:
print(list.__base__)
表示2进制,8进制和16进制数字
print(0b1110) # 二进制,以0b开头
print(0o10) # 八进制,以0o开头
print(0x2A) # 十六进制,以0x开头
三、搜索路径
当我们import的时候,Python会在搜索路径中查找模块(module)。比如上面import TestLib,就要求TestLib.py在搜索路径中。
我们可以通过下面方法来查看搜索路径:
import sys
print(sys.path)
四、字符串拼接
一个最常见的速度陷坑,许多短字串并成长字串时, 大家通常会用:
shortStrs = [ str0, str1, ..., strN]
#N+1个字串所组成的数列
longStr = ""
for s in shortStrs:
longStr += s
因为Python 里字串是不可变的, 所以每次 longStr += s 都是将原 来的 longStr 与 str 拷贝成一个新字串, 再赋给longStr. 随着 longStr的不断增长, 所要拷贝的内容越来越长. 最后导至str0被 拷贝N+1次, str1是N次, … .
首先在大家应先学会怎么去找出速度瓶颈: Python 自带有profile模块:
import profile
profile.run (’想要检查的函数名()’)
就会打印出那个函数里调用了几次其它函数, 各用了多少时间, 总共用了多少时间等信息,当然脑袋笨一点或是聪明一点的, 也可以用time模块中的time() 来显示系统时间, 减去上次的time()就是与它的间隔秒数了.
字串相并就头上的例子而言, 用 :
longStr="".join(shortStrs)
立马搞定, 但如果shortStrs里面不都是字串, 而包含了些数 字呢 ? 直接用join就会出错. 不怕, 这样来:
shortStrs = [str(s) for s in shortStrs[i]]
longStr ="".join(shortStrs)
也即先将数列中所有内容都转化为字串, 再用join.
对少数几个字串相并, 应避免用:
all = str0 + str1 + str2 + str3
而用:
all = ‘%s%s%s%s’ % (str0, str1, str2, str3)
五、循环
比如for循环. 当循环体很简单时, 则循环的调用前头(overhead) 会显得很臃肿, 此时map又可以帮忙了. 比如你想把一个长数列 l=[‘a’, ‘b’, …]中的每个字串变成大写, 可能会用:
import string
newL = []
for s in l:
newL.append( string.upper(s) )
用map就可以省去for循环的前头:
import string
newL = map (string.upper, l)
识别图中二维码,欢迎关注python宝典