Python小技巧

在这里列举一些我使用Python时积累的小技巧。这些技巧是我在使用Python过程中经常使用的。之前很零碎的记在笔记本中,现在整理出来,和大家分享。

一、import模块

在Python经常使用import声明,以使用其他模块(也就是其它.py文件)中定义的对象。

  1. 使用__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', 并对比运行结果。

  1. 更多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))
复制代码

二、查询

  1. 查询函数的参数

当我们想要知道某个函数会接收哪些参数的时候,可以使用下面方法查询。

import inspect
print(inspect.getargspec(func))
复制代码
  1. 查询对象的属性

除了使用dir()来查询对象的属性之外,我们可以使用下面内置(built-in)函数来确认一个对象是否具有某个属性:

hasattr(obj, attr_name)   # attr_name是一个字符串

例如:

a = [1,2,3]
print(hasattr(a,'append'))
复制代码
  1. 查询对象所属的类和类名称
a = [1, 2, 3]
print(a.__class__)
print(a.__class__.__name__)
复制代码
  1. 查询父类

我们可以用__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全套视频资料
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值