zoukankan      html  css  js  c++  java
  • python3和Python2的区别(被坑太久了)

    print函数:(Python3中print为一个函数,必须用括号括起来;Python2中print为class)

    Python 2 的 print 声明已经被 print() 函数取代了,这意味着我们必须包装我们想打印在小括号中的对象。

    Python 2

    1
    2
    3
    4
    print 'Python', python_version()
    print 'Hello, World!'
    print('Hello, World!')
    print "text", ; print 'print more text on the same line'

    run result:
    Python 2.7.6
    Hello, World!
    Hello, World!
    text print more text on the same line

    Python 3

    1
    2
    3
    4
    print('Python', python_version())
    print('Hello, World!')
    print("some text,", end="")
    print(' print more text on the same line')

    run result:
    Python 3.4.1
    Hello, World!
    some text, print more text on the same line


    通过input()解析用户的输入:(Python3中input得到的为str;Python2的input的到的为int型,Python2的raw_input得到的为str类型)统一一下:Python3中用input,Python2中用row_input,都输入为str

    幸运的是,在 Python 3 中已经解决了把用户的输入存储为一个 str 对象的问题。为了避免在 Python 2 中的读取非字符串类型的危险行为,我们不得不使用 raw_input() 代替。

    Python 2
    Python 2.7.6
    [GCC 4.0.1 (Apple Inc. build 5493)] on darwin
    Type “help”, “copyright”, “credits” or “license” for more information.

    >>> my_input = input('enter a number: ')
    
    enter a number: 123
    
    >>> type(my_input)
    <type 'int'>
    
    >>> my_input = raw_input('enter a number: ')
    
    enter a number: 123
    
    >>> type(my_input)
    <type 'str'>
    

    Python 3
    Python 3.4.1
    [GCC 4.2.1 (Apple Inc. build 5577)] on darwin
    Type “help”, “copyright”, “credits” or “license” for more information.

    >>> my_input = input('enter a number: ')
    
    enter a number: 123
    
    >>> type(my_input)
    <class 'str'>

    整除:(没有太大影响)(Python3中/表示真除,%表示取余,//表示地板除(结果取整);Python2中/表示根据除数被除数小数点位得到结果,//同样表示地板除)统一一下:Python3中/表示真除,%表示取余,//结果取整;Python2中带上小数点/表示真除,%表示取余,//结果取整

    Python 2

    1
    2
    3
    4
    5
    print 'Python', python_version()
    print '3 / 2 =', 3 / 2
    print '3 // 2 =', 3 // 2
    print '3 / 2.0 =', 3 / 2.0
    print '3 // 2.0 =', 3 // 2.0

    run result:
    Python 2.7.6
    3 / 2 = 1
    3 // 2 = 1
    3 / 2.0 = 1.5
    3 // 2.0 = 1.0

    Python 3

    1
    2
    3
    4
    5
    print('Python', python_version())
    print('3 / 2 =', 3 / 2)
    print('3 // 2 =', 3 // 2)
    print('3 / 2.0 =', 3 / 2.0)
    print('3 // 2.0 =', 3 // 2.0)

    run result:
    Python 3.4.1
    3 / 2 = 1.5
    3 // 2 = 1
    3 / 2.0 = 1.5
    3 // 2.0 = 1.0


    xrange模块:

    在 Python 3 中,range() 是像 xrange() 那样实现以至于一个专门的 xrange() 函数都不再存在(在 Python 3 中xrange() 会抛出命名异常)。

    在 Python 2 中 xrange() 创建迭代对象的用法是非常流行的。比如: for 循环或者是列表/集合/字典推导式。
      这个表现十分像生成器(比如。“惰性求值”)。但是这个 xrange-iterable 是无穷的,意味着你可以无限遍历。
      由于它的惰性求值,如果你不得仅仅不遍历它一次,xrange() 函数 比 range() 更快(比如 for 循环)。尽管如此,对比迭代一次,不建议你重复迭代多次,因为生成器每次都从头开始。


    待补充。。。

    http://chenqx.github.io/2014/11/10/Key-differences-between-Python-2-7-x-and-Python-3-x/

    http://www.cnblogs.com/codingmylife/archive/2010/06/06/1752807.html



    python 2.4 与 python 3.0 的比较

    一、 print 从语句变为函数

       原:     print   1, 2+3

    改为: print ( 1, 2+3 )

    二、range 与 xrange

    原 : range( 0, 4 )   结果 是 列表 [0,1,2,3 ]

    改为:list( range(0,4) )

    原 : xrange( 0, 4 )    适用于 for 循环的变量控制

    改为:range(0,4)

    三、字符串

    原: 字符串以 8-bit 字符串存储

    改为: 字符串以 16-bit Unicode 字符串存储

    四、try except 语句的变化

    原: try:

              ......

         except    Exception, e :

             ......

    改为

        try:

              ......

         except    Exception as e :

             ......

    五、打开文件

    原: file( ..... )

        或 open(.....)

    改为:

        只能用 open(.....)

    六、从键盘录入一个字符串

    原: raw_input( "提示信息" )

    改为: input( "提示信息" )

    七、bytes 数据类型

    A bytes object is an immutable array. The items are 8-bit bytes, represented by integers in the range 0 <= x < 256.

    bytes 可以看成是“字节数组”对象,每个元素是 8-bit 的字节,取值范围 0~255。

    由于在 python 3.0中字符串以 unicode 编码存储,当写入二进制文件时,字符串无法直接写入(或读取),必须以某种方式的编码为字节序列后,方可写入。

    (一)字符串编码(encode) 为 bytes

    例:   s = "张三abc12"

           b = s.encode( 编码方式)

           # b 就是 bytes 类型的数据

          # 常用的编码方式为 : "uft-16"    , "utf-8", "gbk", "gb2312", "ascii" , "latin1" 等

          # 注 : 当字符串不能编码为指定的“编码方式”时,会引发异常

    (二) bytes 解码(decode)为字符串

          s = "张三abc12"

           b = s.encode( "gbk")    # 字符串 s 编码为 gbk 格式的字节序列

           s1 = b.decode("gbk")   # 将字节序列 b以gbk格式 解码为字符串

           # 说明,当字节序列不能以指定的编码格式解码时会引发异常

    (三)使用方法举例

    #coding=gbk

    f = open("c:\1234.txt", "wb")
    s = "张三李四abcd1234"
    # -------------------------------
    # 在 python2.4 中我们可以这样写:
    # f.write( s )
    # 但在 python 3.0中会引发异常
    # -------------------------------
    b = s.encode("gbk")
    f.write( b )
    f.close()

    input("?")

    读取该文件的例子:

    #coding=gbk

    f = open("c:\1234.txt", "rb")
    f.seek(0,2) #定位至文件尾
    n = f.tell() #读取文件的字节数
    f.seek(0,0) #重新定位至文件开始处
    b = f.read( n )
    # ------------------------------
    # 在 python 2.4 中 b 是字符串类型
    # 要 python 3.0 中 b 是 bytes 类型
    # 因此需要按指定的编码方式确码
    # ------------------------------ 
    s = b.decode("gbk")
    print ( s )
    # ------------------------------
    # 在 python 2.4 中 可以写作 print s 或 print ( s )
    # 要 python 3.0 中 必须写作 print ( s )
    # ------------------------------ 
    f.close()
    input("?")

    运行后应显示:

    张三李四abcd1234

    (四) bytes序列,一但形成,其内容是不可变的

    例:

    s="ABCD"

    b=s.encode("gbk")

    print b[0]       # 显示   65

    b[0] = 66   

    # 执行该句,出现异常: 'bytes' object does not support item assignment

    八、 chr( K ) 与 ord( c )

    python 2.4.2以前

       chr( K )   将编码K 转为字符,K的范围是 0 ~ 255

       ord( c )   取单个字符的编码, 返回值的范围: 0 ~ 255

    python 3.0

       chr( K )   将编码K 转为字符,K的范围是 0 ~ 65535

       ord( c )   取单个字符的编码, 返回值的范围: 0 ~ 65535

    九、 除法运算符

    python 2.4.2以前

       10/3      结果为 3     

    python 3.0

       10 / 3 结果为 3.3333333333333335

       10 // 3 结果为 3

    十、字节数组对象 --- 新增

    (一) 初始化

        a = bytearray(   10 )

         # a 是一个由十个字节组成的数组,其每个元素是一个字节,类型借用 int

         # 此时,每个元素初始值为 0

    (二) 字节数组 是可变的

        a = bytearray(   10 )

         a[0] = 25

         # 可以用赋值语句更改其元素,但所赋的值必须在 0 ~ 255 之间

    (三)   字节数组的切片仍是字节数组

    (四)   字符串转化为字节数组

         #coding=gbk

         s ="你好"

         b = s.encode( "gbk")     # 先将字符串按某种“GBK”编码方式转化为 bytes

         c = bytearray( b )          #再将 bytes 转化为 字节数组

         也可以写作

         c = bytearray( "你好", "gbk")

    (五)   字节数组转化为字符串

          c = bytearray( 4 )

           c[0] = 65 ; c[1]=66; c[2]= 67; c[3]= 68

          s = c.decode( "gbk" )

           print ( s )

          # 应显示: ABCD           

    (六) 字节数组可用于写入文本文件

    #coding=gbk

    f = open("c:\1234.txt", "wb")
    s = "张三李四abcd1234"
    # -------------------------------
    # 在 python2.4 中我们可以这样写:
    # f.write( s )
    # 但在 python 3.0中会引发异常
    # -------------------------------
    b = s.encode("gbk")

    f.write( b )
    c=bytearray( "王五","gbk")
    f.write( c )
    f.close()

    input("?")

    RookieDong的补充

    1,“import  thread”问题,2.x中的模块thread在3.x中编程"_thread"(需要在前面加一个下划线).否则会出现“ImportError: No module named thread



    dd

  • 相关阅读:
    java URL、HTTP与HTML+CSS
    JDK的图文安装教程
    Java之Tomcat、Dynamic web project与Servlet
    Java基础ArrayList、Servlet与Filter
    JavaMath方法、服务器与Tomcat安装与配置步骤
    关于navicat 系列软件一点击菜单栏就闪退
    Java基础之MySQL数据库与JDBC
    Java中的常用方法
    Java基础之Calendar类、JNDI之XML
    JAVAWEB基础模块开发顺序与数据访问对象实现类步骤
  • 原文地址:https://www.cnblogs.com/hanggegege/p/5840005.html
Copyright © 2011-2022 走看看