广告
返回顶部
首页 > 资讯 > 后端开发 > Python >py2与py3的区别
  • 220
分享到

py2与py3的区别

区别 2023-01-31 06:01:02 220人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

Guido(python之父,仁慈的独裁者)在设计 python3 的过程中,受一篇文章 “Python warts” 的影响,决定不向后兼容,否则无法修复大多数缺陷。---摘录自《流畅的Python》 你可能从来没有听说过学 Java 的

Guido(python之父,仁慈的独裁者)在设计 python3 的过程中,受一篇文章 “Python warts” 的影响,决定不向后兼容,否则无法修复大多数缺陷。---摘录自《流畅的Python》

你可能从来没有听说过学 Java 的纠结是学 jdk6 还是 JDK7,也没听说学 PHP 的纠结是学 php5 还是 PHP7,但在 Python 社区,有这么个怪问题:“学 Python 到底是学2还是学3?”这个问题就像月经一样每隔断时间就出现在你面前,也成了很多初学者的选择困惑,这个问题的“始作俑者”当然是 Python 它爹,大家众说纷纭,有说 Python2 是主流,大公司都在用,你应该学 2 。也有说 Python3 才是未来主流,大多数第三方框架已基本支持 Python3。个人看法是 Python2 还会存在很长一段时间(只要那些用 Python2 的公司还没倒闭,就一直会存在),你去找工作很有可能就需要用到 2,而 Python3 也是你必须要掌握的,因为越来越多的人会迁移到 3 上去,本质上,它俩是同一门语言,仅仅只是极少部分(1%?并没有严格统计)不兼容的地方,所以就没所谓学哪一个好,学了一个,另一个花很少时间就能掌握。今天给大家介绍 Python2 和 Python3 的一些主要区别。

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

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

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

print("hello", "world")
('hello', 'world')

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

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 了。

sys.getdefaultencoding()
'ascii'

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

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

py2 py3 表现 转换 作用
str byte 字节 encode 存储、传输
unicode str 字符 decode 展示
True和False
True 和 False 在 Python2 中是两个全局变量(名字),在数值上分别对应 1 和 0,既然是变量,那么他们就可以指向其它对象,例如:

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

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,这次先写这么多,下次再继续。

--结束END--

本文标题: py2与py3的区别

