下面是一些python的用法和最佳实践
python 偏函数
对于有很多参数的函数,调用起来很麻烦例如:
def test(arg1, arg2, arg3):
print arg1, arg2, arg3
test(1,2,3)
如果前几个参数在某些环境下不经常变,可以使用偏函数重新构造以简化参数列表
import functools
def test(arg1, arg2, arg3):
print arg1, arg2, arg3
t2_3 = functools.partial(test, 1)
t3 = functools.partial(test, 1, 2)
t2_3(2, 3)
t3(3)
当然,对于一些关键字参数可以使用 a=1 进行固定(传参)
这里也就是分为两个时间进行传参了,一个是定义的时候传参,一个是调用时候传参
在一些回调里面,默认是只有一个参数,如果要传入多个参数,可以使用这种方式,,
只不过,回调时的单个参数默认是在最后一个。其他参数在前
python 闭包
简单来说就是内嵌到函数中的函数,这就称为闭包。通常它会使用函数作用域的变量。
注意在闭包内部使用外部变量的时候,如果直接赋值,则是在闭包内部直接定义了变量
如果是使用则会去使用外部的变量,所以一般要想编写有状态的闭包的时候通常是用列表,元组或字典的方式
例如:
下面的写法是有问题的,因为要记录状态,然后是直接赋值,直接修改的闭包内的变量,外部的变量始终没有被修改
def out_func(test_var):
out_var_flag = False
def closure(x):
if x > 0:
out_var_flag = True # Wrong Wrong Wrong Wrong Wrong Wrong
closure(test_var)
return out_var_flag
可以像相面这样, 使用列表、字典、元组
def out_func(test_var):
out_var_flag = [False]
def closure(x):
if x > 0:
out_var_flag[0] = True
closure(test_var)
return out_var_flag[0]
因为是先使用(out_var_flag[0]
),解释器就会由内向外逐渐查找,看有没有变量(没有则创建报错),
这里就找到了外层的变量,进而后面的获取到第一个元素,然后它进行赋值
注意,这里是使用了有状态的闭包,但是不建议这样做
可以像下面一样,使用覆写了__call__
的类来模拟函数行为,并且也保存了状态信息
python str
与 unicode
在python 2中 str
表示的是二进制的形式的,unicode
表示的是unicode字符串
一般在代码里面,是unicode字符串。
它们之间是 str
经过decode
得到 unicode
字符串,
unicode
字符串通过 encode
得到 str
二进制字串
例如:
s = "abc"
print type(s) # str
u = u"abc"
print type(u) # unicode
print type(u.encode("utf-8")) # str
s = "你好"
print type(s.decode("utf-8")) # unicode
对于一些混用的,可以使用下面这种方式,unicode_escape, string_escape
前者直接将unicode字串进行编码,得到类似于\\u4f60\\u597d
这样的
后者是直接对其进行解码的。
python __call__
使得类的实例具有函数一样的功能可以被调用,xx()
可以使得实现带有状态的函数一样的功能。
class Counting(object):
def __init__(self):
self.count = 0
def __call__(self, *args, **kwargs):
self.count += 1
count = Counting()
count()
count()
print count.count
# 2
python 类的classmethod property mix-in
稍等片刻…