python3.X的变化

python不同版本介绍及更新说明 Python是一种广泛使用的高级编程语言,自1991年由Guido van Rossum首次发布以来,经历了多个版本的迭代和更新。每个新版本通常包含改进、错误修复和新特性。 阅读详情
Python 版本 3,也被称为 Python 3000 或 Py3K(仿效 Microsoft® Windows® 2000 操作系统而命名的昵称)是 Guido van Rossum 通用编程语言的最新版本。虽然新版本对该核心语言做了很多改进,但还是打破了与 2.x 版本的向后兼容性。其他一些变化则是人们期待已久的,比如:
真正的除法 — 例如,1/2 返回的是 .5。
long 和 int 类型被统一为一种类型,删除了后缀 L。
True、False 和 None 现在都是关键字。

本文 — Python 3 系列文章中的第一篇 — 的内容涵盖了新的 print() 函数、input()、输入/输出(I/O)的变化、新的 bytes 数据类型、字符串和字符串格式化的变化以及内置的 dict 类型的变化。本文面向的是那些熟悉 Python 并对新版本的变化很感兴趣但又不想费力读完所有 Python Enhancement Proposal(PEP)的编程人员。(本文后面的 参考资料 部分提供了有关这些 PEP 的链接。)

新的 print() 函数

如今,您将需要让手指习惯于键入 print("hello"),而不是原来的 print "hello",这是因为 print 现在是一个函数,不再是一个语句。我知道,这多少有点痛苦。我认识的每个 Python 程序员 — 一旦安装了版本 3 并得到 “语法不正确” 错误 — 都会郁闷地大叫。我知道这两个额外的符号十分讨厌;我也知道这将会破坏向后兼容性。但是这种改变还是有好处的。

让我们考虑这样的情况,即需要将标准输出(stdout)重定向到一个日志。如下的例子会打开文件 log.txt 以便进行追加并将对象指定给 fid。之后,利用 print>> 将一个字符串重定向给文件 fid:>>>fid = open("log.txt", "a")
>>>print>>fid, "log text"


另外一个例子是重定向给标准错误(sys.stderr):>>>print>>sys.stderr, "an error occurred"


上述两个例子都不错,但还有更好的解决方案。新的语法只要求给 print() 函数的关键字参数 file 传递一个值就可以了。比如:>>>fid = open("log.txt", "a")
>>>print("log.txt", file=fid)


这样的代码,语法更为清晰。另一个好处是通过向 sep 关键字参数传递一个字符串就能更改分割符(separator),通过向 end 关键字参数传递另外一个字符串就能更改结束字符串。要更改分割符,可以利用:>>>print("Foo", "Bar", sep="%")
>>>Foo%Bar


总地来说,新的语法为:print([object, ...][, sep=' '][, end='endline_character_here'][, file=redirect_to_here])


其中,方括号([])内的代码是可选的。默认地,若只调用 print() 自身,结果会追加一个换行符( /n)。


回页首


从 raw_input() 到 input()

在 Python 版本 2.x 中,raw_input() 会从标准输入(sys.stdin)读取一个输入并返回一个字符串,且尾部的换行符从末尾移除。下面的这个例子使用 raw_input() 从命令提示符获取一个字符串,然后将值赋给 quest。>>>quest = raw_input("What is your quest? ")
What is your quest? To seek the holy grail.
>>>quest
'To seek the holy grail.'


与之不同,Python 2.x 中的 input() 函数需要的是一个有效的 Python 表达式,比如 3+5。

最初,曾有人建议将 input() 和 raw_input() 从 Python 内置的名称空间一并删除,因此就需要进行导入来获得输入能力。这从方法上就不对;因为,简单键入:>>>quest = input("What is your quest?")


将会变为:>>>import sys
>>>print("What is your quest?")
>>>quest = sys.stdin.readline()


