Python2 vs 3 差异收集

__ future __ 模块

python3引入了一些python2不兼容的关键字和特性,但是可以用future模块在python2中使用python3的支持。 例如 from __ future__ import print
会导入python3的print_function
再按Python2的语法写print语句就会报错了。

feature optional in mandatory effect
nested_scopes 2.1.0b1 PEP 227: Statically Nested Scopes
generators 2.2.0a1 2.3 PEP 255: Simple Generators
division 2.2.0a2 3.0 PEP 238: Changing the Division Operator
absolute_import 2.5.0a1 3.0 PEP 328: Imports: Multi-Line and Absolute/Relative
with_statement 2.5.0a1 3.0 PEP 343: The “with” Statement
print_function 2.6.0a2 3.0 PEP 3105: Make print a function
unicode_literals 2.6.0a2 3.0 PEP 3112: Bytes literals in Python 3000

(Source)

其实差别在future模块的支持上已经可以看出来了,下面详细的介绍下

print 函数

print是最常用的语法,所以一般大家都知道。 python2的print可以同时语句使用。 python3则是函数,所以括号必不可少。

### python 2
print 'Hello', 'Python'  # 语句 statement, python作为关键字

print ('Hello, Python!')  #可以加(), 但其实这里会创建元组 tuple, 毕竟print是关键字

print "text", print 'print more text on the same line'

"""
我的笔记本设置的是python3内核,没装2,会报错
SyntaxError: Missing parentheses in call to 'print'
装了的切换成2运行
"""
  File "<ipython-input-6-8150a6f0ebec>", line 2
    print 'Hello', 'Python'  # 语句 statement, python作为关键字
                ^
SyntaxError: Missing parentheses in call to 'print'

# python 3
print('Hello Workd')
print("some text", end='') #去掉末尾换行,用来与下面打印在同一行
print('Python', 'World')
Hello Workd
some textPython World

整数除法

python3的整数实现相比于python2有点变化,内部的数据模型编程了变长的实现,python2内部就用long存储,是不变长的数据结构。更改造成了内部内存管理大的改动,不过这个不重要。

来看看整数除法. python2 中 / 的除法跟C语言是一致的,都是取整。 例如 3/2=1 ,如果2/3=0了,所以有的时候计算百分数的要记得转换成浮点数 float(2)/3。 要不然就会一直是0啊!!!

python 2中还有 // ,一样也是取整。

这样一来有点多余,python3就把/ 变成了' 真除', 跟数学上统一了,再也不用管类型转换了 3/2 = 1.5... 整数/整数也可以变成float了!! 但是为了python2同学们的心理健康,有的时候还是会加上类型转换,毕竟习惯了。

字符串

python2的字符串很坑,因为经常会遇到字符编码不一致,打印出错等问题。
看一下知识点
python 内部用Unicode实现字符串
如果遇到文件存储,字符串输出则需要将Unicode编码成对应的String,所以encode(), decode()的用法是String decode成Unicode, Unicode encode 成String ('Utf-8') , 但是用反了也不会报错,没效果就是了。

哪些地方用unicode,哪些地方用string我都是等报错了再改的,但是惯例是内部数据一贯用unicode, 直到最后输入输出再encode

### python 2.7

print type(unicode('haha'))  #生成unicode
print type(u'另一种写法')     # 生成unicode
print type('haha')   #生成string
print type(b'haha')  #string

# 然后就是互相encode decode 了
### python 3
"""
python 3 以后类型变了变,取消了u'df'的写法, 
"""

print(type("haha"))   # str类型
print(type(b'haha'))  # bytes类型

BytesIO , StringIO vs StringIO cStringIO

unicode and str
ByteIO and StringIO已经集成到内部的io模块了

xrange()

x开头的版本应该都表示生成器,前几天还看到了文件读写的xreadlines()版本,所谓的“lazy evaluation”, 比较省内存.
一个生成器(generator)默认只能遍历一遍, 因为他没有在内存中生成整个list

python3把range升级成了xrange, 所以取消了xrange

#### tip: python3里  __contains__  加速range,整形的比浮点型的运算快很多

x = 10000000

# python3 迭代器
def val_in_range(x, val):
    return val in range(x)
%timeit val_in_range(x, x/2)
%timeit val_in_range(x, x//2)

# python2的迭代器
def val_in_xrange(x,val):
    return val in xrange(x)
%timeit val_in_range(x, x/2)


# 说是添加__contains__ 才有的效果,关注下
304 ms ± 16.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
642 ns ± 29.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
347 ms ± 13.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Exception

Python2 支持 raise IOError, "file error" 和 raise IOError("file error")
Python3只支持后者, 如果要打印,还得加上as err

next

Python3 只支持next()函数 不支持 .next 方法

#
a = ( i for i in "abc")
next(a) #right
a.next() # AttributeError
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-11-eead8b4f9249> in <module>()
      2 a = ( i for i in "abc")
      3 next(a) #right
----> 4 a.next() # AttributeError

AttributeError: 'generator' object has no attribute 'next'

列表表达式

列表表达式的作用域缩小,不再影响外围,

print()'Python', python_version())

i = 1
print('before: i =', i)

print ('comprehension: ', [i for i in range(5)])

print ('after: i =', i)  # i will be 4 in python 2.7,  still be 1 in python3

input()

Python2.7 input() 返回各自的数据类型 raw_input()始终返回str
Python3 input()直接就返回string了

round()

四舍五入法python3也做了改进,采用现在广泛的用法舍入0.5 。 就是舍成最接近的偶数

例如:

from platform import python_version
print('Python', python_version())
print(round(16.5))

round(17.5)
Python 3.6.2
16
Out[12]:
18

Reference

  1. http://sebastianraschka.com/Articles/2014_python_2_3_key_diff.html
  2. http://lucumr.pocoo.org/2014/5/12/everything-about-unicode/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359

推荐阅读更多精彩内容