Advertisement

学 Python 到底是学2还是学3?

阅读量:

Python社区存在这样一个疑问:"学Python到底是要学Py2还是要学Py3?"这个疑问如同周期性出现的经期现象,在编程圈子里每隔一段时间就会再次浮现,并且成为了众多新手在选择编程语言时面临的困惑。其起源者无疑是Python的父系——Python语言的发展历史中始终未能摆脱与之相关的争论影响。各方观点此起彼伏:有人认为Py2仍然是主流语言,并被广泛使用;而另一派人则认为.Py3才是未来的主要方向,并得到了越来越多第三方框架的支持。

我的观点认为Python2会在相当长的时间里继续存在(只要相关企业还在运营),因此在求职过程中可能会需要用到它。同时,Python3也是必须学会的技能,因为越来越多的人正在转向学习它。从本质上来说,这两者是一体化的语言体系,在少数大约1%左右的地方会出现不兼容的情况。因此,在选择学习哪个版本时无需过分纠结——学一个版本后另一个相对容易掌握。

#今天给大家介绍 Python2 和 Python3 的一些主要区别

#print

在程序调试过程中最常用的一个指令通常是 print指令,在 Python 2环境中它被定义为一条独立的语句,在 Python3版本中则被定义为一个函数。可能会有这样的疑问:在 Python2环境中是否也能将 print 指令当作一个函数来调用呢?

复制代码
    # py2
    print("hello")  # 等价 print  ("hello")
    
    #py3
    print("hello")
    
    
    
      
      
      
      
      
      
    
    AI写代码

但是,在表面现象之下隐藏着更深层的东西。反观上述两种表达方式有何不同?它们的行为结果看似一致。但核心区别在于前者将这一部分视为一个独立的整体进行处理;而后者调用了print()函数,并接受了一个字符串作为输入参数。

复制代码
    # py2
    >>> print("hello", "world")
    ('hello', 'world')
    
    # py3
    >>> print("hello", "world")
    hello world
    
    
    
      
      
      
      
      
      
      
      
    
    AI写代码

这一事例更加突出地展示了,在Python 2版本中,默认情况下,在print语句后紧跟的是一个元组对象;而在Python 3版本中,默认情况下(print函数)能够接收多个位置参数。如果要在Python 2版本中将print视为一个函数来使用,则可以通过导入future模块中的print_function来实现这一功能。

复制代码
    在学习过程中有什么不懂得可以加我的
    python学习交流扣扣qun,784758214
    群里有不错的学习视频教程、开发工具与电子书籍。
    与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
    
    # py2
    >>> print("hello", "world")
    ('hello', 'world')
    >>> 
    >>> from __future__ import print_function
    >>> print("hello", "world")
    hello world
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI写代码

#编码

Python2采用了ASCII作为默认编码方案,默认情况下无法正确处理多字节字符这也成为导致Python2中常见编码问题的重要原因之一。正是由于这一时期Unicode尚未被广泛采用使得早期版本难以支持现代字符集需求从版本3开始,默认使用的是UTF-8字符集因此,在版本3及以后无需在文件开头声明# coding= utf-8

复制代码
    # py2
    >>> sys.getdefaultencoding()
    'ascii'
    
    # py3
    >>> sys.getdefaultencoding()
    'utf-8'
    
    
    
      
      
      
      
      
      
      
      
    
    AI写代码

许多网络文章提到调整默认编码设置以解决Python2中的编码问题。然而这实际上是一个危险的误区,请避免采取这种做法

#字符串

字符型的变化最为显著。这一变革将编码问题降至最低水平。在Python 2时代存在两种不同的字符型:一种是纯文字符型(unicode),另一种是二进制数据型(str)。然而,在这些情况下开发者仍感困惑——他们难以理解其背后的根本原因为何如此复杂。但在Python 3时代则进行了严格分类:一种明确标识纯文字符型(str),另一种则明确标识二进制数据型(byte)。所有需输出纯文字符型或在网络上传输的数据仅接受二进制形式——通过这种方式实现了从根本上消除潜在问题根源的能力

image.png

#True和False

在Python2中,True和False被视为两个全局变量名称;其数值值分别为1和0;由于它们作为变量存在,在程序运行时它们可以指向其他对象实例;例如:

复制代码
    # py2
    >>> True = False
    >>> True
    False
    >>> True is False
    True
    >>> False = "x"
    >>> False
    'x'
    >>> if False:
    ...     print("?")
    ... 
    ?
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI写代码

显然可以看出上面的代码违反了 Python 的这一原则。而 Python3 则解决了这一问题,并将 True 和 False 设为两个关键字以确保它们始终指向各自的唯一实例。

复制代码
    # py3
    >>> True = 1
      File "<stdin>", line 1
    SyntaxError: can't assign to keyword
    
    
    
      
      
      
      
      
    
    AI写代码

#迭代器

在 Python2 中多个返回数据结构的内置函数和方法在 Python 3 都生成了类似迭代器的对象。由于迭代器的惰性加载特性使得处理大数据更加高效。在 Python2 中 range() 和 xrange() 被整合为 range()。如果同时兼容 2 和 3 版本,则可以采用以下方式:

复制代码
    try:
    range = xrange
    except:
    pass
    
    
    
      
      
      
      
      
    
    AI写代码

此外,在 Python 内置的数据处理中,默认情况下字典接口 dict 的 keys() 和 values() 方法也不再直接返回列表结构,而是以一个类似于迭代器的对象形式进行数据管理。这些高级函数如 map、filter 和 zip 也都不再直接返回列表结构,在 Python2 中则采用了 next 方法来表示下一个操作,在 Python3 则采用了 next 来表示下一个操作。

#nonlocal

在Python2环境中,在函数内部使用关键字global来声明一个全局变量是可以实现的;但在嵌套函数体内无法对一个变量进行非局部性声明;从Python3起新增了nonlocal关键字使得对非局部性进行声明成为可能。

如果你还在编程学习过程中感到迷茫,请考虑加入我们的Python学习群:784758214,在这个充满经验的同好交流圈中畅所欲言。我们不仅提供丰富的资源库支持你的成长旅程,还特别整理了从基础Python脚本开发到Web开发、爬虫技术、Django框架应用及数据挖掘等多个实践领域的完整项目案例。为每一位致力于提升Python技能的学习者提供宝贵的资源和支持。在这里你将获得一系列系统化的学习方法论及实用操作技巧建议,并与其他 fellow Python开发者共同探讨实际项目中的常见问题与解决方案。

复制代码
    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
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    AI写代码

其中许多内置模块进行了较为显著的优化;在Python3中模块之间的层次更加分明;同时支持了异步输入输出(IO)操作。

全部评论 (0)

还没有任何评论哟~