python 的一些有趣的东西(偏函数、闭包、字符、类的函数化(__call__))

下面是一些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 strunicode

python 2str 表示的是二进制的形式的,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

稍等片刻…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值