我爱编程

漫谈Python(1)

2017-07-07  本文已影响93人  斐波那契的数字

接上一篇  

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

关于你不想知道的所有Python3 unicode特性

Python 3 正在毁灭 Python

Python 3 能振兴 Python

Python 3 is fine

Should I use Python 2 or Python 3 for my development activity?

What's New In Python 3.0

Porting to Python 3

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/

下载Python 源代码

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, 请选择重新启动服务器)

python –V

疑问或问题

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的基本语法和数据结构吧"

上一篇 下一篇

猜你喜欢

热点阅读