Python 3 与Python 2的区别

本文详细介绍了 Python 2.x 迁移到 3.x 的主要变化,包括语法调整如 print 函数化、数据类型变更如 str 成为 unicode、新增特性如 nonlocal 关键字等,并提供了示例代码帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 Python 2.x 与3.x 最本质的区别是什么

 

 不是从2.7出现3.1,是从2.6。2.7是为了让Python平稳过度到3.X而发布的版本,加入了一些3.X的特性。主要区别有(个人观点,你可以到官方看它的说法)
没有了经典类,全是新型类,就是class对象没有父类,那么就是从object继承而来的;
print、exec从语句改为函数;
还有就是str改为了unicode,就相当于2.X的unicode对象,2.X的str改为了bytes(这个要方便得多了,不像2.X要是编码出错,很不爽的).

 

 

正在阅读最新版的《A byte of Python》。发现Python3.0在某些地方还是有些改变的。准备慢慢的体会,与老版本的《A byte of Python》做对比,最后再去查阅官方网站的文档。

1. 如果你下载的是最新版的Python,就会发现所有书中的Hello World例子将不再正确。

Old: print "Hello World!" #打印字符串
New: print("Hello World!")

在v3.x中用old方法,则会抛出异常:SyntaxError: invalid syntax
将字符串放到括号中print出来,这种写法对于我这种学习Java出身的人来说,很是亲切啊:)

2.
Old: guess = int(raw_input('Enter an integer : ')) #读取键盘输入的方法
New: guess = int(input('Enter an integer : '))
方法名变得更加容易记!

3. 加入了一个新的nonlocal statement,非局部变量,它的范围介于global和local之间,主要用于函数嵌套,用法如下:

#!/usr/bin/python

# Filename: func_nonlocal.py

def func_outer():
    x = 2
    print('x is', x)
    def func_inner():
        nonlocal x
        x = 5
    func_inner()

    print('Changed local x to', x)

func_outer()

4. VarArgs parameters,不知道这个翻译成什么比较妥当?先看例子:

#!/usr/bin/python

# Filename: total.py

def total(initial=5, *numbers, **keywords):
    count = initial
    for number in numbers:
        count += number
    for key in keywords:
        count += keywords[key]
    return count

print(total(10, 1, 2, 3, vegetables=50, fruits=100))

当在参数前面使用*标识的时候,所有的位置参数(1,2,3)作为一个list传递。
当在参数前面使用**标识的时候,所有的关键参数(vegetables=50, fruits=100)作为一个dictionary传递。

5. 关于Packages的话题,暂时没看懂。。。

6. 在数据结构中,多了一种类型:set

Set是一种无序的简单对象的集合,当我们关心一个对象是否在一个集合中存在,而顺序和出现的次数是次要的时候,可以使用set。

7. 关于os.sep方法,(set是separator,分隔符的缩写)

一个很晕菜的例子:

Old:
target_dir = '/mnt/e/backup/'
target = target_dir + time.strftime('%Y%m%d%H%M%S') + '.zip'

New:
target_dir = 'E:\\Backup'
target = target_dir + os.sep + time.strftime('%Y%m%d%H%M%S') + '.zip'

os.sep的功能是自动辨别操作系统,给出不同的分隔符,Windows上是\\,Linux上是/,原理我是明白了,功能也很不错,但是作者的例子。。。。只有一处使用了os.sep,其他的地方还是老的写法啊(E:\\)

8. 可以使用@修饰符声明一个类方法:

    @classmethod

    def howMany(klass):
        '''Prints the current population.'''
        print('We have {0:d} robots.'.format(Robot.population))

9. 可以将以个类用Metaclasses的方式声明为抽象类抽象方法

from abc import *

class SchoolMember(metaclass=ABCMeta):

    '''Represents any school member.'''
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print('(Initialized SchoolMember: {0})'.format(self.name))
    @abstractmethod
    def tell(self):
        '''Tell my details.'''
print('Name:"{0}" Age:"{1}"'.format(self.name, self.age), end=" ")

        #pass

10. 文件读写的模式又增加了两种:文本本件('t')二进制文件('b')。

11.将打开文件的操作放到使用with语句修饰的方法中,书上说好处是让我们更专注于文件操作,让代码看起来不凌乱,我一时间还不能体会with的好处,希望大家指点。

#!/usr/bin/python

# Filename: using_with.py

from contextlib import context
@contextmanager
def opened(filename, mode="r")
    f = open(filename, mode)
    try:
        yield f
    finally:
        f.close()
with opened("poem.txt") as f:
    for line in f:
        print(line, end='')

12.python3.0中添加了logging module,给我的感觉类似于Java中的log4j,直接看代码:

import os, platform, logging
if platform.platform().startswith('Windows'):
logging_file = os.path.join(os.getenv('HOMEDRIVE'),
os.getenv('HOMEPATH'), 'test.log')
else:
    logging_file = os.path.join(os.getenv('HOME'), 'test.log')
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s : %(levelname)s : %(message)s',
    filename = logging_file,
    filemode = 'w',
)

logging.debug("Start of the program")
logging.info("Doing something")
logging.warning("Dying now")

 

 

教程:

0、下载:http://python.org/getit/

1、http://www.360doc.com/content/11/0303/23/2126067_97919930.shtml

2、http://www.cnitblog.com/yunshichen/archive/2009/04/01/55924.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值