<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Os on On My Way</title>
    <link>https://tuanzi-wow.cn/tags/os/</link>
    <description>Recent content in Os on On My Way</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Fri, 04 Sep 2026 00:00:00 +0800</lastBuildDate>
    <atom:link href="https://tuanzi-wow.cn/tags/os/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>10. 标准库概览</title>
      <link>https://tuanzi-wow.cn/python/python-10-stdlib/</link>
      <pubDate>Fri, 04 Sep 2026 00:00:00 +0800</pubDate>
      <guid>https://tuanzi-wow.cn/python/python-10-stdlib/</guid>
      <description>操作系统接口、文件通配符、命令行参数、错误输出重定向、字符串匹配与数字格式等常用标准库。</description>
      <content:encoded><![CDATA[<h2 id="101操作系统接口">10.1.操作系统接口</h2>
<p>import os
一定要使用import os而非from os import *
原因：防止内建的open（）函数被os.open()隐式替换掉
内置的dir（）和help（）函数可用作交互式的辅助工具</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">dir(os)
</span></span><span class="line"><span class="cl">&lt;返回由模块的所有函数组成的列表&gt;
</span></span><span class="line"><span class="cl">help(os)
</span></span><span class="line"><span class="cl">&lt;返回根据模块文档字符串创建的详细说明页面&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><p>对于日常文件和目录管理任务，<strong>shutil模块</strong>提供了易用的高层级接口</p>
<h2 id="102文件通配符">10.2.文件通配符</h2>
<p><strong>glob模块</strong>提供了一个在目录中使用通配符搜索创建文件列表的函数</p>
<p>示例如下:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">import glob
</span></span><span class="line"><span class="cl">glob.glob(&#39;*.py&#39;)
</span></span><span class="line"><span class="cl">[&#39;primes.py&#39;, &#39;random.py&#39;, &#39;quote.py&#39;]
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="103命令行参数">10.3.命令行参数</h2>
<p>参数是通过列表形式储存在<strong>sys模块</strong>的argv属性中
import sys来引入
<strong>argparse模块</strong><a href="https://docs.python.org/zh-cn/3/library/argparse.html#module-argparse"><code>argparse</code></a> 模块提供了一种更复杂的机制来处理命令行参数。 以下脚本可提取一个或多个文件名并可选择要显示的行数:（要用自己看）</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">import argparse
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">parser = argparse.ArgumentParser(
</span></span><span class="line"><span class="cl">    prog=&#39;top&#39;,
</span></span><span class="line"><span class="cl">    description=&#39;Show top lines from each file&#39;)
</span></span><span class="line"><span class="cl">parser.add_argument(&#39;filenames&#39;, nargs=&#39;+&#39;)
</span></span><span class="line"><span class="cl">parser.add_argument(&#39;-l&#39;, &#39;--lines&#39;, type=int, default=10)
</span></span><span class="line"><span class="cl">args = parser.parse_args()
</span></span><span class="line"><span class="cl">print(args)
</span></span></code></pre></td></tr></table>
</div>
</div><p>当通过 <code>python top.py --lines=5 alpha.txt beta.txt</code> 在命令行运行时，该脚本会将 <code>args.lines</code> 设为 <code>5</code> 并将 <code>args.filenames</code> 设为 <code>['alpha.txt', 'beta.txt']</code>。</p>
<h2 id="104错误输出重定向和程序终止">10.4.错误输出重定向和程序终止</h2>
<p><strong>sys模块</strong>的stdin，stdout，stderr属性，其中stderr在发出警告和错误信息很有用
终止脚本：<strong>sys.exit()</strong></p>
<h2 id="105字符串模式匹配">10.5.字符串模式匹配</h2>
<p><strong>re模块</strong>为高级表达式提供正则表达式工具</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">import re
</span></span><span class="line"><span class="cl">re.findall(r&#39;\bf[a-z]*&#39;, &#39;which foot or hand fell fastest&#39;)
</span></span><span class="line"><span class="cl">[&#39;foot&#39;, &#39;fell&#39;, &#39;fastest&#39;]
</span></span><span class="line"><span class="cl">re.sub(r&#39;(\b[a-z]+) \1&#39;, r&#39;\1&#39;, &#39;cat in the the hat&#39;)
</span></span><span class="line"><span class="cl">&#39;cat in the hat&#39;
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&#39;tea for too&#39;.replace(&#39;too&#39;, &#39;two&#39;)
</span></span><span class="line"><span class="cl">&#39;tea for two&#39;
</span></span></code></pre></td></tr></table>
</div>
</div><p>正则表达式是的，<code>yield</code> 和普通函数中的 <code>return</code> 最大的不同在于：<strong><code>yield</code> 不会让函数彻底结束，而是会让函数“暂停”，以后还能从暂停的位置继续执行。</strong></p>
<p>这就是它最特别的地方。</p>
<table>
	<thead>
			<tr>
					<th>正则</th>
					<th>含义</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>r''</code></td>
					<td>Python 原始字符串</td>
			</tr>
			<tr>
					<td><code>\b</code></td>
					<td>单词边界</td>
			</tr>
			<tr>
					<td><code>[a-z]</code></td>
					<td>任意一个小写字母</td>
			</tr>
			<tr>
					<td><code>*</code></td>
					<td>0 次或多次</td>
			</tr>
			<tr>
					<td><code>+</code></td>
					<td>1 次或多次</td>
			</tr>
			<tr>
					<td><code>()</code></td>
					<td>捕获组</td>
			</tr>
			<tr>
					<td><code>\1</code></td>
					<td>引用第一个捕获组</td>
			</tr>
			<tr>
					<td><code>findall()</code></td>
					<td>找出所有匹配内容</td>
			</tr>
			<tr>
					<td><code>sub()</code></td>
					<td>查找并替换</td>
			</tr>
	</tbody>
</table>
<h2 id="106数字">10.6.数字</h2>
<p>math模块：众多数学方法
random：随机选择工具
statistics：计算数值数据的基本统计属性：例如均值，中位数，方差等等</p>
<h2 id="107互联网访问">10.7.互联网访问</h2>
<p>挺多的，最简单的两个
<a href="https://docs.python.org/zh-cn/3/library/urllib.request.html#module-urllib.request"><code>urllib.request</code></a> 用于从URL检索数据，以及 <a href="https://docs.python.org/zh-cn/3/library/smtplib.html#module-smtplib"><code>smtplib</code></a> 用于发送邮件</p>
<h2 id="108日期和时间">10.8.日期和时间</h2>
<p>datatime模块</p>
<h2 id="109数据压缩">10.9.数据压缩</h2>
<p>常见的数据存档和压缩格式由模块直接支持，包括：<a href="https://docs.python.org/zh-cn/3/library/zlib.html#module-zlib"><code>zlib</code></a>, <a href="https://docs.python.org/zh-cn/3/library/gzip.html#module-gzip"><code>gzip</code></a>, <a href="https://docs.python.org/zh-cn/3/library/bz2.html#module-bz2"><code>bz2</code></a>, <a href="https://docs.python.org/zh-cn/3/library/lzma.html#module-lzma"><code>lzma</code></a>, <a href="https://docs.python.org/zh-cn/3/library/zipfile.html#module-zipfile"><code>zipfile</code></a> 和 <a href="https://docs.python.org/zh-cn/3/library/tarfile.html#module-tarfile"><code>tarfile</code></a></p>
<h2 id="1010性能测试">10.10.性能测试</h2>
<h2 id="1010-性能测量">10.10. 性能测量</h2>
<p>一些 Python 用户对了解同一问题的不同方法的相对性能产生了浓厚的兴趣。Python 提供了一种可以立即回答这些问题的测量工具。</p>
<p>例如，元组封包和拆包功能相比传统的交换参数可能更具吸引力。<a href="https://docs.python.org/zh-cn/3/library/timeit.html#module-timeit"><code>timeit</code></a> 模块可以快速演示在运行效率方面一定的优势:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">from timeit import Timer
</span></span><span class="line"><span class="cl">Timer(&#39;t=a; a=b; b=t&#39;, &#39;a=1; b=2&#39;).timeit()
</span></span><span class="line"><span class="cl">0.57535828626024577
</span></span><span class="line"><span class="cl">Timer(&#39;a,b = b,a&#39;, &#39;a=1; b=2&#39;).timeit()
</span></span><span class="line"><span class="cl">0.54962537085770791
</span></span></code></pre></td></tr></table>
</div>
</div><p>与 <a href="https://docs.python.org/zh-cn/3/library/timeit.html#module-timeit"><code>timeit</code></a> 的精细粒度级别相反， <a href="https://docs.python.org/zh-cn/3/library/profile.html#module-profile"><code>profile</code></a> 和 <a href="https://docs.python.org/zh-cn/3/library/profile.html#module-pstats"><code>pstats</code></a> 模块提供了用于在较大的代码块中识别时间关键部分的工具。</p>
<h2 id="1011质量控制写测试">10.11.质量控制（写测试）</h2>
<p>这个感觉会有点用</p>
<p>开发高质量软件的一种方法是在开发过程中为每个函数编写测试，并在开发过程中经常运行这些测试。</p>
<p><a href="https://docs.python.org/zh-cn/3/library/doctest.html#module-doctest"><code>doctest</code></a> 模块提供了一个工具，用于扫描模块并验证程序文档字符串中嵌入的测试。测试构造就像将典型调用及其结果剪切并粘贴到文档字符串一样简单。这通过向用户提供示例来改进文档，并且它允许 doctest 模块确保代码与文档保持一致:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">def average(values):
</span></span><span class="line"><span class="cl">    &#34;&#34;&#34;计算数字列表的算术平均值
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    &gt;&gt;&gt; print(average([20, 30, 70]))
</span></span><span class="line"><span class="cl">    40.0
</span></span><span class="line"><span class="cl">    &#34;&#34;&#34;
</span></span><span class="line"><span class="cl">    return sum(values) / len(values)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">import doctest
</span></span><span class="line"><span class="cl">doctest.testmod()   # 自动验证嵌入式测试
</span></span></code></pre></td></tr></table>
</div>
</div><p><a href="https://docs.python.org/zh-cn/3/library/unittest.html#module-unittest"><code>unittest</code></a> 模块不像 <a href="https://docs.python.org/zh-cn/3/library/doctest.html#module-doctest"><code>doctest</code></a> 模块那样易于使用，但它允许在一个单独的文件中维护更全面的测试集:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">import unittest
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">class TestStatisticalFunctions(unittest.TestCase):
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    def test_average(self):
</span></span><span class="line"><span class="cl">        self.assertEqual(average([20, 30, 70]), 40.0)
</span></span><span class="line"><span class="cl">        self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
</span></span><span class="line"><span class="cl">        with self.assertRaises(ZeroDivisionError):
</span></span><span class="line"><span class="cl">            average([])
</span></span><span class="line"><span class="cl">        with self.assertRaises(TypeError):
</span></span><span class="line"><span class="cl">            average(20, 30, 70)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">unittest.main()  # 从命令行调用时会执行所有测试
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="1012内置电池">10.12.内置电池</h2>
<p>Python 有&quot;自带电池&quot;的理念。通过其包的复杂和强大功能可以最好地看到这一点。例如:</p>
<ul>
<li><a href="https://docs.python.org/zh-cn/3/library/xmlrpc.client.html#module-xmlrpc.client"><code>xmlrpc.client</code></a> 和 <a href="https://docs.python.org/zh-cn/3/library/xmlrpc.server.html#module-xmlrpc.server"><code>xmlrpc.server</code></a> 模块使得实现远程过程调用变成了小菜一碟。 尽管存在于模块名称中，但用户不需要直接了解或处理 XML。</li>
<li><a href="https://docs.python.org/zh-cn/3/library/email.html#module-email"><code>email</code></a> 包是一个用于管理电子邮件消息的库，包括 MIME 和其他基于 <a href="https://datatracker.ietf.org/doc/html/rfc5322.html"><strong>RFC 5322</strong></a> 的消息文档。 不同于实际发送和接收消息的 <a href="https://docs.python.org/zh-cn/3/library/smtplib.html#module-smtplib"><code>smtplib</code></a> 和 <a href="https://docs.python.org/zh-cn/3/library/poplib.html#module-poplib"><code>poplib</code></a>，email 包提供用于构建或解码复杂消息结构（包括附件）以及实现互联网编码格式和标头协议的完整工具集。</li>
<li><a href="https://docs.python.org/zh-cn/3/library/json.html#module-json"><code>json</code></a> 包为解析这种流行的数据交换格式提供了强大的支持。 <a href="https://docs.python.org/zh-cn/3/library/csv.html#module-csv"><code>csv</code></a> 模块支持以逗号分隔值格式直接读取和写入文件，这种格式通常为数据库和电子表格所支持。 XML 处理由 <a href="https://docs.python.org/zh-cn/3/library/xml.etree.elementtree.html#module-xml.etree.ElementTree"><code>xml.etree.ElementTree</code></a> ， <a href="https://docs.python.org/zh-cn/3/library/xml.dom.html#module-xml.dom"><code>xml.dom</code></a> 和 <a href="https://docs.python.org/zh-cn/3/library/xml.sax.html#module-xml.sax"><code>xml.sax</code></a> 包支持。这些模块和软件包共同大大简化了 Python 应用程序和其他工具之间的数据交换。</li>
<li><a href="https://docs.python.org/zh-cn/3/library/sqlite3.html#module-sqlite3"><code>sqlite3</code></a> 模块是 SQLite 数据库库的包装器，提供了一个可以使用稍微非标准的 SQL 语法更新和访问的持久数据库。</li>
<li>国际化由许多模块支持，包括 <a href="https://docs.python.org/zh-cn/3/library/gettext.html#module-gettext"><code>gettext</code></a> ， <a href="https://docs.python.org/zh-cn/3/library/locale.html#module-locale"><code>locale</code></a> ，以及 <a href="https://docs.python.org/zh-cn/3/library/codecs.html#module-codecs"><code>codecs</code></a> 包。</li>
</ul>
<h2 id="11-标准库概览--第二部分">11. 标准库概览 · 第二部分</h2>
<h2 id="111输出的格式化">11.1.输出的格式化</h2>
<p><a href="https://docs.python.org/zh-cn/3/library/reprlib.html#module-reprlib"><code>reprlib</code></a> 模块提供了一个定制化版本的 <a href="https://docs.python.org/zh-cn/3/library/functions.html#repr"><code>repr()</code></a> 函数，用于缩略显示大型或深层嵌套的容器对象
<a href="https://docs.python.org/zh-cn/3/library/pprint.html#module-pprint"><code>pprint</code></a> 模块提供了更加复杂的打印控制，其输出的内置对象和用户自定义对象能够被解释器直接读取。当输出结果过长而需要折行时，“美化输出机制”会添加换行符和缩进，以更清楚地展示数据结构:
<a href="https://docs.python.org/zh-cn/3/library/textwrap.html#module-textwrap"><code>textwrap</code></a> 模块能够格式化文本段落，以适应给定的屏幕宽度:
<a href="https://docs.python.org/zh-cn/3/library/locale.html#module-locale"><code>locale</code></a> 模块处理与特定地域文化相关的数据格式。locale 模块的 format 函数包含一个 grouping 属性，可直接将数字格式化为带有组分隔符的样式:</p>
<h2 id="112模块">11.2.模块</h2>
<p><a href="https://docs.python.org/zh-cn/3/library/string.html#module-string"><code>string</code></a> 模块包含一个通用的 <a href="https://docs.python.org/zh-cn/3/library/string.html#string.Template"><code>Template</code></a> 类，具有适用于最终用户的简化语法。它允许用户在不更改应用逻辑的情况下定制自己的应用。</p>
<p>上述格式化操作是通过占位符实现的，占位符由 <code>$</code> 加上合法的 Python 标识符（只能包含字母、数字和下划线）构成。一旦使用花括号将占位符括起来，就可以在后面直接跟上更多的字母和数字而无需空格分割。<code>$$</code> 将被转义成单个字符 <code>$</code>:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">from string import Template
</span></span><span class="line"><span class="cl">t = Template(&#39;${village}folk send $$10 to $cause.&#39;)
</span></span><span class="line"><span class="cl">t.substitute(village=&#39;Nottingham&#39;, cause=&#39;the ditch fund&#39;)
</span></span><span class="line"><span class="cl">&#39;Nottinghamfolk send $10 to the ditch fund.&#39;
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果在字典或关键字参数中未提供某个占位符的值，那么 <a href="https://docs.python.org/zh-cn/3/library/string.html#string.Template.substitute"><code>substitute()</code></a> 方法将抛出 <a href="https://docs.python.org/zh-cn/3/library/exceptions.html#KeyError"><code>KeyError</code></a>。对于邮件合并类型的应用，用户提供的数据有可能是不完整的，此时使用 <a href="https://docs.python.org/zh-cn/3/library/string.html#string.Template.safe_substitute"><code>safe_substitute()</code></a> 方法更加合适 —— 如果数据缺失，它会直接将占位符原样保留。</p>
<h2 id="113操作二进制数据记录布局">11.3.操作二进制数据记录布局</h2>
<p><a href="https://docs.python.org/zh-cn/3/library/struct.html#module-struct"><code>struct</code></a> 模块提供了 <a href="https://docs.python.org/zh-cn/3/library/struct.html#struct.pack"><code>pack()</code></a> 和 <a href="https://docs.python.org/zh-cn/3/library/struct.html#struct.unpack"><code>unpack()</code></a> 函数，用于处理不定长度的二进制记录格式。</p>
<h2 id="114-多线程之前学java有点学吐了">11.4. 多线程（之前学JAVA有点学吐了）</h2>
<p>线程是一种对于非顺序依赖的多个任务进行解耦的技术。多线程可以提高应用的响应效率，当接收用户输入的同时，保持其他任务在后台运行。一个有关的应用场景是，将 I/O 和计算运行在两个并行的线程中。</p>
<p>以下代码展示了高阶的 <a href="https://docs.python.org/zh-cn/3/library/threading.html#module-threading"><code>threading</code></a> 模块如何在后台运行任务，且不影响主程序的继续运行:</p>
<p>Copy</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">import threading, zipfile
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">class AsyncZip(threading.Thread):
</span></span><span class="line"><span class="cl">    def __init__(self, infile, outfile):
</span></span><span class="line"><span class="cl">        super().__init__()
</span></span><span class="line"><span class="cl">        self.infile = infile
</span></span><span class="line"><span class="cl">        self.outfile = outfile
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    def run(self):
</span></span><span class="line"><span class="cl">        with zipfile.ZipFile(self.outfile, &#39;w&#39;, zipfile.ZIP_DEFLATED) as f:
</span></span><span class="line"><span class="cl">            f.write(self.infile)
</span></span><span class="line"><span class="cl">        print(&#39;Finished background zip of:&#39;, self.infile)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">background = AsyncZip(&#39;mydata.txt&#39;, &#39;myarchive.zip&#39;)
</span></span><span class="line"><span class="cl">background.start()
</span></span><span class="line"><span class="cl">print(&#39;The main program continues to run in foreground.&#39;)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">background.join()    # 等待后台任务结束
</span></span><span class="line"><span class="cl">print(&#39;Main program waited until background was done.&#39;)
</span></span></code></pre></td></tr></table>
</div>
</div><p>多线程应用面临的主要挑战是，相互协调的多个线程之间需要共享数据或其他资源。为此，threading 模块提供了多个同步操作原语，包括线程锁、事件、条件变量和信号量。</p>
<p>尽管这些工具非常强大，但微小的设计错误却可以导致一些难以复现的问题。因此，实现多任务协作的首选方法是将所有对资源的请求集中到一个线程中，然后使用 <a href="https://docs.python.org/zh-cn/3/library/queue.html#module-queue"><code>queue</code></a> 模块向该线程供应来自其他线程的请求。 应用程序使用 <a href="https://docs.python.org/zh-cn/3/library/queue.html#queue.Queue"><code>Queue</code></a> 对象进行线程间通信和协调，更易于设计，更易读，更可靠。</p>
<h2 id="115日志记录">11.5.日志记录</h2>
<p><a href="https://docs.python.org/zh-cn/3/library/logging.html#module-logging"><code>logging</code></a> 模块提供功能齐全且灵活的日志记录系统,在最简单的情况下，日志消息被发送到文件或 <code>sys.stderr</code></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">import logging
</span></span><span class="line"><span class="cl">logging.debug(&#39;Debugging information&#39;)
</span></span><span class="line"><span class="cl">logging.info(&#39;Informational message&#39;)
</span></span><span class="line"><span class="cl">logging.warning(&#39;Warning:config file %s not found&#39;, &#39;server.conf&#39;)
</span></span><span class="line"><span class="cl">logging.error(&#39;Error occurred&#39;)
</span></span><span class="line"><span class="cl">logging.critical(&#39;Critical error -- shutting down&#39;)
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="116弱引用这个在java的gc相关部分貌似也有">11.6.弱引用（这个在JAVA的GC相关部分貌似也有）</h2>
<p><a href="https://docs.python.org/zh-cn/3/library/weakref.html#module-weakref"><code>weakref</code></a> 模块提供的工具可以不必创建引用就能跟踪对象。 当对象不再需要时，它将自动从一个弱引用表中被移除，并为弱引用对象触发一个回调。 典型应用包括对创建开销较大的对象进行缓存</p>
<h2 id="117操作列表的工具懒得看要用的时候自然会查">11.7.操作列表的工具（懒得看，要用的时候自然会查）</h2>
<p>许多对于数据结构的需求可以通过内置列表类型来满足。 但是，有时也会需要具有不同效费比的替代实现。</p>
<p><a href="https://docs.python.org/zh-cn/3/library/array.html#module-array"><code>array</code></a> 模块提供了一种 <a href="https://docs.python.org/zh-cn/3/library/array.html#array.array"><code>array</code></a> 对象，它类似于列表，但只能存储类型一致的数据且存储密度更高。 下面的例子显示了一个由存储为双字节无符号整数的数字 (类型码 <code>&quot;H&quot;</code>) 组成的元组，而不是常规 Python int 对象列表所采用的每个条目 16 字节:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">from array import array
</span></span><span class="line"><span class="cl">a = array(&#39;H&#39;, [4000, 10, 700, 22222])
</span></span><span class="line"><span class="cl">sum(a)
</span></span><span class="line"><span class="cl">26932
</span></span><span class="line"><span class="cl">a[1:3]
</span></span><span class="line"><span class="cl">array(&#39;H&#39;, [10, 700])
</span></span></code></pre></td></tr></table>
</div>
</div><p><a href="https://docs.python.org/zh-cn/3/library/collections.html#module-collections"><code>collections</code></a> 模块提供了一种 <a href="https://docs.python.org/zh-cn/3/library/collections.html#collections.deque"><code>deque</code></a> 对象，它类似于列表，但从左端添加和弹出的速度较快而在中间查找的速度较慢。 此种对象适用于实现队列和广度优先树搜索:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">from collections import deque
</span></span><span class="line"><span class="cl">d = deque([&#34;task1&#34;, &#34;task2&#34;, &#34;task3&#34;])
</span></span><span class="line"><span class="cl">d.append(&#34;task4&#34;)
</span></span><span class="line"><span class="cl">print(&#34;Handling&#34;, d.popleft())
</span></span><span class="line"><span class="cl">Handling task1
</span></span><span class="line"><span class="cl">unsearched = deque([starting_node])
</span></span><span class="line"><span class="cl">def breadth_first_search(unsearched):
</span></span><span class="line"><span class="cl">    node = unsearched.popleft()
</span></span><span class="line"><span class="cl">    for m in gen_moves(node):
</span></span><span class="line"><span class="cl">        if is_goal(m):
</span></span><span class="line"><span class="cl">            return m
</span></span><span class="line"><span class="cl">        unsearched.append(m)
</span></span></code></pre></td></tr></table>
</div>
</div><p>在替代的列表实现以外，标准库也提供了其他工具，例如 <a href="https://docs.python.org/zh-cn/3/library/bisect.html#module-bisect"><code>bisect</code></a> 模块具有用于操作有序列表的函数:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">import bisect
</span></span><span class="line"><span class="cl">scores = [(100, &#39;perl&#39;), (200, &#39;tcl&#39;), (400, &#39;lua&#39;), (500, &#39;python&#39;)]
</span></span><span class="line"><span class="cl">bisect.insort(scores, (300, &#39;ruby&#39;))
</span></span><span class="line"><span class="cl">scores
</span></span><span class="line"><span class="cl">[(100, &#39;perl&#39;), (200, &#39;tcl&#39;), (300, &#39;ruby&#39;), (400, &#39;lua&#39;), (500, &#39;python&#39;)]
</span></span></code></pre></td></tr></table>
</div>
</div><p><a href="https://docs.python.org/zh-cn/3/library/heapq.html#module-heapq"><code>heapq</code></a> 模块提供了基于常规列表来实现堆的函数。 最小值的条目总是保持在位置零。 这对于需要重复访问最小元素而不希望运行完整列表排序的应用来说非常有用:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">from heapq import heapify, heappop, heappush
</span></span><span class="line"><span class="cl">data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
</span></span><span class="line"><span class="cl">heapify(data)                      # 将列表重新调整为堆顺序
</span></span><span class="line"><span class="cl">heappush(data, -5)                 # 添加一个新条目
</span></span><span class="line"><span class="cl">[heappop(data) for i in range(3)]  # 获取三个最小的条目
</span></span><span class="line"><span class="cl">[-5, 0, 1]
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="118十进制浮点算法">11.8.十进制浮点算法</h2>
<p><a href="https://docs.python.org/zh-cn/3/library/decimal.html#module-decimal"><code>decimal</code></a> 模块提供了一种 <a href="https://docs.python.org/zh-cn/3/library/decimal.html#decimal.Decimal"><code>Decimal</code></a> 数据类型用于十进制浮点运算。 相比内置的 <a href="https://docs.python.org/zh-cn/3/library/functions.html#float"><code>float</code></a> 二进制浮点实现，该类特别适用于
这个算有点用</p>
<ul>
<li>财务应用和其他需要精确十进制表示的用途，</li>
<li><strong>控制精度，</strong></li>
<li>控制四舍五入以满足法律或监管要求，</li>
<li><strong>跟踪有效小数位，或</strong></li>
<li>用户期望结果与手工完成的计算相匹配的应用程序。</li>
</ul>
<p><a href="https://docs.python.org/zh-cn/3/library/decimal.html#decimal.Decimal"><code>Decimal</code></a> 表示的结果会保留尾部的零，并根据具有两个有效位的被乘数自动推出四个有效位。 Decimal 可以模拟手工运算来避免当二进制浮点数无法精确表示十进制数时会导致的问题。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
