百科问答小站 logo
百科问答小站 font logo



Python 2 和 Python 3 有哪些主要区别? 第1页

  

user avatar   zhijun-liu 网友的相关建议: 
      

print

在进行程序调试时用得最多的语句可能就是 print,在 Python 2 中,print 是一条语句,而 Python3 中作为函数存在。有人可能就有疑问了,我在 Python2 中明明也看到当函数使用:

       # py2 print("hello")  # 等价 print  ("hello")  #py3 print("hello")      

然而,你看到的只是表象,那么上面两个表达式有什么区别?从输出结果来看是一样的,但本质上,前者是把 ("hello")当作一个整体,而后者 print()是个函数,接收字符串作为参数。

       # py2 >>> print("hello", "world") ('hello', 'world')  # py3 >>> print("hello", "world") hello world      

这个例子更明显了,在 py2 中,print语句后面接的是一个元组对象,而在 py3 中,print 函数可以接收多个位置参数。如果希望在 Python2 中 把 print 当函数使用,那么可以导入 future 模块 中的 print_function

       # py2 >>> print("hello", "world") ('hello', 'world') >>>  >>> from __future__ import print_function >>> print("hello", "world") hello world      

编码

Python2 的默认编码是 asscii,这也是导致 Python2 中经常遇到编码问题的原因之一,至于是为什么会使用 asscii 作为默认编码,原因在于 Python这门语言诞生的时候还没出现 Unicode。Python 3 默认采用了 UTF-8 作为默认编码,因此你不再需要在文件顶部写 # coding=utf-8 了。

       # py2 >>> sys.getdefaultencoding() 'ascii'  # py3 >>> sys.getdefaultencoding() 'utf-8'      

网上不少文章说通过修改默认编码格式来解决 Python2 的编码问题,其实这是个大坑,不要这么干。

字符串

字符串是最大的变化之一,这个变化使得编码问题降到了最低可能。在 Python2 中,字符串有两个类型,一个是 unicode,一个是 str,前者表示文本字符串,后者表示字节序列,不过两者并没有明显的界限,开发者也感觉很混乱,不明白编码错误的原因,不过在 Python3 中两者做了严格区分,分别用 str 表示字符串,byte 表示字节序列,任何需要写入文本或者网络传输的数据都只接收字节序列,这就从源头上阻止了编码错误的问题。

True和False

True 和 False 在 Python2 中是两个全局变量(名字),在数值上分别对应 1 和 0,既然是变量,那么他们就可以指向其它对象,例如:

       # py2 >>> True = False >>> True False >>> True is False True >>> False = "x" >>> False 'x' >>> if False: ...     print("?") ...  ?      

显然,上面的代码违背了 Python 的设计哲学 Explicit is better than implicit.。而 Python3 修正了这个缺陷,True 和 False 变为两个关键字,永远指向两个固定的对象,不允许再被重新赋值。

       # py3 >>> True = 1   File "<stdin>", line 1 SyntaxError: can't assign to keyword      

迭代器

在 Python2 中很多返回列表对象的内置函数和方法在 Python 3 都改成了返回类似于迭代器的对象,因为迭代器的惰性加载特性使得操作大数据更有效率。Python2 中的 range 和 xrange 函数合并成了 range,如果同时兼容2和3,可以这样:

       try:     range = xrange except:     pass      

另外,字典对象的 dict.keys()、dict.values() 方法都不再返回列表,而是以一个类似迭代器的 "view" 对象返回。高阶函数 map、filter、zip 返回的也都不是列表对象了。Python2的迭代器必须实现 next 方法,而 Python3 改成了 __next__

nonlocal

我们都知道在Python2中可以在函数里面可以用关键字 global 声明某个变量为全局变量,但是在嵌套函数中,想要给一个变量声明为非局部变量是没法实现的,在Pyhon3,新增了关键字 nonlcoal,使得非局部变量成为可能。

       def func():     c = 1     def foo():         c = 12     foo()     print(c) func()    #1      

可以对比上面两段代码的输出结果

       def func():     c = 1     def foo():         nonlocal c         c = 12     foo()     print(c) func()   # 12      

其实很多内建模块也做了大量调整,Python3 中的模块组织更加清晰,类更加先进,还引入了异步IO,先写这么多

-------更新-------

多谢知友 @YFdyh 指出,py2出现的时候其实已经有了unicode统一编码了,只不过py2为了向后兼容还是沿用了py1.x的设计逻辑


user avatar   jing-lue-ji-zhi 网友的相关建议: 
      

当感情成为生活的一种负担而且无力改变的时候。

与女生不同,大多数男生是不会把感情当作生活的全部的,过日子是头等大事,感情只是其中一部分。所以对于男生来说,一段好的感情是能让生活更轻松的。

一个男生可能会因为你漂亮而喜欢你,但这种喜欢无非是荷尔蒙冲动无法长时间维系,真正能让男生愿意和你一辈子走下去的,是你能够理解他,能够支持陪伴,能够默契相处。

但就这一点上,很多女生都是在逆行。她们所期望的感情都是建立在对于男生的索取之上,她们会因为男朋友没有足够专注自己而去作,会因为男朋友没满足自己的需要而去闹,会频繁吵架提分手来试探这个男人是否足够爱自己,却忽略了这个过程中,自己一步步在抛掉自己值得被爱的筹码。

当男生觉得和你在一起,不但体会不到丝毫乐趣,反而成为一种负担的时候,其实就已经在积累失望了。但这个时候男生一般不会直接放弃,他们会尝试逃避,会尝试沟通,会寄希望于你能逐渐去改变。

所以有经验的女生应该知道,男人的态度变化是有个周期的,不会因为你和他吵几次而一下子和你分手,但是会逐渐冷漠下来,这个过程中他就是在开始怀疑是否真的合适,会希望看到你有所变化。然而往往女生在这个阶段,又会因为男生的逃避而更加变本加厉去作去闹,想要控制对方,最终形成恶性循环。

等到失望积累够了,也就变成绝望。他会判断你已经不会变了,无药可救了,再相处下去只会让那自己越来越累,最终决定分开,等你意识到问题所在时已经来不及了,这种理性思考下的分手,往往挽回难度也是比较大的。

很多女生整天担心男生变心不爱自己,但同时却又是亲手在不断把他往外推,想想还挺可笑的。




  

相关话题

  已有大量编程基础,如何速成python用于学习机器学习? 
  请问应该怎样去学习图像识别和深度学习? 
  要学 Python 需要怎样的基础? 
  怎样将一个24的n次方复杂度的计算优化? 
  在线教育网站(Coursera、网易云课堂、腾讯课堂等)有哪些值得推荐的 Python 课程? 
  Python中 __init__的通俗解释是什么? 
  有什么好的自学 Python 的书籍推荐? 
  编程新手如何提高编程能力? 
  为什么 Python 的 GIL 问题一直让人诟病,Python 社区却不解决? 
  Excel 的 VBA 现在还算是办公利器吗? 

前一个讨论
为什么一部分中国人会有惧怕中国强大的想法?
下一个讨论
有哪些令人感动到崩泪的脑洞故事?





© 2024-05-20 - tinynew.org. All Rights Reserved.
© 2024-05-20 - tinynew.org. 保留所有权利