对于一个简单输入而言,这太过繁琐,并且对于一个新手,这未免太难理解。往往需要向他们讲述模块 和导入究竟是怎么回事、字符串输出以及句点操作符又是如何工作的(如此麻烦的话,与 Java™ 语言就没什么差别了)。所以,在 Python 3 内,将 raw_input() 重命名为 input(),这样一来,无须导入也能从标准输入获得数据了。如果您需要保留版本 2.x 的 input() 功能,可以使用 eval(input()),效果基本相同。

有关 bytes 的简介

新的数据类型 bytes literal 及 bytes 对象的用途是存储二进制数据。此对象是 0 到 127 的不可修改的整数序列或纯粹的 ASCII 字符。实际上,它是版本 2.5 中 bytearray 对象的不可修改版本。一个 bytes literal 是一个前面冠以 b 的字符串 — 例如,b'byte literal'。对 bytes literal 的计算会生成一个新的 bytes 对象。可以用 bytes() 函数创建一个新的 bytes 对象。bytes 对象的构造函数为:bytes([initializer[, encoding]])


例如:>>>b = (b'/xc3/x9f/x65/x74/x61')
>>>print(b)
b'/xc3/x83/xc2/x9feta'


会创建一个 bytes 对象,但这是多余的,因为通过赋值一个 byte literal 就完全可以创建 bytes 对象。(我只是想要说明这么做是可行的,但是我并不建议您这么做。)如果您想要使用 iso-8859-1 编码,可以尝试下面的做法:>>>b = bytes('/xc3/x9f/x65/x74/x61', 'iso-8859-1')
>>>print(b)
b'/xc3/x83/xc2/x9feta'


如果初始化器(initializer)是一个字符串,那么就必须提供一种编码。如果初始化器是一个 bytes literal,则无须指定编码类型:请记住,bytes literal 并不是字符串。但是与字符串相似,可以连接多个字节:>>>b'hello' b' world'
b'hello world'


用 bytes() 方法代表二进制数据以及被编码的文本。要将 bytes 转变为 str, bytes 对象必须要进行解码(稍后会详细介绍)。二进制数据用 decode() 方法编码。例如:>>>b'/xc3/x9f/x65/x74/x61'.decode()
'ßeta'


也可以从文件中直接读取二进制数据。请看以下的代码:>>>data = open('dat.txt', 'rb').read()
>>>print(data) # data is a string
>>># content of data.txt printed out here


它的功能是打开文件以便在二进制模式内读取一个文件对象,并在整个文件内进行读取。

字符串

Python 具有单一的字符串类型 str,其功能类似于版本 2.x 的 unicode 类型。换言之,所有字符串都是 unicode 字符串。而且 — 对非拉丁文的文本用户也非常方便 — 非-ASCII 标识符现在也是允许的。例如:>>>césar = ["author", "consultant"]
>>>print(césar)
['author', 'consultant']


在 Python 之前的版本内,repr() 方法会将 8-位字符串转变为 ASCII。例如:>>>repr('é')
"'//xc3//xa9'"


现在,它会返回一个 unicode 字符串:>>>repr('é')
"'é'"


正如我之前提到的,这个字符串是内置的字符串类型。

字符串对象和字节对象是不兼容的。如果想要得到字节的字符串表示,需要使用它的 decode() 方法。相反,如果想要从该字符串得到 bytes literal 表示,可以使用字符串对象的 encode() 方法。

字符串格式化方面的变化

很多 Python 程序员都感觉用来格式化字符串的这个内置的 % 操作符太有限了,这是因为:
它是一个二进制的操作符,最多只能接受两个参数。
除了格式化字符串参数,所有其他的参数都必须用一个元组(tuple)或是一个字典(dictionary)进行挤压。

这种格式化多少有些不灵活,所以 Python 3 引入了一种新的进行字符串格式化的方式(版本 3 保留了 % 操作符和 string.Template 模块)。字符串对象现在均具有一个方法 format(),此方法接受位置参数和关键字参数,二者均传递到 replacement 字段 。Replacement 字段在字符串内由花括号({})标示。replacement 字段内的元素被简单称为一个字段。以下是一个简单的例子:>>>"I love {0}, {1}, and {2}".format("eggs", "bacon", "sausage")
'I love eggs, bacon, and sausage'


