Python2转Python3

发表信息: by

Python3 学习

背景

为什么学Python3?

    我本身会python2,但python3毕竟比python3高级,而我又觉得python这门语言,写起来真的很舒服,索性提升一下自己,学习python3,以后也只用python3来做python的开发

发展历史

    Python3 2008年12月发布,python2 2000年10月发布

焦点

    这里只写与python2中不同的部分

语法变化

print语法

  • Print方法需要括号

print ‘xxxx' -> print(‘xxxx’).

Unicode编码

  • python3 源码文件,默认使用 utf-8, 不需要主动在文件头加标注了
# python2
>>> str = "我爱北京天安门"
>>> str
'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8'
>>> str = u"我爱北京天安门"
>>> str
u'\u6211\u7231\u5317\u4eac\u5929\u5b89\u95e8'

# python3
>>> str = "我爱北京天安门"
>>> str
'我爱北京天安门'

除法运算

  • python3 中 / 是小数除法,即如果是两个整数 / 也会出现 浮点数
  • python3 中 // 是地板除法
  • python3 中如果舍弃小数点部分,需要用 math.trunc

异常处理

  • python3 的catch异常的语法是 except SomeException as e
  • python3 直邮继承BaseException的对象,才可以被抛出

迭代器range

  • python3 中,没有xrange(), 只有range, 而range实现了 xrange

八进制字面量表示

  • 八进制数必须写成0o777,原来的形式0777不能用了。
  • 新增了一个bin()函数用于将一个整数转换成二进制字串。

不等运算符

  • python3 只有!=, 没有 <>

repr表达式

  • python3 去掉了 //`` 这种语法,只能使用 repr() 函数

模块换名

  • _winreg -> winreg
  • ConfigParser -> configparser
  • copy_reg -> copyreg
  • Queue -> queue
  • SocketServer -> socketserver
  • rear -> reprlib
  • StringIO模块现在被合并到新的io模组内。 new, md5, gopherlib等模块被删除
  • httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合并到http包内。
  • 取消了exec语句,只剩下exec()函数。

数据类型

  • 去除了long 类型,只有int,但表现就是long
  • 新增bytes,
  • dict的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有 dict.has_key(),用 in替代它吧 。

全局变量

  • python3 新增 nonlocal 关键字
# python2
def func():
	c = 1
	def foo():
		c = 2
	foo()
	print(c)
func() # 1

# python3
def func():
	c = 1
	def foo():
		nonlocal c
		c = 2
	foo()
	print(c)
func() # 2

只有新式类

  • 不需要 class F(object): pass 了,可以直接用 class F(): pass

项目路径

  • python3 使用 绝对路径导入
"""
文件路径如下:

test/
 - main.py
 - lib/
    - __init__.py
    - some_func.py
    - other_func.py
"""

# python 3, 在 some_func.py 中引入  other_func.py

from lib import other_func