PS: 在本篇中 你会了解到:
1.Python3.5 在Linux平台上的安装步骤
2.Python3.5 与Python2.7 的区别
不一会儿, 小李又来找志强了,"师兄, 那个啥.....我是应该安装Python2.7还是Python3.5呢? 我在官网上看的版本说明看的头大 "
志强听了,说道:"我应该学习哪个版本的Python。对于这个问题,对于初学者来说很常见. 我的回答是“先选择一个最适合你的Python教程,教程中使用哪个版本的Python,你就用哪一个版本。教程的选取可以从书籍资料、教学视频、实例代码这三个方面来参考。学得差不多了,再来研究不同版本之间的差别. 大部分Python库都同时支持Python 2.7.x和3.x版本的,所以不论选择哪个版本都是可以的。但为了在使用Python时避开某些版本中一些常见的陷阱或需要移植某个Python项目时,依然有必要了解一下Python两个常见版本之间的主要区别不过既然你问了,我也不妨给你解答一下 : "
Python3.5 与Python2.7 的区别
PS: 这里会简单的叙述Python3.5 和Python2.7几个比较重要的区别 。Python 3.x引入了一些与Python 2不兼容的关键字和特性,在Python2中,可以通过内置的__future__模块导入这些新内容。如果你希望在Python 2环境下写的代码也可以在Python3.x中运行,那么建议使用__future__模块。例如,如果希望在Python 2中拥有Python 3.x的整数除法行为,可以通过下面的语句导入相应的模块。
from__future__import division
至于更多的细节,可以参看这里
1. print函数
Python 2中的print语句被Python 3中的print()函数取代,这意味着在Python 3中必须用括号将需要输出的对象括起来。Python3.5语法要比之前更为严格。
在Python 2中使用额外的括号也是可以的, 但是在Python3中却是必须带括号的,否则会引起SyntaxError
# 可以尝试着在Python2/3 环境下输入一下语句,体验一下区别
print 'Hello, World!'
print('Hello, World!')
2. 整数除法
Python3 在除法上对Python2 进行了改进:
Python 3在整数除法上的改动(写错了也不会触发Syntax Error),所以在移植代码或在Python 2中执行Python 3的代码时,需要特别注意这个改动。
所以,我还是会在Python 3的脚本中尝试用float(3)/2或 3/2.0代替3/2,以此来避免代码在Python2环境下可能导致的错误(或与之相反,在Python 2脚本中用from __future__ import division来使用Python3的除法)
print('Python', python_version())
##尝试采用不同的环境来检查结果
print('3 / 2 =',3/2)
print('3 // 2 =',3//2)
print('3 / 2.0 =',3/2.0)
print('3 // 2.0 =',3//2.0)
3. Unicode
Python 2有基于ASCII的str()类型,其可通过单独的unicode()函数转成unicode类型,但没有byte类型。而在Python 3中,终于有了Unicode(utf-8)字符串,以及两个字节类:bytes和bytearrays。
print type(unicode('this is like a python3 str type'))
print type(b'byte type does not exist')
print('strings are now utf-8 u03BCnicou0394é!')
print(' also has',type(bytearray(b'bytearrays')))
4. xrange
在Python 2.x中,经常会用xrange()创建一个可迭代对象,通常出现在“for循环”或“列表/集合/字典推导式”中。
这种行为与生成器非常相似(如”惰性求值“),但这里的xrange-iterable无尽的,意味着可能在这个xrange上无限迭代。
由于xrange的“惰性求知“特性,如果只需迭代一次(如for循环中),range()通常比xrange()快一些。不过不建议在多次迭代中使用range(),因为range()每次都会在内存中重新生成一个列表。
在Python 3中,range()的实现方式与xrange()函数相同,所以就不存在专用的xrange()(在Python 3中使用xrange()会触发NameError)。
PS: 这里暂时不对xrange()和range展开,后期会有对Python2.7 下的xrange /range 的话题
5.异常
Python 2支持新旧两种异常触发语法,而Python 3只接受带括号的的语法(不然会触发SyntaxError)
PS: 这里也不做过多的介绍,后期会详细介绍。
6. 异常处理
在Python 2 中的异常处理一般是这种形式
print 'Python', python_version()
try:
let_us_cause_a_NameError
except NameError, err:
print err,'--> our error message'
但是在Python3.5中是这样的:
print('Python', python_version())
try:
let_us_cause_a_NameError
except NameError as err: # as 作为别名
print(err,'--> our error message')
2. next()函数和.next()方法
由于会经常用到next()(.next())函数),所以还要提到另一个语法改动(实现方面也做了改动):在Python
2.7.5中,函数形式和方法形式都可以使用,而在Python3中,只能使用next()函数(试图调用.next()方法会触发AttributeError)。
# 再举一个栗子:
my_generator=(letter for letter in'abcdefg') # 生成了一个list
#在python2.7 中调用
my_generator.next()
#在Python3.5中调用
next(my_generator) # 输出的 'a'
my_generator.next() # 抛出异常
#Python2.7 中调用
my_generator.next() # 输出的是'b'
For循环变量与全局命名空间泄漏
这个也应该是好消息: 在Python 3.x中,for循环中的变量不再会泄漏到全局命名空间中了。
这是Python 3.x中做的一个改动,在“What's New In Python 3.0”中有如下描述:
“列表推导不再支持[... for var in item1, item2, ...]这样的语法,使用[... for var in
(item1, item2,
...)]代替。还要注意列表推导有不同的语义:现在列表推导更接近list()构造器中的生成器表达式这样的语法糖,特别要注意的是,循环控制变量不会再泄漏到循环周围的空间中了。”
相关的资料:
awesome features of Python that you can't use because you refuse to upgrade to Python 3
Should I use Python 2 or Python 3 for my development activity?
Porting Python 2 Code to Python 3
How keep Python 3 moving forward
听了志强的一番陈述. 小李似乎对Python3.5 更有兴趣了. 于是小李开始动手安装Python3.5了;
"嘿,等等",志强对小李说:"记得把安装手册发个我啊";
不一会儿, 小李便把安装手册发给我了志强。。。。
Linux环境下编译安装python3
由于一般的Linux系统下默认系统自带python2.*的版本,这个版本被系统很多程序所依赖,所以不建议删除,如果使用最新的Python3那么我们知道编译安装源码包和系统默认包之间是没有任何影响的,所以可以安装python3和python2共存。
首先去python官网下载python3的源码包,网址:https://www.python.org/
1 安装
./configure --prefix=/usr/python #添加配置,指定安装目录
make -j40 # 编译python , j后面的数字和系统CPU核数有关,普通的设置为j4就好了
sudo make install # 执行安装
如图所示:
整个过程大约5-10分钟,安装成功之后,安装目录就在/usr/python
系统中原来的python在/usr/bin/python,通过ls -l可以看到,python是一个软链接,链接到本目录下的python2.6.
我们可以把这个删除,也可以新建一个python3的软链接,只不过执行时python要改成python3,或者python脚本头部声明要改为#!/usr/bin/python3
这里为了方便建议先重命名一下,然后建立个软链接就可以了,之前的程序头部也不用更改:
## 修改系统默认版本
$sudo mv /usr/bin/python /usr/bin/python.bak
$sudo ln -s /usr/python/bin/python3 /usr/bin/python
##修改本地用户版本
$sudo mv /usr/bin/python /usr/bin/python2.6 ##对系统默认版本python进行操作
这样就建立好了,以后直接执行python命令,就相当于调用python3,实际上python3也是个软链接,链接到python3.5.1,这个多次链接其实不影响,主要是为了版本升级更加方便,不用改版本号了
尝试着使用 python –V 命令:
(如果在sudo python –V 中显示python3.5 , 但是在python -V 显示为python2.7, 请选择重新启动服务器)
疑问或问题
3.1 如果还想使用python2.7 怎么办?
在原有的python 文件的第一行中添加python2.7 的路径:
#!/usr/bin/python.bak
或者是
#!/usr/bin/python2.7*
以上两句都是用于指定使用python 的版本.
3.2 接下来是另一个问题: pip2.7 与pip3 的问题:
注意:当安装好新版本的python后,会出现 pip2 和pip3 ; 这两个命令是有区别的,区别如下:
1- 安装的后的包位置不同
2- Pip2 /3 安装后都是仅适用于各自版本。
志强看过以后对小李说到: "嗯, 写的还可以。那明天开始动手练习Python的基本语法和数据结构吧"