字段 {0}、{1} 和 {2} 通过位置参数 eggs、 bacon 和 sausage 被传递给 format() 方法。如下的例子显示了如何使用 format() 通过关键字参数的传递来进行格式化:>>>"I love {a}, {b}, and {c}".format(a="eggs", b="bacon", c="sausage")
'I love eggs, bacon, and sausage'


下面是另外一个综合了位置参数和关键字参数的例子:>>>"I love {0}, {1}, and {param}".format("eggs", "bacon", param="sausage")
'I love eggs, bacon, and sausage'


请记住,在关键字参数之后放置非关键字参数是一种语法错误。要想转义花括号,只需使用双倍的花括号,如下所示:>>>"{{0}}".format("can't see me")
'{0}'


位置参数 can't see me 没有被输出,这是因为没有字段可以输出。请注意这不会产生错误。

新的 format() 内置函数可以格式化单个值。比如:>>>print(format(10.0, "7.3g"))
      10


换言之,g 代表的是 一般格式,它输出的是宽度固定的值。小数点前的第一个数值指定的是最小宽度,小数点后的数值指定的是精度。format specifier 的完整语法超出了本文的讨论范围,更多信息,可以参见本文的 参考资料 小节。

内置 dict 类型的变化

3.0 内的另一个重大改变是字典内 dict.iterkeys()、 dict.itervalues() 和 dict.iteritems() 方法的删除。取而代之的是 .keys()、 .values() 和 .items(),它们被进行了修补,可以返回轻量的、类似于集的容器对象,而不是键和值的列表。这样的好处是在不进行键和条目复制的情况下,就能在其上执行 set 操作。例如:>>>d = {1:"dead", 2:"parrot"}
>>>print(d.items())
<built-in method items of dict object at 0xb7c2468c>


注意:在 Python 内,集 是惟一元素的无序集合。

这里,我创建了具有两个键和值的一个字典,然后输出了 d.items() 的值,返回的是一个对象,而不是值的列表。可以像 set 对象那样测试某个元素的成员资格,比如:>>>1 in d # test for membership
True


如下是在 dict_values 对象的条目上进行迭代的例子:>>>for values in d.items():
...    print(values)
...
dead
parrot


不过,如果您的确想要得到值的列表,可以对所返回的 dict 对象进行强制类型转换。比如:>>>keys = list(d.keys())
>>>print(keys)
[1,2]

新的 I/O 元类

Wikipedia 对元类的定义是这样的,“一个元类 是这样一个类,其实例也是类。”


在深入研究 I/O 的新机制之前,很有必要先来看看抽象基类( abstract base classes,ABC)。

ABC 是一些无法被实例化的类。要使用 ABC,子类必须继承自此 ABC 并且还要覆盖其抽象方法。如果方法的前缀使用 @abstractmethod 修饰符(decorator),那么此方法就是一个抽象方法。新的 ABC 框架还提供了 @abstractproperty 修饰符以便定义抽象属性。可以通过导入标准库模块 abc 来访问这个新框架。清单 1 所示的是一个简单的例子。

清单 1. 一个简单的抽象基类
from abc import ABCMeta

class SimpleAbstractClass(metaclass=ABCMeta):
    pass

SimpleAbstractClass.register(list)

assert isinstance([], SimpleAbstractClass)


register() 方法调用接受一个类作为其参数并会让此 ABC 成为所注册类的子类。这一点可以通过在最后一行上调用 assert 语句进行验证。清单 2 是使用修饰符的另外一个例子。

清单 2. 使用修饰符的一个抽象基类
from abc import ABCMeta, abstractmethod

class abstract(metaclass=ABCMeta):
    @abstractmethod
    def absMeth(self):
        pass

class A(abstract):
    # must implement abstract method
    def absMeth(self):
        return 0


