<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Python on Chang Luo</title>
		<link>https://www.luochang.ink/tags/python/</link>
		<description>Recent content in Python on Chang Luo</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
		
		
		
			<lastBuildDate>Fri, 09 Feb 2024 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://www.luochang.ink/tags/python/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>手写深度学习</title>
				<link>https://www.luochang.ink/posts/d2l_from_scratch/</link>
				<pubDate>Fri, 09 Feb 2024 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/d2l_from_scratch/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;与其说深度学习是一门技术，不如说深度学习是一种语言&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/AI-Project/tree/main/scratch&#34; target=&#34;_blank&#34;&gt;AI-Project/scratch&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;一自动微分&#34;&gt;一、自动微分&lt;/h3&gt;&#xA;&lt;h4 id=&#34;1-简单的例子&#34;&gt;1. 简单的例子&lt;/h4&gt;&#xA;&lt;p&gt;1.1 张量 x 的梯度&lt;/p&gt;&#xA;&lt;p&gt;张量 \( x \) 的梯度可以存储在 \( x \) 上。&lt;/p&gt;&#xA;&lt;p&gt;要点：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;x.grad&lt;/code&gt;: 取 \( x \) 的梯度&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;x.requires_grad_(True)&lt;/code&gt;: 允许 tenser \( x \) 存储自己的梯度&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;x.grad.zero_()&lt;/code&gt;: 将 \( x \) 的梯度置零&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import torch&#xA;&#xA;# 初始化张量 x (tensor x)&#xA;x = torch.arange(4.0)&#xA;&#xA;x.requires_grad_(True)  # 允许 tensor x 存储梯度&#xA;x.grad is None  # 梯度默认为 None&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;&amp;gt; True&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;初始化带梯度的张量，下面是两个例子：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;torch.tensor([1., 2., 3.], requires_grad=True)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;&amp;gt; tensor([1., 2., 3.], requires_grad=True)&lt;/code&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>深度学习笔记</title>
				<link>https://www.luochang.ink/posts/d2l/</link>
				<pubDate>Sat, 11 Nov 2023 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/d2l/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;跟李沐老师学深度学习，课程见 &lt;a href=&#34;https://zh-v2.d2l.ai/index.html&#34;&gt;d2l&lt;/a&gt;，如有错误，欢迎拍砖 &lt;img src=&#34;https://www.luochang.ink/img/quyin/witty.png&#34; class=&#34;my-emoji&#34; style = &#34;height: 32px;&#34;&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/AI-Project&#34; target=&#34;_blank&#34;&gt;AI-Project&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;技术路线图&#34;&gt;〇、技术路线图&lt;/h3&gt;&#xA;&lt;pre class=&#34;mermaid&#34;&gt;&#xA;flowchart TD&#xA;    A[softmax 回归] --&gt;|无法拟合 XOR 函数| B[多层感知机]&#xA;    B --&gt; |高像素图片作为输入，模型参数爆炸| C[卷积]&#xA;    C --&gt;|数据的长宽下降太快| D[填充]&#xA;    C --&gt;|数据的长宽下降太慢| E[步幅]&#xA;    C --&gt;|缓解卷积对位置敏感| F[池化]&#xA;    C --&gt;|多模式识别与组合| G[多通道输入/输出]&#xA;&#xA;&lt;/pre&gt;&#xA;&lt;center&gt;❤️ powered by &lt;a href=&#34;https://github.com/mermaid-js/mermaid&#34; target=&#34;_blank&#34;&gt;mermaid&lt;/a&gt;&lt;/center&gt;&#xA;&lt;h3 id=&#34;一softmax-回归&#34;&gt;一、softmax 回归&lt;/h3&gt;&#xA;&lt;h4 id=&#34;1-虽然叫回归但是softmax-解决的是分类问题&#34;&gt;1. 虽然叫回归，但是softmax 解决的是分类问题&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;回归估计是一个连续值&lt;/li&gt;&#xA;&lt;li&gt;分类预测是一个离散类别&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;2-分类应用举例&#34;&gt;2. 分类应用举例&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;MINIST&lt;/li&gt;&#xA;&lt;li&gt;ImageNet&lt;/li&gt;&#xA;&lt;li&gt;human-protein-atlas-image-classification (&lt;strong&gt;Kaggle&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;malware-classification (&lt;strong&gt;Kaggle&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;jigsaw-comment-classification (&lt;strong&gt;Kaggle&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;3-从回归到多类分类--均方损失&#34;&gt;3. 从回归到多类分类 &amp;ndash; 均方损失&lt;/h4&gt;&#xA;&lt;p&gt;对分类结果做 one-hot 编码：&lt;/p&gt;&#xA;&lt;p&gt;\( y = [y_1, y_2, , ... , y_n]^T \)&lt;/p&gt;&#xA;&lt;p&gt;\( y_i=\left\{\begin{array}{l}1 \text { if } i=y \\ 0 \text { otherwise }\end{array}\right. \)&lt;/p&gt;</description>
			</item>
			<item>
				<title>PyPI 打包小记</title>
				<link>https://www.luochang.ink/posts/pypi_packaging/</link>
				<pubDate>Wed, 18 Oct 2023 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/pypi_packaging/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;你们这些家伙，好好看看我是怎么打包的吧！&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/hit-and-blow&#34; target=&#34;_blank&#34;&gt;hit-and-blow&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;官方教程：&lt;a href=&#34;https://packaging.python.org/en/latest/tutorials/packaging-projects/&#34;&gt;Packaging Python Projects&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;背景知识：&lt;a href=&#34;https://docs.python.org/3/tutorial/modules.html#packages&#34;&gt;Modules&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;一文件结构介绍&#34;&gt;一、文件结构介绍&lt;/h3&gt;&#xA;&lt;p&gt;打包前，需构建如下文件结构：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;packaging_tutorial/&#xA;├── LICENSE&#xA;├── pyproject.toml&#xA;├── README.md&#xA;├── src/&#xA;│   └── YOUR_PACKAGE_NAME/&#xA;│       ├── __init__.py&#xA;│       └── example.py&#xA;└── tests/&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;各个 &lt;code&gt;文件&lt;/code&gt; / &lt;code&gt;文件夹&lt;/code&gt; 说明：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;packaging_tutorial&lt;/code&gt;: 项目文件夹&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;LICENSE&lt;/code&gt;: 开源协议，可由 GitHub 生成&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;pyproject.toml&lt;/code&gt;: 打包配置文件&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;README.md&lt;/code&gt;: 项目文档&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;src&lt;/code&gt;: 项目结构要求的，用来放主程序&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;YOUR_PACKAGE_NAME&lt;/code&gt;: 主程序文件夹，以“你的包名”命名文件夹&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;二添加配置文件&#34;&gt;二、添加配置文件&lt;/h3&gt;&#xA;&lt;p&gt;将以下内容修改一下，改改名字邮箱什么的，存成配置文件 &lt;code&gt;pyproject.toml&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[build-system]&#xA;requires = [&amp;#34;hatchling&amp;#34;]&#xA;build-backend = &amp;#34;hatchling.build&amp;#34;&#xA;&#xA;[project]&#xA;name = &amp;#34;example_package_YOUR_USERNAME_HERE&amp;#34;&#xA;version = &amp;#34;0.0.1&amp;#34;&#xA;authors = [&#xA;  { name=&amp;#34;Example Author&amp;#34;, email=&amp;#34;author@example.com&amp;#34; },&#xA;]&#xA;description = &amp;#34;A small example package&amp;#34;&#xA;readme = &amp;#34;README.md&amp;#34;&#xA;requires-python = &amp;#34;&amp;gt;=3.7&amp;#34;&#xA;classifiers = [&#xA;    &amp;#34;Programming Language :: Python :: 3&amp;#34;,&#xA;    &amp;#34;License :: OSI Approved :: MIT License&amp;#34;,&#xA;    &amp;#34;Operating System :: OS Independent&amp;#34;,&#xA;]&#xA;&#xA;[project.urls]&#xA;&amp;#34;Homepage&amp;#34; = &amp;#34;https://github.com/pypa/sampleproject&amp;#34;&#xA;&amp;#34;Bug Tracker&amp;#34; = &amp;#34;https://github.com/pypa/sampleproject/issues&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;三打包&#34;&gt;三、打包&lt;/h3&gt;&#xA;&lt;h4 id=&#34;31-准备打包环境&#34;&gt;3.1 准备打包环境&lt;/h4&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;python3 -m pip install --upgrade pip&#xA;python3 -m pip install --upgrade build&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;32-打包&#34;&gt;3.2 打包&lt;/h4&gt;&#xA;&lt;p&gt;来到 &lt;code&gt;pyproject.toml&lt;/code&gt; 所在目录，打开命令行，运行代码：&lt;/p&gt;</description>
			</item>
			<item>
				<title>统计学补完计划</title>
				<link>https://www.luochang.ink/posts/learning_statistics/</link>
				<pubDate>Sat, 01 May 2021 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/learning_statistics/</guid>
				<description>&lt;!-- &gt; 统计并非抽象的学科。虽然派生了推断、估计等抽象概念，但它并非为抽象而抽象，为思辩而思辨。&#xA;&gt; &#xA;&gt; 统计发展抽象概念，通常是为了解决现实中的问题。举个例子，一根头发也没有的人是秃子。那么有十根头发的人呢？有二十根头发的人呢？在一般的认识里，我们认为他们也是秃子。那么究竟要达到多少根毛，才能不被称为秃子呢？统计推断可以利用样本的分布信息，给这个问题一个量化的解答。这就是统计的魅力所在。 --&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;统计学绝非一门生硬无趣的学科，它有着鲜活的案例和丰富的实验，让我们循着公式乘着代码在统计的海洋里尽情摇摆叭 &lt;img src=&#34;https://www.luochang.ink/img/quyin/maimeng.png&#34; class=&#34;my-emoji&#34; style = &#34;height: 32px;&#34;&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;1-回归分析&#34;&gt;1. 回归分析&lt;/h3&gt;&#xA;&lt;h4 id=&#34;11-简单线性回归模型&#34;&gt;1.1 简单线性回归模型&lt;/h4&gt;&#xA;&lt;h5 id=&#34;1-回归方程&#34;&gt;(1) 回归方程&lt;/h5&gt;&#xA;&lt;p&gt;许多回归分析都是在如下假设前提下开始的：\( y \) 和 \( x \) 是两个代表某个总体的变量，我们希望用 \( x \) 解释 \( y \)，通过一个线性方程，我们可以刻画 \( y \) 和 \( x \) 之间的关系：&#xA;&lt;/p&gt;&#xA;$$y=\beta_{0}+\beta_{1} x+u \quad (1.1)$$&lt;p&gt;&#xA;假定方程 (1.1) 在我们所关注的总体中成立，它便定义了一个&lt;strong&gt;简单线性回归模型&lt;/strong&gt; (simple linear regression model).&lt;/p&gt;&#xA;&lt;p&gt;其中，各符号含义如下：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;\( y \): 因变量（或被解释变量、回归子）&lt;/li&gt;&#xA;&lt;li&gt;\( x \): 自变量（或解释变量、回归元）&lt;/li&gt;&#xA;&lt;li&gt;\( u \): 误差项（或干扰项）&lt;/li&gt;&#xA;&lt;li&gt;\( \beta_{1} \): 斜率参数&lt;/li&gt;&#xA;&lt;li&gt;\( \beta_{0} \): 截距参数&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;举例来说，假设我们用方程 (1.1) 来刻画大豆收成：\( y \) 表示收成，\( x \) 表示施肥量，\( u \) 则包括了诸如土地质量、降水量等因素。&lt;/p&gt;</description>
			</item>
			<item>
				<title>泊松分布的仿真及可视化</title>
				<link>https://www.luochang.ink/posts/poisson/</link>
				<pubDate>Sat, 19 Sep 2020 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/poisson/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;本文介绍泊松分布和泊松函数的定义，并通过 Python random 库对泊松分布进行仿真，带你触摸复杂表象下的简单本质。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/python-tips/blob/master/poisson/poisson.py&#34; target=&#34;_blank&#34;&gt;python-tips/poisson&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-从泊松函数讲起&#34;&gt;1. 从泊松函数讲起&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Poisson_distribution&#34;&gt;泊松分布&lt;/a&gt; 表示在&lt;strong&gt;给定时间段&lt;/strong&gt;内发生&lt;strong&gt;给定数量的事件&lt;/strong&gt;的概率。这个定义比较抽象。举个具体的例子，假设你每小时接到电话的概率是固定的，比如每小时 0.05 个，那么你在接下来 1 小时内接到电话个数的概率，就服从泊松分布:&lt;/p&gt;&#xA;&lt;p&gt;1 小时内接到 0 个电话，对应一个概率值 \( P_0 \)；&lt;/p&gt;&#xA;&lt;p&gt;1 小时内接到 1 个电话，对应一个概率值 \( P_1 \)；&lt;/p&gt;&#xA;&lt;p&gt;&amp;hellip; &amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;1 小时内接到 n 个电话，也对应一个概率值\( P_n \)。&lt;/p&gt;&#xA;&lt;p&gt;这些概率值组成一个概率分布列，它们的值  \( (n, P_n) \)  在二维坐标下连成一条&lt;strong&gt;曲线&lt;/strong&gt;。这条曲线所在的函数就是&lt;strong&gt;泊松分布的概率密度函数&lt;/strong&gt;。其公式及图像如下：&lt;/p&gt;&#xA;$$\boxed{P(k | t, \lambda)=\frac{(\lambda t)^{k}}{k !} \exp (-\lambda t)}$$&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/The-Poisson-distribution.png&#34; alt=&#34;image&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;从公式中，我们可以看出：只要确定了 \( \lambda \) 和 \( t \)，该式就退化成了概率 \( P \) 关于事件发生次数 \( k \) 的函数。 类似地，如果我们确定了 \( \lambda \) 和 \( k \)，则该式退化成概率\( P \) 关于时间范围 \( t \) 的函数。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Python 工程化实践</title>
				<link>https://www.luochang.ink/posts/python_practice/</link>
				<pubDate>Sun, 14 Jun 2020 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/python_practice/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;学 Python 不应仅限于学编程，同样应该学习工程知识，比如虚拟环境、编码风格以及单元测试等。本文致力于介绍 Python 工程化所需的前置知识。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;font color=&#34;red&#34;&gt;⚠️&lt;/font&gt; 注意：以下教程适用于 MacOS。&lt;/p&gt;&#xA;&lt;h2 id=&#34;部署环境&#34;&gt;部署环境&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-anaconda&#34;&gt;1. Anaconda&lt;/h3&gt;&#xA;&lt;p&gt;Anaconda 是一个包管理器，它能让你方便的管理 Python 版本和包版本。并且， Anaconda 聚合了 Jupyter notebook，使其大受数据科学家和人工智能工程师的欢迎。下面我们来介绍如何用 Anaconda 管理我们的 Python 环境。&lt;/p&gt;&#xA;&lt;p&gt;如果你还没有 Anaconda，安装一个：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;海外用户直接访问 &lt;a href=&#34;https://www.anaconda.com/products/individual&#34;&gt;Anaconda 官网&lt;/a&gt; 下载即可&lt;/li&gt;&#xA;&lt;li&gt;国内用户无法访问 Anaconda 官网(被墙)，建议选择&lt;a href=&#34;https://mirrors.tuna.tsinghua.edu.cn/anaconda/&#34;&gt;清华镜像&lt;/a&gt;替代。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;安装完以后，在命令行界面输入 &lt;code&gt;conda&lt;/code&gt;，会打印一个帮助文档。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/conda-command.png&#34; alt=&#34;image&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;帮助文档大概是说 conda 有哪些常用命令，比如下面这些：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda &lt;span style=&#34;color:#6639ba&#34;&gt;help&lt;/span&gt;  &lt;span style=&#34;color:#57606a&#34;&gt;# 打印帮助文档&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda info  &lt;span style=&#34;color:#57606a&#34;&gt;# 查看conda信息，包括当前在哪个环境，环境路径，Python版本等信息&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda list  &lt;span style=&#34;color:#57606a&#34;&gt;# 列出conda下安装了哪些包&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda install &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt;package_name&lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;  &lt;span style=&#34;color:#57606a&#34;&gt;# 在conda环境中安装某个包&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda update &lt;span style=&#34;color:#0550ae&#34;&gt;[&lt;/span&gt;package_name&lt;span style=&#34;color:#0550ae&#34;&gt;]&lt;/span&gt;  &lt;span style=&#34;color:#57606a&#34;&gt;# 升级conda环境中的某个包&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;：后文仅专注介绍虚拟环境相关内容，更多内容请在 &lt;a href=&#34;https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html&#34;&gt;Anaconda 官方文档&lt;/a&gt; 中查看。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Python 环境分为本地环境(lcoal env) 和全局环境 (global env) 。为一个项目配置环境，应该配置本地环境；为本机所有项目配置环境，则应该配置全局环境。&lt;/p&gt;&#xA;&lt;h4 id=&#34;-部署全局环境&#34;&gt;① 部署全局环境&lt;/h4&gt;&#xA;&lt;p&gt;📖 新建环境&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda create --name myenv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上述命令新建一个名为 &lt;code&gt;myenv&lt;/code&gt; 的全局环境.&lt;/p&gt;</description>
			</item>
			<item>
				<title>算法集萃</title>
				<link>https://www.luochang.ink/posts/algorithms/</link>
				<pubDate>Fri, 03 Apr 2020 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/algorithms/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;算法学习笔记，长期更新 &lt;img src=&#34;https://www.luochang.ink/img/quyin/witty.png&#34; class=&#34;my-emoji&#34; style = &#34;height: 32px;&#34;&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/python-tips/tree/master/algorithms&#34; target=&#34;_blank&#34;&gt;python-tips/algorithms&lt;/a&gt;&lt;/p&gt;&#xA;&lt;!-- ### 查找&#xA;&#xA;（1）二分查找&#xA;&#xA;LeetCode 704&#xA;&#xA;给定有序列表 nums，查找目标 target。如果不存在输出 -1；存在则输出下标。&#xA;```python&#xA;class Solution:&#xA;    def search(self, nums, target):&#xA;        if nums:&#xA;            left = mid = 0&#xA;            right = len(nums)&#xA;            while left &lt; right:&#xA;                mid = left + (right - left) // 2&#xA;                if nums[mid] == target:&#xA;                    return mid&#xA;                elif nums[mid] &lt; target:&#xA;                    left = mid + 1&#xA;                elif nums[mid] &gt; target:&#xA;                    right = mid&#xA;        return -1&#xA;```&#xA;&#xA;（2）100 以内质数&#xA;&#xA;统计 100 以内质数的数量。&#xA;&#xA;```python&#xA;class Solution:&#xA;    def prime(self):&#xA;        ans = [2]&#xA;        for i in range(3, 100):&#xA;            flag = True&#xA;            for j in ans:&#xA;                if i % j == 0:&#xA;                    flag = False&#xA;            if flag:&#xA;                ans.append(i)&#xA;        return ans&#xA;```&#xA;&#xA;（3）计数质数&#xA;&#xA;LeetCode 204&#xA;&#xA;统计所有小于非负整数 n 的质数的数量。&#xA;&#xA;```python&#xA;class Solution:&#xA;    def countPrimes(self, n):&#xA;        if n &lt; 3:&#xA;            return 0&#xA;        res = [1] * n&#xA;        res[0], res[1] = 0, 0&#xA;        for i in range(2, int(n**0.5)+1):&#xA;            if res[i] == 1:&#xA;                res[i*i:n:i] = [0]*len(res[i*i:n:i])&#xA;        return sum(res)&#xA;``` &#xA;--&gt;&#xA;&lt;h3 id=&#34;排序&#34;&gt;排序&lt;/h3&gt;&#xA;&lt;p&gt;本节介绍各种排序算法的思路和特点，并提供了示例代码。&lt;/p&gt;</description>
			</item>
			<item>
				<title>用魔法打败魔法！</title>
				<link>https://www.luochang.ink/posts/chico_and_dico/</link>
				<pubDate>Fri, 21 Feb 2020 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/chico_and_dico/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;Chico 和 Dico 是两位魔术师，他们有一个经典魔术：根据任意四张牌猜第五张牌。但完成这个魔术并不需要任何魔术师的技巧，因为它完全建立在数学原理之上。只需要一点数学知识和充分的练习，你也能表演这个魔术！&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/chico-and-dico&#34; target=&#34;_blank&#34;&gt;chico-and-dico&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;chico-和-dico-的魔术&#34;&gt;Chico 和 Dico 的魔术&lt;/h3&gt;&#xA;&lt;p&gt;Chico 和 Dico 是两位魔术师，他们经常表演的一个魔术是这样的：Chico 将一副 52 张的扑克牌交给一位观众，让他随机抽取其中的 5 张。然后 Chico 将这 5 张牌按一定的顺序重新排列，再将其还给观众。上述整个过程 Dico 都是看不见的。然而，当观众按 Chico 排好的顺序依次展示前四张牌之后，Dico 却能准确地说出第五张牌是什么。&lt;/p&gt;&#xA;&lt;p&gt;乍一看这个魔术很神奇。随机抽取 5 张牌，你能从前 4 张牌中看出第 5 张牌是什么吗？对于普通人来说，当然不可能。Chico 和 Dico 的秘诀在于 Chico 有机会将扑克重新排序。如果两人事先约定好某种协议，Chico 是有可能通过扑克排列的顺序，向 Dico 传递关于第 5 张牌的信息的。&lt;/p&gt;&#xA;&lt;p&gt;关键在于如何实现这种协议。&lt;/p&gt;&#xA;&lt;h3 id=&#34;数学模型&#34;&gt;数学模型&lt;/h3&gt;&#xA;&lt;p&gt;在进行分析之前，我们需要把 Chico 和 Dico 的魔术抽象成一个数学模型。&lt;/p&gt;&#xA;&lt;p&gt;魔术本身已经提供了一些建模信息。我们可以假设一共有 n 张牌，抽取其中的 k 张。在对牌组进行某种排序之后，我们需要利用前 (k - j) 张牌的信息，推测后 j 张牌是什么。&lt;/p&gt;&#xA;&lt;!-- 其中，中间那步排序操作，本质上是利用前 (k - j) 张牌的顺序信息对后 j 张牌进行编码。 --&gt;&#xA;&lt;p&gt;现在我们有 n, j, k 三个变量，下面我们来进一步探究三个变量之间究竟服从何种关系。&lt;/p&gt;</description>
			</item>
			<item>
				<title>贝叶斯方法</title>
				<link>https://www.luochang.ink/posts/bayesian/</link>
				<pubDate>Fri, 31 Jan 2020 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/bayesian/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;统计学中有两大学派，频率学派和贝叶斯学派。频率派用总体信息和样本信息进行统计推断。而贝叶斯派除了使用以上两种信息之外，还使用&lt;strong&gt;先验信息&lt;/strong&gt;进行统计推断。本文从数学原理和编程实践两个方向探究贝叶斯方法。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;本文从数学原理和编程实践两个方面来介绍贝叶斯方法。&lt;/p&gt;&#xA;&lt;h2 id=&#34;数学原理&#34;&gt;数学原理&lt;/h2&gt;&#xA;&lt;p&gt;贝叶斯理论包含很多内容。我们熟悉的利用先验分布推后验分布的方法被称为&lt;strong&gt;贝叶斯推理&lt;/strong&gt;（Bayesian inference）。此外，还可以利用参数的后验分布的均值作为该参数的点估计，这种方法被称为&lt;strong&gt;贝叶斯估计&lt;/strong&gt;（Bayesian estimation）。本文数学原理部分主要介绍贝叶斯推理和贝叶斯估计。&lt;/p&gt;&#xA;&lt;p&gt;理论部分为六节，各节的主要内容如下。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;章节&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;主要内容&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;第一节&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;用一个简单的实例，让大家对贝叶斯方法有一个形象的认识。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;第二节&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;用一个复杂的实例，让大家对贝叶斯方法的术语有一个形象的认识。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;第三节&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;介绍贝叶斯公式的事件形式及其推导。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;第四节&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;介绍贝叶斯公式的密度函数形式及其推导。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;第五节&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;介绍贝叶斯估计。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;第六节&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;探索联合分布蕴含了哪些信息。&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;一实例癌症化验的准确率&#34;&gt;一、实例：癌症化验的准确率&lt;/h3&gt;&#xA;&lt;p&gt;下面请各位做题家们做一下你们最爱的经典老题 &lt;img src=&#34;https://www.luochang.ink/img/quyin/watermaleon.png&#34; class=&#34;my-emoji&#34; style = &#34;height: 32px;&#34;&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;-题目&#34;&gt;📖 题目&lt;/h4&gt;&#xA;&lt;p&gt;&lt;strong&gt;有两个可选的假设&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;p&gt;病人有癌症（cancer）、病人无癌症（normal）&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;可用数据来自化验结果&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;p&gt;正（+）、负（-）&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;有先验知识&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;p&gt;在所有人口中，患病率是 0.8%。对确实有病的患者的化验准确率为 98%，对确实无病的患者的化验准确率为 97%，总结如下：&lt;/p&gt;&#xA;&lt;p&gt;\(  P(cancer) = 0.008, P(normal) = 0.992 \\ P(+ | cancer) = 0.98, P(- | cancer) = 0.02 \\ P(+ | normal) = 0.03, P(- | normal) = 0.97  \)&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;p&gt;假定有一个新病人，化验结果为正，是否应将病人断定为有癌症？求后验概率 \(  P(cancer | +)  \)。&lt;/p&gt;</description>
			</item>
			<item>
				<title>我的 Python 不可能这么可爱</title>
				<link>https://www.luochang.ink/posts/python_tips/</link>
				<pubDate>Thu, 14 Nov 2019 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/python_tips/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;Python 学习笔记，如有错误，欢迎指正 &lt;img src=&#34;https://www.luochang.ink/img/quyin/witty.png&#34; class=&#34;my-emoji&#34; style = &#34;height: 32px;&#34;&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/python-tips&#34; target=&#34;_blank&#34;&gt;python-tips&lt;/a&gt;&lt;/p&gt;&#xA;&lt;!-- 本文从 2019 年 11 月一路更新到了 2020 年 11 月，我也从实习转向了正式工作。一年前，我尚未将 Python 视作主力编程语言。但今天，它毫无疑问已经是我最熟稔的伙伴之一了。&#xA;&#xA;Python 有许多缺点，但是它在机器学习、科学计算、可视化、网络编程等方面的优势，几乎无可匹敌。它的身影在一些不追求高性能的、离线低频次的场景下频繁出现。在诸如数据分析、算法预研、仿真建模等领域，都将 Python 作为首选语言。 --&gt;&#xA;&lt;!-- 它的实用性毋庸置疑，在与计算机有学科交叉的科研院所，包括物理学、天文学、地质学、飞行动力学、地理信息系统、药学等领域的学术研究中都有 Python 的身影；此外，在大厂的数据中台，诸如数据开发、数据分析、数据挖掘等工作，通常也都是用 Python 完成的。 --&gt;&#xA;&lt;!-- 但是，入门 Python 并不容易。因为除了学习使用 Python 写代码，你还要学习关于这门语言自身的知识。例如，Python 有将文件视作模块 (module) 的机制。如果你要具体地理解这件事，你还需要深究 `import` 、 `if __name__ == &#34;__main__&#34;` 和 `__init__.py` 的含义。&#xA;&#xA;Python 语言就像一棵枝叶繁茂的树。如果你找不到枝干，就会被无数琐碎细节淹没，无从入手。《大学》云，知所先后则近道矣，正有其意。我衷心希望本文能成为学习你 Python 的“枝干”和“抓手”。 --&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;相关书籍推荐&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;入门：《Python编程从入门到实践》 [&lt;a href=&#34;https://book.douban.com/subject/26829016/&#34;&gt;豆瓣链接&lt;/a&gt;]&lt;/li&gt;&#xA;&lt;li&gt;初级：《Python学习手册》(英文名 &lt;em&gt;Learning Python&lt;/em&gt;) [&lt;a href=&#34;https://book.douban.com/subject/30364619/&#34;&gt;豆瓣链接&lt;/a&gt;]&lt;/li&gt;&#xA;&lt;li&gt;中级：《流畅的Python》[&lt;a href=&#34;https://book.douban.com/subject/27028517/&#34;&gt;豆瓣链接&lt;/a&gt;]&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;PS: 针对每个阶段，我推荐的是我认为最好的那本书。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;语言基础&#34;&gt;语言基础&lt;/h2&gt;&#xA;&lt;h3 id=&#34;列表&#34;&gt;列表&lt;/h3&gt;&#xA;&lt;p&gt;本文从以下几个方面介绍列表：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;创建&lt;/li&gt;&#xA;&lt;li&gt;获取&lt;/li&gt;&#xA;&lt;li&gt;修改&lt;/li&gt;&#xA;&lt;li&gt;添加&lt;/li&gt;&#xA;&lt;li&gt;插入&lt;/li&gt;&#xA;&lt;li&gt;删除&lt;/li&gt;&#xA;&lt;li&gt;排序&lt;/li&gt;&#xA;&lt;li&gt;逆序&lt;/li&gt;&#xA;&lt;li&gt;索引&lt;/li&gt;&#xA;&lt;li&gt;循环&lt;/li&gt;&#xA;&lt;li&gt;列表推导&lt;/li&gt;&#xA;&lt;li&gt;切片&lt;/li&gt;&#xA;&lt;li&gt;复制&lt;/li&gt;&#xA;&lt;li&gt;去重&lt;/li&gt;&#xA;&lt;li&gt;计数&lt;/li&gt;&#xA;&lt;li&gt;查找&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;center&gt;&#xA;&lt;button class=&#34;demo-btn&#34; onclick=&#34;window_on(&#39;https://nbviewer.jupyter.org/github/luochang212/python-tips/blob/master/list.ipynb&#39;)&#34;&gt;查看示例&lt;/button&gt;&#xA;&lt;/center&gt;&#xA;&lt;h3 id=&#34;字典&#34;&gt;字典&lt;/h3&gt;&#xA;&lt;p&gt;鉴于 JSON 在数据处理中的大量使用，字典的重要性也不言而喻。&lt;/p&gt;</description>
			</item>
			<item>
				<title>PyQt5 侧边栏布局</title>
				<link>https://www.luochang.ink/posts/pyqt5_layout_sidebar/</link>
				<pubDate>Fri, 10 May 2019 21:43:09 +0100</pubDate>
				<guid>https://www.luochang.ink/posts/pyqt5_layout_sidebar/</guid>
				<description>&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/pyqt5-demo&#34; target=&#34;_blank&#34;&gt;pyqt5-demo&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;主流软件如网易云音乐、腾讯电脑管家，都有侧边栏。侧边栏能有效扩展应用空间，使软件功能的层次更加分明。&lt;/p&gt;&#xA;&lt;p&gt;但PyQt5并没有一个专门的方法实现侧边栏。要实现侧边栏，主要有两种技术路线。一是从标签部件(QTabWidget)改造而来，二是用网格布局(QGridLayout)画出来。本文采用第一种技术路线，制作一个简单的侧边栏应用。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; 两种技术路线制作的侧边栏有细微的差别。如果采用第二种技术路线(QGridLayout)，侧边栏和内容页之间没有明显的分界。所以需要额外地在侧边栏和内容页之间加一条线，来突出两者属于不同的组件。而第一种技术路线(QTabWidget)不需要，创建的侧边栏和内容页之间的区别明显。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;下图是一个用第二种技术路线(QGridLayout)制作的应用，可以看到侧边栏和内容页中间画了一条线，以突出两个组件的分界。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/QGridLayout.png&#34; alt=&#34;QGridLayout&#34;&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;步骤分析&#34;&gt;步骤分析&lt;/h3&gt;&#xA;&lt;p&gt;在开始写代码之前，我们先分析一下制作侧边栏需要几个步骤。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;添加部件&lt;/li&gt;&#xA;&lt;li&gt;为部件设置布局&lt;/li&gt;&#xA;&lt;li&gt;将标签部件改造成侧边栏的内容页&lt;/li&gt;&#xA;&lt;li&gt;为侧边栏按钮编写函数，实现内容页之间的跳转&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;添加部件并设置布局&#34;&gt;添加部件并设置布局&lt;/h3&gt;&#xA;&lt;p&gt;此段不详述。关于部件和布局的基础知识，在上一篇中有介绍，详见&lt;a href=&#34;https://www.luochang.ink/posts/pyqt5_layout/&#34;&gt;PyQt5 布局浅析&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;下面这段代码添加了部件且设置了布局。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#24292e&#34;&gt;PyQt5.QtWidgets&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#24292e&#34;&gt;sys&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;Window&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;QMainWindow&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;__init__&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;super&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#6639ba&#34;&gt;__init__&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#57606a&#34;&gt;# set the title of main window&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setWindowTitle&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Sidebar layout - www.luochang.ink&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#57606a&#34;&gt;# set the size of window&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;width &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;800&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;height &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;0.618&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;width&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;resize&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;width&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;height&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#57606a&#34;&gt;# add all widgets&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn_1 &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QPushButton&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;1&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn_2 &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QPushButton&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn_3 &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QPushButton&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;3&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn_4 &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QPushButton&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;4&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;initUI&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;initUI&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_layout &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QVBoxLayout&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;addWidget&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn_1&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;addWidget&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn_2&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;addWidget&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn_3&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;addWidget&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn_4&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;addStretch&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setSpacing&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;20&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_widget &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QWidget&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        left_widget&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setLayout&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;left_layout&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;right_widget &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QTabWidget&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;right_widget&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;tabBar&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setObjectName&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;mainTab&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        main_layout &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QHBoxLayout&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        main_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;addWidget&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;left_widget&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        main_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;addWidget&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;right_widget&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        main_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setStretch&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;40&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        main_layout&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setStretch&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;200&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        main_widget &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QWidget&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        main_widget&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setLayout&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;main_layout&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setCentralWidget&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;main_widget&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;__name__&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    app &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QApplication&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;sys&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;argv&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ex &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; Window&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ex&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;show&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sys&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;exit&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;app&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;exec_&lt;span style=&#34;color:#1f2328&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/sidebar_basic.JPG&#34; alt=&#34;sidebar_basic&#34;&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>PyQt5 布局浅析</title>
				<link>https://www.luochang.ink/posts/pyqt5_layout/</link>
				<pubDate>Fri, 03 May 2019 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/pyqt5_layout/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;PyQt5是Python环境下用来开发UI界面的一个包。它容易上手，对初学者友好，并且拥有丰富的函数库，可以实现大部分桌面应用的开发需求，且支持QSS语言，能够对界面风格做个性化调整。总体来说，PyQt5是一款开发效率极高的UI框架。这篇文章从零开始，教你搭建一个属于自己的桌面应用。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/pyqt5-demo&#34; target=&#34;_blank&#34;&gt;pyqt5-demo&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;创建第一个窗口&#34;&gt;创建第一个窗口&lt;/h3&gt;&#xA;&lt;p&gt;一般来说，桌面应用都以窗口(window)形式呈现。因此，要搭建桌面应用，首先要创建窗口。&lt;/p&gt;&#xA;&lt;p&gt;下面这段代码创建了一个空的窗口。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#24292e&#34;&gt;PyQt5.QtWidgets&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#24292e&#34;&gt;sys&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;Window&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;QMainWindow&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;__init__&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;super&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#6639ba&#34;&gt;__init__&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#57606a&#34;&gt;# set the title of main window&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setWindowTitle&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;My first window - www.luochang.ink&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#57606a&#34;&gt;# set the size of window&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;Width &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;500&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;height &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;0.618&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;Width&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;resize&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;Width&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;height&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;__name__&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    app &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QApplication&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;sys&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;argv&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ex &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; Window&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ex&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;show&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sys&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;exit&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;app&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;exec_&lt;span style=&#34;color:#1f2328&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/blankWindow.png&#34; alt=&#34;blank window&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;这段代码仅仅设置了窗口的标题和大小。下一步，我们要往这个空的窗口里添加部件(widget). 为了规范性，我们在Window类里新建一个函数initUI, 然后在initUI里为窗口添加部件。&lt;/p&gt;&#xA;&lt;h3 id=&#34;为窗口添加部件&#34;&gt;为窗口添加部件&lt;/h3&gt;&#xA;&lt;p&gt;下面这段代码为窗口添加了一个按钮部件(QPushButton).&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#24292e&#34;&gt;PyQt5.QtWidgets&lt;/span&gt; &lt;span style=&#34;color:#cf222e&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#24292e&#34;&gt;sys&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#1f2328&#34;&gt;Window&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;QMainWindow&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;__init__&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6639ba&#34;&gt;super&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#6639ba&#34;&gt;__init__&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#57606a&#34;&gt;# set the title of main window&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;setWindowTitle&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;My first window - www.luochang.ink&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#57606a&#34;&gt;# set the size of window&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;Width &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;500&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;height &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;0.618&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;Width&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;resize&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;Width&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;height&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;initUI&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#cf222e&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#6639ba&#34;&gt;initUI&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#57606a&#34;&gt;# create a new button&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QPushButton&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;first Button&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6a737d&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;btn&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;resize&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;300&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;90&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#953800&#34;&gt;__name__&lt;/span&gt; &lt;span style=&#34;color:#0550ae&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    app &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; QApplication&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;sys&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;argv&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ex &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; Window&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ex&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;show&lt;span style=&#34;color:#1f2328&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sys&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;exit&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;app&lt;span style=&#34;color:#0550ae&#34;&gt;.&lt;/span&gt;exec_&lt;span style=&#34;color:#1f2328&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/firstWidget.png&#34; alt=&#34;first widget&#34;&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>【项目】TSP旅行路线规划</title>
				<link>https://www.luochang.ink/posts/tsp_route/</link>
				<pubDate>Wed, 10 Apr 2019 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/tsp_route/</guid>
				<description>&lt;!--原题：用Jupyter notebook规划旅行路线--&gt;&#xA;&lt;p&gt;GitHub 项目地址：&lt;a href=&#34;https://github.com/luochang212/tsp-route&#34; target=&#34;_blank&#34;&gt;tsp-route&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;对于在欧洲的小伙伴们，复活节假在这一周就正式开始啦。大家都是怎么计划旅行的呢？&lt;/p&gt;&#xA;&lt;p&gt;我的习惯是在出发前最后一晚，花上半小时，搜索目的地景点 (Point of interest, POI), 然后在Google Maps上为它们点上小星星，以免和它们擦肩而过。我的地图经过一番操作，就成了下面这副模样。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/bristol.png&#34; alt=&#34;攒满了小星星&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;此时此刻，望着这些密集的星星，我不禁自问：如何才能走最少的路，遍历所有景点呢?&lt;/p&gt;&#xA;&lt;p&gt;搜索了谷歌和百度，都没找到我要路径规划功能。最接近需求的是谷歌地图的&amp;quot;Add destination&amp;quot;功能。然而这个功能只是依次连接你点选的地点。并不能由一组地点，确定连接它们的一条全局最短路径。&lt;/p&gt;&#xA;&lt;p&gt;没有现成应用怎么办，我打算自己动手写一个。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;下图是Google Add destination功能。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/googlemap.JPG&#34; alt=&#34;Add destination 功能&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;适用模型tsp-模型&#34;&gt;适用模型：TSP 模型&lt;/h3&gt;&#xA;&lt;p&gt;用一句话概括需求就是：我们需要一条从某地方出发，遍历所有地点，最终回到起点的最短路径。&lt;/p&gt;&#xA;&lt;p&gt;这个需求其实就是运筹学的一个经典问题，旅行商问题(TSP)。旅行商问题的确切描述是这样的：一个商人在各个城市之间旅行，要求遍历所有城市并返回到出发点，要如何规划路线，才能使总路径最短。（打开&lt;a href=&#34;https://zh.wikipedia.org/wiki/%E6%97%85%E8%A1%8C%E6%8E%A8%E9%94%80%E5%91%98%E9%97%AE%E9%A2%98&#34; target=&#34;_blank&#34;&gt;维基百科&lt;/a&gt;了解更多)&lt;/p&gt;&#xA;&lt;h3 id=&#34;解决思路&#34;&gt;解决思路&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;用googlemaps包获取纬度和经度信息&lt;/li&gt;&#xA;&lt;li&gt;用OR-Tools包求解TSP问题&lt;/li&gt;&#xA;&lt;li&gt;最后用gmaps可视化结果&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;在敲代码的过程中，最难的地方莫过于看文档查API, 搞清楚输入输出和调用结构。不过敲完这一顿之后我还是不禁感慨，Google 太为开发者着想了。一旦学会调用API，实现一个简单应用的代码量还是很小的 orz&lt;/p&gt;&#xA;&lt;h3 id=&#34;食用指南&#34;&gt;食用指南&lt;/h3&gt;&#xA;&lt;p&gt;项目地址 &amp;ndash;&amp;gt; &lt;a href=&#34;https://github.com/luochang212/tsp-route&#34; target=&#34;_blank&#34;&gt;传送门&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;在运行代码之前，你需要以下配置：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;一个Jupyter Notebook. &lt;!--推荐安装Anaconda3，Anaconda3自带Jupyter Notebook和全套Python依赖.--&gt;&lt;/li&gt;&#xA;&lt;li&gt;你需要安装这些包：googleplaces, googlemaps, gmaps, ortools.&lt;/li&gt;&#xA;&lt;li&gt;你需要一个Google Maps API key, &lt;a href=&#34;https://developers.google.com/maps/documentation/distance-matrix/start#get-a-key&#34; target=&#34;_blank&#34;&gt;从这里获取API&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;完成配置等于成功的一半。在Jupyter notebook打开&lt;code&gt;TSPSolver.ipynb&lt;/code&gt;，将第二个代码块的所有变量，改成自己的，比如自己的目的地自己的区域和自己的API密码……最后从头到尾运行所有代码块，你就可以得到自己的定制路线辣~&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://www.luochang.ink/img/my_route.JPG&#34; alt=&#34;my route&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;配置代码如下。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# input the places of interest (POI)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;places &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;YHA London Central Hostel&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Coca-Cola London Eye&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;St. Paul&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;\&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;s Cathedral&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Leadenhall Market&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;The National Gallery&amp;#39;&lt;/span&gt; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Big Ben&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Buckingham Palace&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;Waterloo Station&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# the region&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Location&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#39;London&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# choose a mode&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Mode &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;walking&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#57606a&#34;&gt;# &amp;#34;driving&amp;#34;, &amp;#34;walking&amp;#34;, &amp;#34;bicycling&amp;#34;, &amp;#34;transit&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# get Google API key from following website: &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;# https://developers.google.com/maps/documentation/distance-matrix/start#get-a-key&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;password &lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0a3069&#34;&gt;&amp;#34;YOUR_GOOGLE_API_KEY_HERE&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&#xA;&lt;center&gt; 欢迎Star, Pull, Pr.&lt;/center&gt;</description>
			</item>
			<item>
				<title>Python 解置换群问题</title>
				<link>https://www.luochang.ink/posts/python_math_problem/</link>
				<pubDate>Sat, 16 Mar 2019 00:00:00 +0000</pubDate>
				<guid>https://www.luochang.ink/posts/python_math_problem/</guid>
				<description>&lt;p&gt;室友问我一个问题，把我难住了。&lt;/p&gt;&#xA;&lt;p&gt;想不出解法，遂写了个程序暴力求解。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;**题目：**A permutation is applied to the string SUPERBGOLDHAT. The same permutation is applied to the output from this operation. The second output is OGTHLEPDSUARB. What was the first output? (Note: as an example, the permutation(1 3 4) applied to WOLF gives FOWL. Write your answer in capital letters inside quotation marks, e.g. &amp;ldquo;BEARDPLUGHOST&amp;rdquo;.)&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;把它译成中文就是：已知将某个置换作用于字符串SUPERBGOLDHAT两次，生成字符串OGTHLEPDSUARB. 求该置换作用于字符串SUPERBGOLDHAT一次时，生成的结果。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; 作用两次的意思就是，当一个置换规则作用于字符串一次时，会生成一个新字符串。将这个规则作用在这个新字符串上，又会生成一个字符串，这个字符串就是两次作用的结果。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;近世代数基础&#34;&gt;近世代数基础&lt;/h3&gt;&#xA;&lt;p&gt;如果你不知道什么是置换的话，可以看一下本节。学过近世代数的同学请自觉跳过这部分ꉂ(ˊᗜˋ*)&lt;/p&gt;&#xA;&lt;p&gt;我们给定一个序列\( a =\{1, 2, 3, 4, 5, 6\}  \) 。然后给定一个作用于该序列的置换：&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
