语言特性篇(一)

语言特性篇(一)
最新回答
拥欲

2026-10-30 08:58:13

Python语言特性篇(一)

动态强类型

Python是一种动态的强类型语言,动态指运行期间才做数据类型检查,强类型是针对类型检查的严格程度而言的。例如:

print(1+'1')# 发生异常: TypeError,unsupported operand type(s) for +: 'int' and 'str'print(1+int('1'))# 输出:2
  • 与弱类型语言对比:JavaScript属于弱类型语言,允许变量类型的隐式转换,如字符串和数值可以自动转化,而Python需要显式类型转换。
强类型的优点
  • 编译时刻检查错误类型匹配:提高程序的安全性。
  • 优化运算:根据对象类型优化相应运算,提高目标代码的质量。
  • 减少运行时刻开销:避免运行时类型检查的开销。
Python作为动态语言的特性
  • 鸭子类型:更关注对象的行为而不是类型。例如:

    file、StringIO、socket对象都支持read/write方法。

    定义了__iter__魔术方法的对象都支持for迭代。

    class Dog: def howl(self): print("汪汪汪")class Cat: def howl(self): print("喵喵喵")animal=Dog()animal.howl()animal=Cat()animal.howl()
  • 猴子补丁(运行时属性替换):当gevent库需要修改内置的socket时,就可以使用moncky.patch_socket()。class Demo: def bar(self): print("Demo.bar")def patch_bar(self): print("this is a monley patch!")Demo().bar()Demo.bar=patch_barDemo().bar()
  • 自省(运行时判断对象类型的能力):Python中比较常见的自省机制(函数用法)有:dir(),type(),hasattr(),isinstance()。通过这些函数,我们能够在程序运行时得知对象的类型,判断对象是否存在某个属性,访问对象的属性。def add(x,y): if isinstance(x,int) and isinstance(y,int): print(x+y) else: print("Warning!!!at least one parameter is not an integer!") add(1,2)add('1',2)

Python2和Python3

Python的每个新版本都会增加一些新的功能,或者对原来的功能作一些改动。有些改动是不兼容旧版本的,也就是在当前版本运行正常的代码,到下一个版本运行就可能不正常了。直接把代码升级到3.x是比较冒进的,因为有大量的改动需要测试。相反,可以在2.x版本中先在一部分代码中测试一些3.x的特性,如果没有问题,再移植到3.x也不迟。

区别
  • 性能:

    Py3.0运行pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间,在字符串和整形操作上可以取得很好的优化结果。Py3.1性能比Py2.5慢15%,还有很大的提升空间。

  • 编码:

    Py3.X源码文件默认使用utf-8编码,以下代码是合法的:

    中国 = 'china' print(中国) # 输出:china
  • 语法:

    去除了<>,全部改用!=。

    在Python 2里,为了得到一个任意对象的字符串表示,有一种把对象包装在反引号里(比如x)的特殊语法。在Python 3里,这种能力仍然存在,但是不能再使用反引号获得这种字符串表示,需要使用全局函数repr(x)。

    关键词加入as和with,还有True,False,None。

    整型除法返回浮点数,要得到整型结果,请使用//。

    加入nonlocal语句。使用noclocal x可以直接指派非全局变量。

    去除print语句,加入print()函数实现相同的功能。同样的还有exec语句,已经改为exec()函数。

    改变了顺序操作符的行为,例如x<y,当x和y类型不匹配时抛出TypeError而不是返回随机的bool值。

    输入函数改变了,删除了raw_input,用input代替:

    2.X:guess = int(raw_input('Enter an integer : '))

    3.X:guess = int(input('Enter an integer : '))

    支持class decorator。用法与函数decorator一样。

    字符串和字节串:

    Python 2有两个全局函数可以把对象强制转换成字符串:unicode()把对象转换成Unicode字符串,还有str()把对象转换为非Unicode字符串。

    Python 3只有一种字符串类型,Unicode字符串,所以str()函数即可完成所有的功能。(unicode()函数在Python 3里不再存在了。)

转换
  • 2to3:对要转换的文件执行2to3脚本。

def greet(name): print "Hello, {0}!".format(name)print "What's your name?"name = raw_input()greet(name)# 2to3 -w demo.pydef greet(name): print("Hello, {0}!".format(name))print("What's your name?")name = input()greet(name)共存
  • __future__模块:Python提供了__future__模块,把下一个新版本的特性导入到当前版本,于是就可以在当前版本中测试一些新版本的特性。举例说明如下:

    在Python 2.x中,对于除法有两种情况,如果是整数相除,结果仍是整数,余数会被扔掉;要做精确除法,必须把其中一个数变成浮点数。

    在Python 3.x中,所有的除法都是精确除法,整数相除用//表示。

    如果想在Python 2.7的代码中直接使用Python 3.x的除法,可以通过__future__模块的division实现:

    from __future__ import divisionprint 10/3# 输出:3.33333333333print 10//3# 输出:3print 10.0/3# 输出:3.33333333333
  • six(为什么叫six?因为2 * 3 = 6):six提供了一个兼容的方案,使用six写的代码可以不用修改就运行在Python2或Python3上。注意这个six并不是让Python2写的代码兼容Python3,而是需要同时运行在Python2和Python3上!six对Python2和Python3的名字等做了统一,比如Python2的字符串叫str,Python3叫unicode,那么就可以使用six.text_type。Python2:>>> import six>>> s = u"hello">>> type(s)<type 'unicode'>>>> isinstance(s, six.text_type)TruePython3:>>> import six>>> s = "hello">>> type(s)<class 'str'>>>> isinstance(s, six.text_type)True

参考链接

  • python2和python3的区别、转换及共存