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 中明明也看到当函数使用:

  # 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 表示字节序列,任何需要写入文本或者网络传输的数据都只接收字节序列,这就从源头上阻止了编码错误的问题,关于Unicode与字符串,其实在之前的文章进行系统的讲解过深入理解Python字符编码。

  py2  py3  表现  转换  作用

  str  byte  字节  encode  存储、传输

  unicode  str  字符  decode  展示

  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 "", line 1

  SyntaxError: can't assign to keyword

  迭代器

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

  try:无锡妇科医院 http://www.wxbhnkyy39.com/

  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

Python 2 和 Python 3 主要区别有哪些(1)的更多相关文章

  1. Python 2 和 Python 3 有哪些主要区别

    概述# 原稿地址:使用 2to3 将代码移植到 Python 3 几乎所有的Python 2程序都需要一些修改才能正常地运行在Python 3的环境下.为了简化这个转换过程,Python 3自带了一个 ...

  2. Python学习笔记—Python基础1 介绍、发展史、安装、基本语法

    第一周学习笔记: 一.Python介绍      1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  3. 【Python大系】Python快速教程

    感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容很多,加上各种标准库.拓展库, ...

  4. python学习笔记-python程序运行

    小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...

  5. python day1:初识Python(一)

    一.Python 简介: Python免费.开源,面向对象的解释型语言,其语法简洁,在使用中无需考虑如何管理内存等底层问题,并且支持在linux,windows等多平台运行,Python的标准库很强大 ...

  6. 智普教育Python培训之Python开发视频教程网络爬虫实战项目

    网络爬虫项目实训:看我如何下载韩寒博客文章Python视频 01.mp4 网络爬虫项目实训:看我如何下载韩寒博客文章Python视频 02.mp4 网络爬虫项目实训:看我如何下载韩寒博客文章Pytho ...

  7. 和我一起学python,初识python (life is short ,we need python)

    作者:tobecrazy  出处:http://www.cnblogs.com/tobecrazy 欢迎转载,转载请注明出处.thank you! 由于项目需要(并非因为life is short), ...

  8. Python之路-python数据类型(列表、字典、字符串、元祖)操作

    一.列表: 列表的语法,以中括号开通和结尾,元素以逗号隔开.例如:name = [] 列表是以下标取值,第一个元素下标是0,第二个元素下标是1,最后一个元素下标是-1.   1.增加 #name = ...

  9. 笨办法学 Python (Learn Python The Hard Way)

    最近在看:笨办法学 Python (Learn Python The Hard Way) Contents: 译者前言 前言:笨办法更简单 习题 0: 准备工作 习题 1: 第一个程序 习题 2: 注 ...

  10. 【循序渐进学Python】12.Python 正则表达式简介

    正表达式就是一段匹配文本片段的模式,在Python 中 re 模块包含了对正则表达式(regular expression)的支持. 1. 正则表达式的基本概念 1. 通配符 点号( . )可以匹配换 ...

随机推荐

  1. Luogu P1373 小a和uim之大逃离【dp】By cellur925

    题目传送门 $50pts$:容易设计出状态$f[i][j][l][r][st]$表示当前的这个人在($i$,$j$),小a和uim魔瓶中的含量分别为$l$,$r$,当$st=0$表明现在是小a在吃,当 ...

  2. Hadoop Hive概念学习系列之HDFS、Hive、MySQL、Sqoop之间的数据导入导出(强烈建议去看)

    Hive总结(七)Hive四种数据导入方式 (强烈建议去看) Hive几种数据导出方式 https://www.iteblog.com/archives/955 (强烈建议去看) 把MySQL里的数据 ...

  3. 用jQuery获取到一个类名获取到的是一个数组 ,如果对数组中的每个进行相应的操作可以这样进行

    $(".userImg").each(function(){ $(this).click(function(){ var imgid = $(this).attr("id ...

  4. 创建表规范 lob 字段

    ORAClce 11g 提供如下特性: BasicfileOracle10g 及之前版本被称为basicfile Securefile11g中新增securefile 优点:集中写入缓存(WGC),4 ...

  5. pyspark中使用累加器Accumulator统计指标

    评价分类模型的性能时需要用到以下四个指标 最开始使用以下代码计算,发现代码需要跑近一个小时,而且这一个小时都花在这四行代码上 # evaluate model TP = labelAndPreds.f ...

  6. PHP使用iconv函数遍历数组转换字符集

    /** * 字符串/二维数组/多维数组编码转换 * @param string $in_charset * @param string $out_charset * @param mixed $dat ...

  7. 《Redis开发与运维》快速笔记(一)

    1.前言&基本介绍 在原始的系统架构中,我们都由程序直接连接DB,随着业务的进一步开展,DB的压力越来越大,为了缓解DB的这一压力,我们引入了缓存,在程序连接DB中加入缓存层, 从而减轻数据库 ...

  8. 【转】深入理解Android中的SharedPreferences

    SharedPreferences作为Android中数据存储方式的一种,我们经常会用到,它适合用来保存那些少量的数据,特别是键值对数据,比如配置信息,登录信息等.不过要想做到正确使用SharedPr ...

  9. logging模块基础

    很多程序都有记录日志的需求,日志不仅可以保存访问记录,也可以有错误,警告等信息输出. python的logging模块提供了标准的日志接口,可以通过logging存储各种格式的日志.logging模块 ...

  10. CF779B(round 402 div.2 B) Weird Rounding

    题意: Polycarp is crazy about round numbers. He especially likes the numbers divisible by 10k. In the ...