了解了 ABC 之后,我们就可以继续探究新的 I/O 系统了。之前的 Python 发布版都缺少一些重要但是出色的函数,比如用于类似于流的对象的 seek()。 类似于流的对象 是一些具有 read() 和 write() 方法的类似于文件的对象 — 比如,socket 或文件。Python 3 具有很多针对类似于流的对象的 I/O 层 — 一个原始的 I/O 层、一个被缓冲的 I/O 层以及一个文本 I/O 层 — 每层均由其自身的 ABC 及实现定义。

打开一个流还是需要使用内置的 open(fileName) 函数,但是也可以调用 io.open(fileName))。这么做会返回一个缓冲了的文本文件;read() 和 readline() 会返回字符串(请注意,Python 3 内的所有字符串都是 unicode)。您也可以使用 open(fileName, 'b') 打开一个缓冲了的二进制文件。在这种情况下,read() 会返回字节,但 readline() 则不能用。

此内置 open() 函数的构造函数是:open(file,mode="r",buffering=None,encoding=None,errors=None,newline=None,closefd=True)


可能的模式有:
r:读
w:打开供写入
a:打开供追加
b:二进制模式
t:文本模式
+:打开一个磁盘文件供更新
U:通用换行模式

默认的模式是 rt,即打开供读取的文本模式。

buffering 关键字参数的期望值是以下三个整数中的一个以决定缓冲策略:
0:关闭缓冲
1:行缓冲
> 1:完全缓冲(默认)

默认的编码方式独立于平台。关闭文件描述符或 closefd 可以是 True 或 False。如果是 False,此文件描述符会在文件关闭后保留。若文件名无法奏效的话,那么 closefd 必须设为 True。

open() 返回的对象取决于您所设置的模式。表 1 给出了返回类型。

表 1. 针对不同打开模式的返回类型模式 返回对象
文本模式 TextIOWrapper
二进制 BufferedReader
写二进制 BufferedWriter
追加二进制 BufferedWriter
读/写模式 BufferedRandom


请注意:文本模式可以是 w、 r、wt、 rt 等。

清单 3 中所示的例子打开的是一个缓冲了的二进制流以供读取。

清单 3. 打开一个缓冲了的二进制流以供读取
>>>import io
>>>f = io.open("hashlib.pyo", "rb")  # open for reading in binary mode
>>>f                                # f is a BufferedReader object
<io.BufferedReader object at 0xb7c2534c>
>>>f.close()                        # close stream


BufferedReader 对象可以访问很多有用的方法,比如 isatty、 peek、raw、 readinto、readline、 readlines、seek、 seekable、tell、 writable、write 和 writelines。要想查看完整列表,可以在 BufferedReader 对象上运行 dir()。
Python 3.x与Python 2.x版本区别与变化 Python是一种强大而广泛使用的编程语言,它已经经历了许多版本的演变。在最新的Python 3.x系列中,与Python 2.x版本相比,有许多重要的区别和变化。本文将介绍这些区别,并提供相关的示例代码。print//5 / 2xrangerangexrangerangestrstrunicodestrunicodestrbytesunicode这些是Python 3.x与Python 2.x版本之间的一些重要区别和变化。了解这些差异对于从Python 2.x迁移到Python 3.x的项目非常重要。 阅读详情

相关推荐

VCS2018在Ubuntu20 18安装步骤

之前在Ubuntu20上下VCS,花了好几天时间,本来想写博客避免以后重复劳动。但由于各种原因拖了一两个月,这次由于疫情原因,期末考试推迟,所以就再次在Ubuntu18上下了VCS,顺便写博客记录。 以下VCS2018安装方法适用于 Ubuntu20、Ubuntu18,亲测可用。其他Linux发行版没试过,但应该步骤差不多。 文章目录安装包安装步骤1、建立安装路径,更改权限2、运行安装器进行安装3、生成License文件4、设置环境变量5、验证License6、启动lmgrd验证软件是否安装成功dvever

s-stone的博客 3万+

Python各版本的差异总结

