简介
- 由于我要看到书和视频教程都是使用Python2.x来编写的,而这里准备使用的Python是3.6的版本,所以我觉得有必要在此之前了解这两个版本的不同之处。
- 由于这也是面试经常被问到的问题,所以这里准备了两个方面:
(1)系统分析两者的不同。
(2)面试时候的回答内容。
不同之处
(1)系统分析两者的不同:
Python2.x与3.x版本区别-菜鸟教程
Python2.x与3.x版本区别
在这里做一个简单的总结:
1.性能上:Python2.x较Python3.x性能较高,不过Python3.x毕竟还在发展,所以有很大的提升空间。
2.这里主要讲语法上:
- 在编码上:(各种编码的不同之处) Python3.X 源码文件默认使用utf-8编码。
#Python2.x
>>> 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.x
>>> str = "我爱北京天安门"
>>> str
'我爱北京天安门'
print 函数:print语句没有了,取而代之的是print()函数。当然2.6和2.7也支持print()(exec语句被python3废弃,统一使用exec函数)
print "fish" #3.x不支持 print ("fish") #注意print后面有个空格 print("fish") #print()不能带有任何其它参数
除法运算 Python3.x使用‘/’表示浮点数运算
#Python 2.x: >>> 1 / 2 0 >>> 1.0 / 2.0 0.5 #Python 3.x: >>> 1/2 0.5
当然如果要在Python中还有一个符号‘//’(java中表注释)为执行一个floor(向下取整其中向上取整为ceil)
#Python(2.x and 3.x) >>> -1 // 2 -1
这里对floor、ceil和trunc做一个区别
#Python2.x在此floor、ceil、trunc会表现为浮点数形式
print(6/5)#输出结果为1.2
print( math.floor(6/5)) #输出结果1
print( math.ceil(6/5))#输出结果2
print( math.trunc(6/5))#输出结果1
print( 6//5)#输出结果1
#可见floor取最小整数(去除小数位)输出和trunc(截取整数一致),
#而ceil是去整数部分+1
- 不等运算符
Python 2.x中不等于有两种写法 != 和 <>
Python 3.x中去掉了<> - 去掉了repr表达式 “
Python2.x可以使用反引号 “ 代表repr()
Python 3.x 中去掉了“这种写法,只允许使用repr函数
#这里讲解下repr()和str()的区别:
#函数str() 用于将值转化为适于人阅读的形式,
#而repr() 转化为供解释器读取的形式
#例如
#Python2.x
>>> print repr("hello, world!")
'hello, world!'
>>> print repr(1000L) #注意Python3.x不在支持long型所以Python3.x会报错
1000L
>>> print str("hello, wolrd!")
hello, wolrd!
>>> print str(1000L)
1000
#顺便扩展下eval()函数
#eval()官方文档里面给出来的功能解释是:
#将字符串string对象转化为有效的表达式参与求值运算返回计算结果
- 数字类型去除long型
1)Py3.X去除了long类型,现在只有一种整型——int,但它的行为就像2.X版本的long
2)新增了bytes类型,对应于2.X版本的八位串,定义一个bytes字面量的方法如下:
>>> b = b'china'
>>> type(b)
<type 'bytes'>
#str对象和bytes对象可以使用.encode() (str -> bytes) or .decode()
# (bytes -> str)方法相互转化。
>>> s = b.decode()
>>> s
'china'
>>> b1 = s.encode()
>>> b1
b'china'
range模块
对于Python2.x中有xrange()和range()的区别:可参考博文Python2.x中xrange和range的区别
而Python3.x则废除xrange而采用range()来代替,且功能更加强大
Python3.x中的xrange和Python2.x中range的区别
在 Python 3 中,range() 是像 xrange() 那样实现以至于一个专门的 xrange() 函数都不再存在(在 Python 3 中xrange() 会抛出命名异常)。
在 Python 2 中 xrange() 创建迭代对象的用法是非常流行的。比如: for 循环或者是列表/集合/字典推导式。
这个表现十分像生成器(比如。“惰性求值”)。但是这个 xrange-iterable 是无穷的,意味着你可以无限遍历。
由于它的惰性求值,如果你不得仅仅不遍历它一次,xrange() 函数 比 range() 更快(比如 for 循环)。尽管如此,对比迭代一次,不建议你重复迭代多次,因为生成器每次都从头开始。先写到这里,后续学习将加以完善,也希望路过的朋友可以在评论区补充下谢谢
面试回答
问:是否了解Python2.7.x与Python3.x的主要差异?
答:
· 使用 _ future _ 模块(用于旧版本向新版本更替)
· print 函数(Python3.x仅仅可以使用print())
· int代替long型
· Unicode(Python3.x默认使用utf-8)
· xrange(Python3.x不在支持xrange)
· Raising exceptions
· Handling exceptions
· next() 函数 和 .next() 方法
· For 循环变量和全局命名空间泄漏
· 比较不可排序类型
· 通过 input() 解析用户的输入
· 返回可迭代对象,而不是列表