漫谈Python(1)

作者: 斐波那契的数字 | 来源:发表于2017-07-07 08:27 被阅读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的基本语法和数据结构吧"

相关文章

  • 漫谈Python(1)

    接上一篇 PS: 在本篇中 你会了解到: 1.Python3.5 在Linux平台上的安装步骤 2.Python...

  • 漫谈 Clustering

    漫谈 Clustering (1): k-means 漫谈 Clustering (2): k-medoids 漫...

  • elasticsearch-python-sdk

    前言 这里声明: elasticsearch -> es 漫谈 我们都知道Python 下 有es的sdk包的,我...

  • 漫谈python(2)

    这是漫谈python系列的三篇,本篇会简单的介绍 Python的基本语法和数据结构。 转眼间,暑假已经来临。 小李...

  • 漫谈Python(0)

    0. 前言 2015年,9月. 李狗剩大学毕业,顺利地考入了当地的一所大学.正式的成为了一名研究生. 他满怀着硕士...

  • 漫谈(1)

    写点东西的欲望,可能是漫长日子的解药。写什么都无所谓,只要看到字一个一个蹦出来,组成词语、句子、段落,就可以找到...

  • 视力的自然恢复之路

    完美的视力,你值得拥有! 本文将从以下几个方面阐述视力 1,漫谈视力的下降? 2,如何得到完美视力? 3,漫谈视...

  • 漫谈培训简史(完结篇)

    前情回顾: 漫谈培训简史(一) 漫谈培训简史(二) 漫谈培训简史(三) 漫谈培训简史(四) 二战结束了,人类文明进...

  • Python 装饰器漫谈

    参考资料 http://python.jobbole.com/81683/ Python的命名空间任何一个变量在创...

  • 漫谈Python的Namespace

    编程派微信号:codingpy 本文约 7456 字,读完可能需要 19 分钟。作者:shomy原文链接:http...

网友评论

    本文标题:漫谈Python(1)

    本文链接:https://www.haomeiwen.com/subject/ekdkhxtx.html