最新消息:

Python 3 中闪亮的特性

python admin 2637浏览 0评论

距离 Python 3 发布已经有一段时间了,主流发行版都已经带了 Python 3 的软件包,甚至 Arch 等发行版还将其设为了默认的 Python 版本。多数的库也已经带了 Python 3 的支持(也有 Twisted、Django 等例外),是不是偶尔也想着要不要将自己的程序升级一下呢?

昨天稍微有时间研究了一下 Python 3,就将我在文档中找到的有趣新特性分享给大家。

默认返回迭代器(Iterator)

print 成为一个函数、默认不用地板除(Floor Divide)之类的我就不说了,想必地球人都知道有这么回事。

值得一提的是,原来需要使用 xrange 、 iteritems 等等函数和方法才能返回的迭代器现在成为了默认,替代了原来返回列表的函数。就连 map 、 filter 、 zip 等函数都返回迭代器了。

大家都知道相对于返回完整的列表,迭代器省去了一次生成所有元素的开销,并且在循环 break 的时候,就停止迭代,防止了额外的开销,所以一般情况下迭代器要比列表快得多。

如果你仍然需要完整列表,可以通过 list(some_iter) 构造,不过这种问题往往使用列表解析(List comprehension)就能够解决。

字符串分为 str 和 bytes

在 Python 2 中,字符串分为 ASCII 码表示(‘some text’)和 Unicode 表示(u‘Unicode 字符串’),默认为 ASCII 码。

不过在 Python 3 中,默认就是万能的 Unicode 码了,所以字符串前面不用加字母 u 也可以写 Unicode 了,当然这不是重点,重点是不会有各种 ASCII 和 Unicode 转换和混用带来的错误了。

另外, Python 3 中增加了一种 bytes 对象(b‘xb6xfexbdxf8xd6xc6xcaxfdxbexdd’),专门用来表示编码后的(二进制)数据,所以现在对字符串的编码就是从 str 到 bytes 的转换,反之亦然,两者不能混用,这样编码与否一目了然,免除了很多错误。

源文件编码默认为 UTF–8

Python 3 在字符编码方面有很多改进,其中之一就是默认的源文件编码从 ASCII 变为 UTF–8 ,也就是说以前在文件头加上的各种花样的 coding=utf–8 不再需要了!

<code class="language-python" data-lang="python"><span class="c"># coding: UTF-8</span>
<span class="c"># vim:fileencoding=UTF-8</span>
<span class="c"># -*- coding=UTF-8 -*-</span>
<span class="c"># vim: set fileencoding=UTF-8</span></code>

标识符支持非 ASCII 字符

这个自行理解,易语言表示压力很大。

<code class="language-pycon" data-lang="pycon"><span class="gp">&gt;&gt;&gt; </span><span class="err">所有</span> <span class="o">=</span> <span class="nb">all</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="err">男人:</span>
<span class="go">...     @classmethod</span>
<span class="go">...     def 包括(cls, Ta):</span>
<span class="go">...         return isinstance(Ta, cls)</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="err">一起玩(人们):</span>
<span class="go">...     if 所有(男人.包括(Ta) for Ta in 人们):</span>
<span class="go">...         print('他们是基友')</span>
<span class="go">...     else:</span>
<span class="go">...         print('他们是朋友')</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="err">小攻</span> <span class="o">=</span> <span class="err">男人</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="err">小受</span> <span class="o">=</span> <span class="err">男人</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="err">一起玩</span><span class="p">([</span><span class="err">小攻</span><span class="p">,</span><span class="err">小受</span><span class="p">])</span>
<span class="go">他们是基友</span>
<span class="go">&gt;&gt;&gt;</span></code>

新的字符串格式化语法

原来的 %s %d %你妹 语法已经不推荐,并且很快会被弃用,新的字符串格式化方法(2.6 版引入)为 str.format 或者内置函数 format 。比如:

<code class="language-pycon" data-lang="pycon"><span class="gp">&gt;&gt;&gt; </span><span class="err">三青年</span> <span class="o">=</span> <span class="p">{</span><span class="s">'小红'</span><span class="p">:</span><span class="s">'普通青年'</span><span class="p">,</span><span class="s">'小明'</span><span class="p">:</span><span class="s">'文艺青年'</span><span class="p">,</span><span class="s">'小亮'</span><span class="p">:</span><span class="s">'二逼青年'</span><span class="p">}</span>
<span class="gp">&gt;&gt;&gt; </span><span class="s">'{小红}说我想吃罐头,{小明}说更上一层楼,{小亮}说阿伊呀伊呦。'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="err">三青年</span><span class="p">)</span>
<span class="go">'普通青年说我想吃罐头,文艺青年说更上一层楼,二逼青年说阿伊呀伊呦。'</span>
<span class="go">&gt;&gt;&gt;</span></code>

字典解析和集合解析

有了列表解析,当然也少不了字典解析:

<code class="language-pycon" data-lang="pycon"><span class="gp">&gt;&gt;&gt; </span><span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="n">v</span> <span class="o">+</span> <span class="s">'青年'</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="p">[(</span><span class="s">'小明'</span><span class="p">,</span> <span class="s">'文艺'</span><span class="p">),</span> <span class="p">(</span><span class="s">'小红'</span><span class="p">,</span> <span class="s">'普通'</span><span class="p">),</span> <span class="p">(</span><span class="s">'小亮'</span><span class="p">,</span> <span class="s">'二逼'</span><span class="p">)]}</span>
<span class="go">{'小明': '文艺青年', '小红': '普通青年', '小亮': '二逼青年'}</span>
<span class="go">&gt;&gt;&gt;</span></code>

还有集合解析:

<code class="language-pycon" data-lang="pycon"><span class="gp">&gt;&gt;&gt; </span><span class="p">{</span><span class="err">小吃</span> <span class="k">for</span> <span class="err">小吃</span> <span class="ow">in</span> <span class="p">(</span><span class="s">'豆浆'</span><span class="p">,</span> <span class="s">'油条'</span><span class="p">,</span> <span class="s">'包纸'</span><span class="p">)}</span>
<span class="go">{'油条', '包纸', '豆浆'}</span>
<span class="go">&gt;&gt;&gt;</span></code>

有序字典与 configparser

默认 Python 字典是无序的,不过新引入的 collections.OrderedDict 类提供了一种有序字典实现,并且被 configparser 默认使用,现在使用 configparser 类就可以得到有序的 ini 格式配置文件了!

而 configparser 模块现在完全支持使用类字典的方法进行读写了!你妹,我之前的工作全白做了!

ABC

抽象基类(Abstract Base Classes),就是像 C++ 里面虚类一样的东西。作为其子类,只有将所有抽象方法都实现,才能实例化。

抽象基类是对 Duck Typing 的补充,由于引入了 @abstractmethod@abstractstaticmethod@abstractclassmethod@abstractproperty 四个修饰符,强制抽象方法必须实现,所以可以一定程度上避免错误,用起来感觉比 Duck Typing 安心一些。

结局

以上就是我把 Python 3.0 到 3.2 的 What’s new 看了一遍的成果,总体来说 Python 3 本身变得更加规范,更加灵活,如果你的程序不依赖于 Python 2 特有的库的话,来试试 Python 3 很不错!

结局?结局?结局就是小亮和小红幸福地生活在了一起,小明自己吃豆浆油条包纸。

转载请注明:爱开源 » Python 3 中闪亮的特性

您必须 登录 才能发表评论!