本文链接: https://www.lsjlt.com/news/189449.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • py2与py3的区别
    Guido(Python之父,仁慈的独裁者)在设计 Python3 的过程中,受一篇文章 “Python warts” 的影响,决定不向后兼容,否则无法修复大多数缺陷。---摘录自《流畅的Python》 你可能从来没有听说过学 Java 的...
    99+
    2023-01-31
    区别
  • jsp与js与jquery的区别
    jsp与js与jquery的区别:1、js是javascript文件的文件后缀。2、jquery 是一个函数库,是基于javascript的。3、jsp是jsp网页文件的后缀。js是javascript文件的文件后缀,其实就像文本文档a.t...
    99+
    2022-10-25
  • MySQL @与@@区别
    MySQL @与@@区别1、@xxx 是 用户自定义的变量  (User variables are written as @var_name)2、@@x xxx是 global或session变量  (@...
    99+
    2022-10-18
  • shtml与html的区别
    SHTML(Server Side HTML)与HTML(Hypertext Markup Language)的区别主要在于它们的处...
    99+
    2023-09-09
    shtml
  • dns与dhcp的区别
    1、功能不同 DNS(域名系统):DNS的主要功能是进行域名解析,将用户输入的易于理解的域名转换为计算机能够识别的IP地址。 DHCP(动态主机配置协议):DHCP的主要功能是自动为网络中的设备分配IP地址。 2、工作方式...
    99+
    2023-10-29
    区别 dns dhcp
  • leaflet与vue2leaflet的区别
    一、作用不同 leaflet是一个开源的JavaScript库,用于在网页上创建交互式的地图。它提供了一系列的地图组件,如图层、标记、弹出窗口、控件等,可以让开发者轻松地定制和扩展地图功能。leaflet支持多种地图源,如OpenStree...
    99+
    2023-10-29
    区别 leaflet vue2leaflet
  • jdk与jre的区别
    对于java初学者来说,往往不懂区分jdk和jre的区别,实际上这两个东西差别很大的,有必要了解一下:简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit ...
    99+
    2023-06-03
  • Token与session的区别
    一、什么是token? 在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般作为邀请、登录系 统使用。 Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成 一个Toke n便将此T...
    99+
    2023-09-22
    服务器 运维 spring mvc
  • ext2与ext3的区别
    inux ext2/ext3文件系统使用索引节点来记录文件信息,作用像windows的文件分配表。索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引节点的数组,每个文件...
    99+
    2023-01-31
    区别
  • java中“/”与“%”的区别
    区别:%是求模运算符,/是除运算符。%是求余运算,/是普通的除号。实例:System.out.println(3/5) = 0; System.out.println(2/5) = 0; System.out.println(4/5) ...
    99+
    2020-06-30
    java入门 java / % 区别
  • java与js的区别
    虽然JavaScript与Java有紧密的联系,但却是两个公司开发的不同的两个产品。Java是SUN公司推出的新一代面向对象的程序设计语言,特别适合于Internet 应用程序开发;而JavaScript是Netscape公司的产品,其目的...
    99+
    2019-12-14
    java入门 java js 区别
  • OLAP与OLTP的区别
    联机分析处理 (OLAP) 的概念最早是由关系数据库之父E.F.Codd于1993年提出的,他同时提出了关于OLAP的12条准则。OLAP的提出引起了很大的反响,OLAP作为一类产品同联机事务处理 (OLT...
    99+
    2022-10-18
  • getReadableDatabase与getWritableDatabase的区别
        在Android中,通过getReadableDatabase与getWritableDatabase()都可以获得一个可以对数据库进行操作的实例。然后都可以对数据库进行增、删、...
    99+
    2022-10-18
  • undo与redo的区别
    undo:撤销,也就是取消之前的操作。 redo:重做,重新执行一遍之前的操作。什么是REDO  REDO记录transaction logs,分为online和archived。以恢复为目的。 ...
    99+
    2022-10-18
  • SQL与NoSQL的区别
    本篇内容主要讲解“SQL与NoSQL的区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SQL与NoSQL的区别”吧!一、专家简介VoltDB公司首席技术官Ry...
    99+
    2022-10-18
  • DDL与DML的区别
    1.DML操作是需要手动控制事务的开启、提交(commit)和回滚的。 2.DDL操作是隐性提交的,不能rollback! Buy me a cup of coffee :) ...
    99+
    2018-04-21
    DDL与DML的区别
  • javascript与java的区别
    java与javascript的区别:Java是面向对象的语言,JavaScript是脚本语言,是基于对象和事件驱动的语言。Java的源代码在执行之前必须经过编译,而JavaScript的代码不需要,可以由浏览器直接解释执行。强类型语言和弱...
    99+
    2018-09-14
    java入门 javascript java 区别
  • java与javascript的区别
    JavaScript 与Java是两个公司开发的不同的两个产品。Java 是原Sun Microsystems公司推出的面向对象的程序设计语言,特别适合于互联网应用程序开发; (推荐学习:java课程)而JavaScript...
    99+
    2018-09-20
    java入门 java
  • java与c的区别
    Java和C都是指令式语言(Imperative Language),不同的是Java有面向对象(OO)成分在里面,而C是完全面向过程的,C的高级版本C++、C#支持面向对象。另外一个不同是,Java跨平台,既不同的操作系统都可以通过JVM...
    99+
    2018-11-16
    java入门 java
  • jdk与java的区别
    区别:jdk是个java开发的工具包,java是门编程语言。什么是javaJava是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。Java编程语言的风格十分接近C++语言。...
    99+
    2015-02-16
    java入门 java jdk 区别
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作