Python2 Python3 Python3.4 Python3.5 Python3.6 Python3.7 Python3.8 Python3.9 Python3.10 Python3.11 Python3.12 Python3.13 Python3.14 Python3.15

LeoHsiao的博客 8万+

RandLA-Net 调通代码1:Windows 11 + Tensorflow 2.4 + S3DIS数据集【踩坑+填坑】

TF不上进啊,学学pytorch

累了就要打游戏 2481

Python3.0以后各个版本区别介绍

Python3.0以后各个版本区别介绍

努力让自己发光,对的人才能迎着光而来 3万+

YOLOv11改进策略【Neck】| 替换RT-DETR中的CCFF跨尺度特征融合颈部结构,优化计算瓶颈与冗余问题

RT-DETR中的CCFF模块用于优化多尺度特征融合,解决传统方法的计算瓶颈与冗余问题,提升模型速度与精度,以适应实时检测需求。

Limiiiing的博客 1830

用 SAP CDS View 和 Fiori Elements 快速打造 CRM Service Order 应用──十分钟跑通从数据模型到上线的全流程

通过CDS 视图 + Fiori Elements的组合,我们得以在极短时间内把传统 CRM Service Order 场景迁移到现代化的 Fiori 界面,而且代码量极小、可维护性高。若后续需要离线能力,可考虑将同一 OData 服务暴露给 Mobile Services,再配合 MDK 或 UI5 Mobile Toolkit;若要支持复杂审批流,则可以在同一 Launchpad 内嵌入 Process Visibility Dashboard,实现端到端可视化。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 390

Python语言演进全解析:从2.7到3.14,探索能力变化与背后的演进逻辑!

本文系统梳理了Python从2008年3.0到2024年3.13版本的演进历程。核心变化包括:1)编程风格现代化(f-string、async/await语法);2)类型系统完善(PEP484类型提示);3)性能突破(FasterCPython项目使3.11比3.10提速25%);4)虚拟机技术创新(3.13实验性JIT编译器和自由线程模式)。推动力主要来自AI/ML需求(PyPI包数量8倍增长)和云计算发展。未来将深化性能优化(预计3.14再提速20%)和类型系统。Python通过持续革新,保持了在快速变

2401_85390073的博客 1620

基于Python的军事装备数据爬取与分析:从网页抓取到数据可视化实战

本文将详细介绍如何使用Python最新技术栈构建一个完整的军事装备数据爬虫系统。我们将从爬虫基础讲起,逐步深入到异步爬取、反反爬策略、数据存储与分析等高级主题,最终实现一个能够自动抓取、清洗、存储和分析军事装备数据的完整解决方案。文章包含大量实战代码示例,涉及requests-html、aiohttp、Playwright等现代爬虫库,以及MongoDB存储、Pandas分析和Pyecharts可视化等技术。关键词:Python爬虫、军事数据、异步爬取、反反爬、数据可视化。

2201_76125261的博客 1188

python3x_Python 3.x 新特性及10大变化

Python 3.x 起始版本是Python 3.0,目前的最新版本是 3.3.3Python之父Guido van Rossum谈到了Python 3.0的构思:一直以来,除非要打破向后兼容性,否则很多缺陷和错误都无法修复。因此,Python 3000将会作为第一个放弃向后兼容性的Python版本,目的就是要让Python向着最好的语言前进。Python的3.0版本,常被称为Python 300...

weixin_39653320的博客 341

SOEM主站开发篇(1):移植SOEM主站到Linux开发板

详细介绍了SOEM主站源码移植到Linux开发板上的步骤,同时演示了如何使用Linux开发板获取EtherCAT从站的PDO映射信息。

kevin1499的博客 2397

PCB铺铜技巧如何铺铜经验总结

铺铜是指在PCB电气层添加整块的铜皮;铺铜包括电源层铺铜,地层铺铜和信号走线层空闲区域铺铜;铺铜是PCB设计的一个重要的环节。

fydar的博客 1万+

python 从2.x-3.x一些变化

