- 浏览: 564817 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (478)
- lucene (45)
- oracle (19)
- nutch (2)
- blog (2)
- 垂直搜索 (19)
- java综合 (89)
- spring (15)
- Hibernate (9)
- Struts (9)
- Hadoop (16)
- Mysql (12)
- nosql (10)
- Linux (3)
- MyEclipse (4)
- Ant (1)
- 设计模式 (19)
- JBPM (1)
- JSP (1)
- HtmlParser (5)
- SVN (2)
- 插件 (2)
- 收藏 (7)
- Others (1)
- Heritrix (18)
- Solr (4)
- 主题爬虫 (31)
- 内存数据库 (24)
- 分布式与海量数据 (32)
- httpclient (14)
- Tomcat (1)
- 面试宝典 (6)
- Python (14)
- 数据挖掘 (1)
- 算法 (6)
- 其他 (4)
- JVM (12)
- Redis (18)
最新评论
-
hanjiyun:
本人水平还有待提高,进步空间很大,看这些文章给我有很大的指导作 ...
JVM的内存管理 Ⅲ -
liuxinglanyue:
四年后的自己:这种方法 不靠谱。 使用javaagent的方式 ...
计算Java对象占用内存空间的大小(对于32位虚拟机而言) -
jaysoncn:
附件在哪里啊test.NoCertificationHttps ...
使用HttpClient过程中常见的一些问题 -
231fuchenxi:
你好,有redis,memlink,mysql的测试代码吗?可 ...
MemLink 性能测试 -
guyue1015:
[color=orange][/color][size=lar ...
JAVA同步机制
转自:Cesar Otero
简介: Python 3 是 Guido van Rossum 功能强大的通用编程语言的最新版本。它虽然打破了与 2.x 版本的向后兼容性,但却清理了某些语法方面的问题。本文是系列文章中的第一篇,介绍了影响该语言及向后兼容性的各种变化,并且还提供了新特性的几个例子。
Python 版本 3,也被称为 Python 3000 或 Py3K(仿效 Microsoft® Windows® 2000 操作系统而命名的昵称)是 Guido van Rossum 通用编程语言的最新版本。虽然新版本对该核心语言做了很多改进,但还是打破了与 2.x 版本的向后兼容性。其他一些变化则是人们期待已久的,比如: 本文 — Python 3 系列文章中的第一篇 — 的内容涵盖了新的 如今,您将需要让手指习惯于键入 让我们考虑这样的情况,即需要将标准输出(stdout)重定向到一个日志。如下的例子会打开文件 log.txt 以便进行追加并将对象指定给 另外一个例子是重定向给标准错误(sys.stderr): 上述两个例子都不错,但还有更好的解决方案。新的语法只要求给 这样的代码,语法更为清晰。另一个好处是通过向 总地来说,新的语法为: 其中,方括号( 在 Python 版本 2.x 中, 与之不同,Python 2.x 中的 最初,曾有人建议将 将会变为: 对于一个简单输入而言,这太过繁琐,并且对于一个新手,这未免太难理解。往往需要向他们讲述模块 和导入 究竟是怎么回事、字符串输出以及句点操作符又是如何工作的(如此麻烦的话,与 Java™ 语言就没什么差别了)。所以,在 Python 3 内,将 新的数据类型 bytes literal 及 例如: 会创建一个 如果初始化器(initializer)是一个字符串,那么就必须提供一种编码。如果初始化器是一个 bytes literal,则无须指定编码类型:请记住,bytes literal 并不是字符串。但是与字符串相似,可以连接多个字节: 用 也可以从文件中直接读取二进制数据。请看以下的代码: 它的功能是打开文件以便在二进制模式内读取一个文件对象,并在整个文件内进行读取。 Python 具有单一的字符串类型 在 Python 之前的版本内, 现在,它会返回一个 unicode 字符串: 正如我之前提到的,这个字符串是内置的字符串类型。 字符串对象和字节对象是不兼容的。如果想要得到字节的字符串表示,需要使用它的 很多 Python 程序员都感觉用来格式化字符串的这个内置的 这种格式化多少有些不灵活,所以 Python 3 引入了一种新的进行字符串格式化的方式(版本 3 保留了 字段 {0}、{1} 和 {2} 通过位置参数 下面是另外一个综合了位置参数和关键字参数的例子: 请记住,在关键字参数之后放置非关键字参数是一种语法错误。要想转义花括号,只需使用双倍的花括号,如下所示: 位置参数 新的 换言之,g 代表的是 一般格式,它输出的是宽度固定的值。小数点前的第一个数值指定的是最小宽度,小数点后的数值指定的是精度。format specifier 的完整语法超出了本文的讨论范围,更多信息,可以参见本文的 参考资料 小节。 3.0 内的另一个重大改变是字典内 注意:在 Python 内,集 是惟一元素的无序集合。 这里,我创建了具有两个键和值的一个字典,然后输出了 如下是在 不过,如果您的确想要得到值的列表,可以对所返回的 Wikipedia 对元类的定义是这样的,“一个元类 是这样一个类,其实例也是类。” 在本系列的第 2 部分我会对这个概念进行详细的介绍。 在深入研究 I/O 的新机制之前,很有必要先来看看抽象基类( abstract base classes,ABC)。更深入的介绍将会在本系列的第 2 部分提供。 ABC 是一些无法被实例化的类。要使用 ABC,子类必须继承自此 ABC 并且还要覆盖其抽象方法。如果方法的前缀使用 了解了 ABC 之后,我们就可以继续探究新的 I/O 系统了。之前的 Python 发布版都缺少一些重要但是出色的函数,比如用于类似于流的对象的 打开一个流还是需要使用内置的 此内置 可能的模式有: 默认的模式是 默认的编码方式独立于平台。关闭文件描述符或 请注意:文本模式可以是 清单 3 中所示的例子打开的是一个缓冲了的二进制流以供读取。 Python 社区是否会接??版本 3 还尚在人们的猜测之中。打破向后兼容性意味着将要为两种版本提供支持。一些项目开发人员可能不太想迁移其项目,即便是使用版本 2 到 3 的转化器。就我个人而言,我发现从 Python 版本 2 迁移到 3 其实不过是对几个事情的重新认识:它当然不会像从 Python 迁移到 Java 或 Perl 语言那样变化强烈。很多变化是早就在人们意料中的,比如对 我猜想,blogosphere 内的一些帖子会让 Python 的支持者也会误认为其中的某些变更 — 例如对向后兼容性的打破 — 具有破坏性的影响。 Lambda 本来就是准备好要删除的,只不过一直没有这么做,仍保留了其原始的格式。有关保留项目的完整列表,请访问 Python 核心开发站点。如果您具备足够的探索精神愿意深入研究所有的 PEP,那么您一定能够从中获得更深入的信息。 本系列的下一期文章将会涵盖更高级的主题,比如元类语法、ABC、修饰符、integer literal 支持、基类型和异常。
long
和 int
类型被统一为一种类型,删除了后缀 L。True
、False
和 None
现在都是关键字。print()
函数、input()
、输入/输出(I/O)的变化、新的 bytes
数据类型、字符串和字符串格式化的变化以及内置的 dict
类型的变化。本文面向的是那些熟悉 Python 并对新版本的变化很感兴趣但又不想费力读完所有 Python Enhancement Proposal(PEP)的编程人员。(本文后面的 参考资料 部分提供了有关这些 PEP 的链接。)print("hello")
,而不是原来的 print "hello"
,这是因为 print
现在是一个函数,不再是一个语句。我知道,这多少有点痛苦。我认识的每个 Python 程序员 — 一旦安装了版本 3 并得到 “语法不正确” 错误 — 都会郁闷地大叫。我知道这两个额外的符号十分讨厌;我也知道这将会破坏向后兼容性。但是这种改变还是有好处的。fid
。之后,利用 print>>
将一个字符串重定向给文件 fid
:
>>>fid = open("log.txt", "a")
>>>print>>fid, "log text"
>>>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()
会从标准输入(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.'
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()
raw_input()
重命名为 input()
,这样一来,无须导入也能从标准输入获得数据了。如果您需要保留版本 2.x 的 input()
功能,可以使用 eval(input())
,效果基本相同。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'
>>>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
str
,其功能类似于版本 2.x 的 unicode 类型。换言之,所有字符串都是 unicode 字符串。而且 — 对非拉丁文的文本用户也非常方便 — 非-ASCII 标识符现在也是允许的。例如:
>>>césar = ["author", "consultant"]
>>>print(césar)
['author', 'consultant']
repr()
方法会将 8-位字符串转变为 ASCII。例如:
>>>repr('é')
"'\\xc3\\xa9'"
>>>repr('é')
"'é'"
decode()
方法。相反,如果想要从该字符串得到 bytes literal 表示,可以使用字符串对象的 encode()
方法。%
操作符太有限了,这是因为:
%
操作符和 string.Template
模块)。字符串对象现在均具有一个方法 format()
,此方法接受位置参数和关键字参数,二者均传递到 replacement 字段 。Replacement 字段在字符串内由花括号({}
)标示。replacement 字段内的元素被简单称为一个字段。以下是一个简单的例子:
>>>"I love {0}, {1}, and {2}".format("eggs", "bacon", "sausage")
'I love eggs, bacon, and sausage'
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
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>
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]
元类
@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
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. 打开一个缓冲了的二进制流以供读取
>>>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()
。dict
的实质更改。执行 print()
远比执行 Java 的 System.out.println()
容易得多,学习起来也相对容易,所以的确能带来一些好处。
发表评论
-
老王的Python教程-推荐
2011-02-02 22:46 1969强烈推荐,适合入门,适合深入 http://www.cnpy ... -
转贴一篇不错的Python入门教程 - Instant Hacking[译文]
2011-02-02 00:09 1937原文 http://www.hetland.org/ ... -
python快速入门教程
2011-02-01 23:41 1939python所支持的数据类型:整型、长整型、布尔型 ... -
python入门教程:语句和语法
2011-02-01 23:40 2245注释(#): python中的注 ... -
python教程:安装python运行环境以及简单程序
2011-02-01 23:38 2555python3.0已推出,但据说很多库都不能用了,建议 ... -
利用Python抓取和解析网页(二)补充
2011-02-01 23:34 1993五、为HTML文档中的属性值添加引号 前面我们 ... -
利用Python抓取和解析网页(二)
2011-02-01 23:31 5684对搜索引擎、文件索引、文档转换、数据检索、站点备份或迁移等应 ... -
利用Python抓取和解析网页(一)
2011-02-01 23:25 8052对搜索引擎、文件索引、文档转换、数据检索、站点备份或迁移等应用 ... -
Google Python 视频教程
2011-01-04 08:39 1626Google Python Class Day 1 Part ... -
Django学习笔记(收藏)
2011-01-01 15:43 1035Django笔记1 Django笔记2 ... -
用Redis存储好友关系-python版
2011-01-01 11:56 1424这是一个用Redis存储好友关系的python下使用Redis ... -
Python正则表达式指南
2010-12-23 12:12 12901. 正则表达式基础 1.1. 简单介绍 正则表达 ... -
Python 3 初探,第 2 部分: 高级主题
2010-12-07 20:00 1352转自:Cesar Otero 简介: Python 3 是 ...
相关推荐
第二章:Python初探 第三章:变量类型和运算符 第四章:列表,元组,字典和集合 第五章:Python字符串常用方法 第六章:Python流程控制 第七章:函数和lambda表达式 第八章:Python类和对象 第九章:Python异常处理...
Python 3 初探.pdf
Python 3 初探.docx
本文作为系列文章的第一部分,旨在深入探讨 Python 3 的关键新特性,为那些熟悉 Python 并渴望了解其更新内容的开发者提供一份详尽指南。 #### 新特性概述 1. **真正的除法**:Python 3 引入了一种更直观的除法...
- 第3章:Python对象类型初探 - 第4章:Python集成开发环境:Spyder介绍 - 第5章:Python运算符与使用 - 第6章:Python常用语句 - 第7章:函数 - 第8章:面向对象编程 - 第9章:Python标准库与数据操作 - 第10章:...
要开始使用Flask,首先需要在VSCode中创建一个新的Python文件,然后导入Flask库: ```python from flask import Flask app = Flask(__name__) ``` 接下来,我们可以定义路由和视图函数,以处理HTTP请求: ```...
#### Python第25课:初探List - **列表基础知识**:介绍列表的基本概念、创建方法及基本操作。 #### Python第26课:操作List - **列表操作**:深入讨论列表的各种操作,如追加元素、删除元素、排序等。 #### ...
##### 第一部分:初探Python - **第1章:编程基础与字符串**:介绍Python的基础知识,包括编程环境的搭建、基本的数据类型、变量以及字符串的操作方法。 - **第2章:数字与运算符**:详细介绍Python中的数值类型和...
这篇详细的文章将带你初探这个强大的组合,通过实践来学习如何利用Python与Qt Designer进行高效开发。 首先,Python是一种广泛使用的高级编程语言,以其简洁、易读的语法而闻名,适合各种项目,包括Web开发、数据...
《Python源码剖析》共两部分,是一部分析Python的好书,通过学习《Python源码剖析》,你...第1章 Python对象初探 1.1 Python内的对象 1.1.1 对象机制的基石--PyObject 1.1.2 定长对象和变长对象 1.2 类型对象 ……
Python语言以其简洁、易读的特性,以及强大的扩展性,成为跨平台计算机程序设计语言的代表。然而,Python也存在一些固有的程序弊端,如在单行语句和命令行中不能连写程序,以及比其他一些编程语言(如C++)更慢的...
《Python源码剖析》共两部分,是一部分析Python的好书,通过学习《Python源码剖析》,你...第1章 Python对象初探 1.1 Python内的对象 1.1.1 对象机制的基石--PyObject 1.1.2 定长对象和变长对象 1.2 类型对象 ……
本基于 Python 数据可视化的网易云音乐歌单分析系统,我使用了 ...通过这次 Python 数据分析初探项目的实践,我巩固了 Python 的语法知识,熟练应用了各个第三方开源模块,为之后的 Python 数据分析学习打下基础。
#### Python 第25课:初探list - **知识点**: - 列表的基本概念。 - 列表的创建。 - 列表索引与切片。 - 示例代码演示列表的基本操作。 #### Python 第26课:操作list - **知识点**: - 列表的基本操作方法。...
在当前的教育改革背景下,"基于学科核心素养的高中信息技术Python教学初探"是一个重要的议题。这个主题旨在探讨如何在高中信息技术课程中有效地融入Python编程教育,以提升学生的学科核心素养,包括信息处理能力、...
#### Python 第1课:安装 - **知识点**: - Python 安装包的选择(官方下载站点获取最新版本) - Windows/Linux/MacOS 下Python环境的安装步骤 - 环境变量配置方法(确保命令行下可全局访问Python) #### Python...
#### Python第3课:IDE - **知识点**:介绍集成开发环境(IDE)的概念,以及常用的Python IDE工具如PyCharm、VS Code等。 - **实践**:设置并使用IDE进行简单的Python编程。 #### Python第4课:输入 - **知识点**:...
- **Python_3_初探**:适合想要了解Python 3新特性的学习者,通过对比Python 2版本的不同之处,帮助读者更好地适应新版语言的变化。 - **Python_Pro编程_FAQ**:汇集了常见的Python编程问题及其解答,是解决实际编程...