python2 与 python3的区别 (5)

python2,函数的代码可用访问到函数本身的特殊属性。python3为了一致性,这些特殊属性被重命名了。

python2 python3 备注
a_function.func_name   a_function.__name__   __name__属性包含了函数的名字  
a_function.func_doc   a_function.__doc__   __doc__包含了函数源代码定义的文档字符串  
a_function.func_defaults   a_function.__defaults__   是一个保存参数默认值的元组  
a_function.func_dict   a_function.__dict__   __dict__属性是一个支持任意函数属性的名字空间  
a_function.func_closure   a_function.__closure__   __closure__属性是由cell对象组成的元组,包含了函数对***变量的绑定  
a_function.func_globals   a_function.__globals__   是对模块全局名字空间的引用  
a_function.func_code   a_function.__code__   是一个代码对象,表示编译后的函数体  
I/O方法XREADLINES()

python2中,文件对象有一个xreadlines()方法,返回一个迭代器,一次读取文件的一行。这在for循环中尤其实用。python3中,xreadlines()方法不再可用。

lambda函数

在python2中,可以定义匿名函数lambda函数,通过指定作为参数的元组的元素个数,使这个函数实际上能够接收多个参数。python2的解释器把这个元组"解开“成命名参数,然后可以在lambda函数里引用它们。在python3中仍然可以传递一个元组为lambda函数的参数。但是python解释器不会把它当成解析成命名参数。需要通过位置索引来引用每个参数。

python2 python3 备注
lambda (x,): x + f(x)   lambda x1 : x1[0] + f(x1[0])   注1  
lambda (x,y): x + f(y)   lambda x_y : x_y[0] + f(x_y[1])   注2  
lambda (x,(y,z)): x + y + z   lambda x_y_z: x_y_z[0] + x_y_z[1][0]+ x_y_z[1][1]   注3  
lambda x,y,z: x+y+z   unchanged   注4  

注1:如果定义了一个lambda函数,使用包含一个元素的元组作为参数,python3中,会被转换成一个包含到x1[0]的引用的lambda函数。x1是2to3脚本基于原来元组里的命名参数自动生成的。

注2:使用含有两个元素的元组(x,y)作为参数的lambda函数被转换为x_y,它有两个位置参数,即x_y[0]和x_y[1]

注3:2to3脚本可以处理使用嵌套命名参数的元组作为参数的lambda函数。产生的结果有点晦涩,但python3下和python2的效果是一样的。

注4:可以定义使用多个参数的lambda函数。语法在python3同样有效

特殊的方法属性

在python2里,类方法可以访问到定义他们的类对象,也能访问方法对象本身。im_self是类的实例对象;im_func是函数对象,im_class是类本身。在python3里,这些属性被重命名,以遵循其他属性的命名约定。

python2 python3
aClassInstance.aClassMethod.im_func   aClassInstance.aClassMethod.__func__  
aClassInstance.aClassMethod.im_self   aClassInstance.aClassMethod.__self__  
aClassInstance.aClassMethod.im_class   aClassInstance.aClassMethod.__self__.__class__  
__NONZERO__特殊方法

在python2里,可以创建自己的类,并使他们能够在布尔上下文中使用。举例来说,可以实例化这个类,并把这个实例对象用在一个if语句中。为了实现这个目的,可以定义一个特别的__nonzero__()方法,它的返回值为True或False,当实例对象处在布尔上下文中的时候这个方法就会被调用。在python3中,仍然可以完成同样的功能,但这个特殊方法的名字改为了__bool__()

比如python2中

class A: def __nonzero__(self): pass

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgzxwf.html