1、urllib2是python自带的模块,在python3.x中被改为urllib.request,如 url = "http://music.baidu.com/album/all?order=time&style=pop" html = urllib.request.urlopen(url).read() 2、raw_input 和 input 在 Python 版本 2.x 中,r

兔子临死前的专栏 4633

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Python 3.x 新特性及10大变化

这篇文章主要介绍了Python 3.x 新特性及10大变化,本文讲解了Python之父Guido van Rossum谈到了Python 3.0的构思,Python3版本的一些变化如print() and exec() 函数、整数及除法、input()代替raw_input()等,需要的朋友可以参考下 Python 3.x 起始版本是Python 3.0,目前的最新版本是 3.3.3 Pytho...

q2214543299的博客 816

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Python.2x改到Python3.x变化

1) print的变化                  print必须加括号了。                print "hello" 改为 print("hello")                print >> sys.stderr, "log123 " 改为 print("log123",file=sys.   stderr)   2) import 的变化

我在全球村 1243

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Python 3.x 新特性及10大变化

一、print() and exec() 函数python旧版本里,print和exec是作为一语句出现,可以用print “Hello,World!”, 来打印一个语句,在新版本里,print()和exec()作为一个函数出现,所以上面的写就是错误的,应该写成print (“Hello,World!”)对于Java的程序员来说,这样的改变应该是比较熟悉System.out.print(“Hello

Mrzhangjwei的博客 1454

python2.x到python3.x函数变化

首先,python 3.x中urllib库和urilib2库合并成了urllib库。 其中urllib2.urlopen()变成了urllib.request.urlopen() urllib2.Request()变成了urllib.request.Request() import urllib.request 转载于:https://www.cnblogs.com/babyfei/p/1...

weixin_30737433的博客 144

python 3.0 print_Python 3.x 新特性及10大变化

python 3.x 起始版本是Python 3.0,目前的最新版本是 3.3.3Python之父Guido van Rossum谈到了Python 3.0的构思:一直以来,除非要打破向后兼容性,否则很多缺陷和错误都无法修复。因此,Python 3000将会作为第一个放弃向后兼容性的Python版本,目的就是要让Python向着最好的语言前进。Python的3.0版本,常被称为Python 300...

weixin_42526166的博客 481

python2.X与python3.X爬虫常用的模块变化对应

详细说明

Greedy Hat的博客 188

Python3.x中input的变化:input函数默认返回字符串类型

背景:学习《Python基础教程第2版》,第10.3章 标准库:一些最爱 时, 运行如下例子: 用户选择投掷的骰子数以及每个骰子具有的面数,随机返回骰子的点数,代码如下: from random import randrange num = input('How many dice? ') sides = input('How many sides per die? ') sum = ...

keiko1228的博客 1万+

Python3入门学习以及与2x版本的变化部位整理(持续)

从3x版本开始学习python,但用的教材中讲的却是2x版本的代码。所以遇到很多不能执行或执行错误的情况。百度之后知道是2x版到3x版变化比较大。 于是想边学边把自己遇到的不一样的地方记录下来... 版本:2x版 3x版 1、print "Code Here!"+param print("Code Here!"+param) #作用:打印、输出 2、raw_input(

BE A MAN 578

python3.x map()函数有变化

python 3相对python2 map返回有点小变化 print( list(map(lambda…, …) )) 要想得到列表 得用list() 转换哈 否者得到是map对象。 来自百度。

杨过 224

记录一下 python2.x 和 python3.x 中urllib库的变化情况

Py2.x:Urllib库Urllin2库Py3.x:Urllib库变化:在Pytho2.x中使用import urllib2——-对应的,在Python3.x中会使用import urllib.request,urllib.error。在Pytho2.x中使用import urllib——-对应的,在Python3.x中会使用import urllib.request,urllib.error,...

wunai006的博客 312

python3.x与2.x的一些变化

对比python 3.x和2.x的一些变化

573
上一篇: Android adb root权限
下一篇: 病毒问题汇集
UnixCRoot
博客等级 码龄14年 17粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值