<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PythonTutorial - 标签 | 飞污熊小站</title><link>https://xiongneng.me/tags/pythontutorial/</link><description>飞污熊小站</description><generator>Hugo 0.161.1 &amp; FixIt v0.4.6-20260512073637-464c4659</generator><language>zh-CN</language><managingEditor>yidao620@163.com (XiongNeng)</managingEditor><webMaster>yidao620@163.com (XiongNeng)</webMaster><copyright>XiongNeng</copyright><lastBuildDate>Sun, 17 May 2026 13:14:48 +0000</lastBuildDate><atom:link href="https://xiongneng.me/tags/pythontutorial/index.xml" rel="self" type="application/rss+xml"/><item><title>python核心 - web开发</title><link>https://xiongneng.me/posts/python/pycore/web/</link><pubDate>Wed, 30 Dec 2015 22:22:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/web/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;Web应用开发可以说是目前软件开发中最重要的部分。Web开发也经历了好几个阶段：静态Web页面、CGI、ASP/JSP/PHP、MVC。&lt;/p&gt;
&lt;p&gt;目前，Web开发技术仍在快速发展中，异步开发、新的MVVM前端技术层出不穷。&lt;/p&gt;</description></item><item><title>python核心 - 网络编程</title><link>https://xiongneng.me/posts/python/pycore/network/</link><pubDate>Mon, 28 Dec 2015 22:22:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/network/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;自从互联网诞生以来，现在基本上所有的程序都是网络程序。
网络编程对所有开发语言都是一样的，Python也不例外。
用Python进行网络编程，就是在Python程序本身这个进程内，连接别的服务器进程的通信端口进行通信。
本章我们将详细介绍Python网络编程的概念和最主要的两种网络类型的编程。&lt;/p&gt;</description></item><item><title>python核心 - 访问数据库</title><link>https://xiongneng.me/posts/python/pycore/database/</link><pubDate>Thu, 24 Dec 2015 22:22:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/database/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;操作数据库是最常见的任务，这里用MySQL来做演示，也是我们用的最多的一个开源数据库，其他都类似的。&lt;/p&gt;
&lt;p&gt;对于安装MySQL就不做介绍了，安装完后，还需要安装去驱动。因为需要支持Python的MySQL驱动来连接到MySQL服务器。
MySQL的驱动有多种实现，比如纯python实现的pymysql和mysql-connector，或者mysql-python也就是MySQLdb。&lt;/p&gt;</description></item><item><title>python核心 - 单元测试</title><link>https://xiongneng.me/posts/python/pycore/unittest/</link><pubDate>Tue, 22 Dec 2015 22:22:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/unittest/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;单元测试在所有编程语言中都不陌生，对于一个健壮的软件来讲单元测试是很有必要的，
并且&amp;quot;测试驱动开发&amp;quot;（TDD：Test-Driven Development）越来越受欢迎也说明了它的重要性。&lt;/p&gt;</description></item><item><title>python核心 - 异步IO</title><link>https://xiongneng.me/posts/python/pycore/nio/</link><pubDate>Mon, 21 Dec 2015 22:22:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/nio/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;由于CPU的速度远远快于磁盘、网络等IO，我们可选择使用多进程或多线程来并发执行代码。
然而系统不能无限制增加线程，而且切换线程开销也大，一旦线程数量过多，CPU花的时间主要在切换线程上，导致性能下降。&lt;/p&gt;
&lt;p&gt;另外一种解决方案是异步IO，当代码需要执行一个耗时的IO操作时，它只发出IO指令，并不等待IO结果，然后就去执行其他代码了。
一段时间后，当IO返回结果时，再通知CPU进行处理。&lt;/p&gt;</description></item><item><title>python核心 - IO编程</title><link>https://xiongneng.me/posts/python/pycore/io/</link><pubDate>Sun, 20 Dec 2015 22:22:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/io/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;IO在计算机中指Input/Output，也就是输入和输出。由于程序和运行时数据是在内存中驻留，
由CPU这个超快的计算核心来执行，涉及到数据交换的地方，通常是磁盘、网络等，就需要IO接口。&lt;/p&gt;
&lt;p&gt;通常，程序完成IO操作会有Input和Output两个数据流。当然也有只用一个的情况，
比如，从磁盘读取文件到内存，就只有Input操作，反过来，把数据写到磁盘文件里，就只是一个Output操作。&lt;/p&gt;</description></item><item><title>python核心 - 并发编程</title><link>https://xiongneng.me/posts/python/pycore/concurrent/</link><pubDate>Fri, 18 Dec 2015 22:22:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/concurrent/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;现在是多核和并发时代，所以不管什么语言都要支持这个特性。并发是看上去同时执行，并行是在多核上同时执行。&lt;/p&gt;
&lt;p&gt;我们先解释下线程和进程。简单来说，一个任务就是一个进程（Process）。
在一个进程内部，要同时干多件事，就需要同时运行多个进程内的&amp;quot;子任务&amp;quot;，这些子任务就叫线程（Thread）&lt;/p&gt;</description></item><item><title>python核心 - 日期和时间</title><link>https://xiongneng.me/posts/python/pycore/datetime/</link><pubDate>Wed, 16 Dec 2015 22:22:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/datetime/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;日期和时间是我们编程经常需要处理的事情，相比较其他语言，python中的日期和时间处理非常简洁。
datetime是python处理日期和时间的标准库。&lt;/p&gt;
&lt;p&gt;python中有一个datetime模块，里面有个datetime类，这里大家先要弄清楚，很容易搞混。&lt;/p&gt;</description></item><item><title>python核心 - 正则表达式</title><link>https://xiongneng.me/posts/python/pycore/regexp/</link><pubDate>Sat, 12 Dec 2015 22:22:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/regexp/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;字符串是编程时涉及到的最多的一种数据结构，对字符串进行操作的需求几乎无处不在。&lt;/p&gt;
&lt;p&gt;正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则，
凡是符合规则的字符串，我们就认为它&amp;quot;匹配&amp;quot;了，否则，该字符串就是不合法的。&lt;/p&gt;</description></item><item><title>python核心 - 元类</title><link>https://xiongneng.me/posts/python/pycore/metaclass/</link><pubDate>Wed, 09 Dec 2015 22:22:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/metaclass/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;动态语言和静态语言最大的不同，就是函数和类的定义，不是编译时定义的，而是运行时动态创建的。我们在hello.py模块里定义一个Hello的
当Python解释器载入hello模块时，就会依次执行该模块的所有语句，执行结果就是动态创建出一个Hello的class对象。&lt;/p&gt;</description></item><item><title>python核心 - 面向对象编程</title><link>https://xiongneng.me/posts/python/pycore/oop/</link><pubDate>Sun, 06 Dec 2015 22:22:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/oop/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;面向对象编程——Object Oriented Programming，简称OOP，是一种程序设计思想。
OOP把对象作为程序的基本单元，一个对象包含了数据和操作数据的函数。&lt;/p&gt;
&lt;p&gt;面向过程的程序设计把计算机程序视为一系列的命令集合，即一组函数的顺序执行。
为了简化程序设计，面向过程把函数继续切分为子函数，即把大块函数通过切割成小块函数来降低系统的复杂度。&lt;/p&gt;</description></item><item><title>python核心 - 装饰器</title><link>https://xiongneng.me/posts/python/pycore/decorator/</link><pubDate>Thu, 03 Dec 2015 10:06:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/decorator/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;python有着强大的表达式语法和函数特性，其中一个我的最爱便是装饰器。
在设计模式中，装饰器能够在不使用子类的情况下动态的修改函数、方法或类的功能。&lt;/p&gt;
&lt;p&gt;当你需要扩展某个函数的功能却不想直接修改这个函数的时候，装饰器就可以派上用场了。
实现装饰器模式有很多种方法，但是python通过强大的语法支持来让这个变得相当容易。&lt;/p&gt;</description></item><item><title>python核心 - 生成器</title><link>https://xiongneng.me/posts/python/pycore/generator/</link><pubDate>Wed, 02 Dec 2015 22:12:42 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/generator/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;在讲生成器之前，先讲讲python里面常用的几个常见的推导式：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;列表推导式（list comprehension）&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;my_list = [f(x) for x in sequence if cond(x)]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;字典推导式（dictionary comprehension）&lt;/em&gt;&lt;/p&gt;</description></item><item><title>python核心 - 迭代器</title><link>https://xiongneng.me/posts/python/pycore/iterable/</link><pubDate>Tue, 01 Dec 2015 20:02:42 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/iterable/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;迭代(iteration)指的是去获取元素的一种方式，一个接一个。当你显式或隐式的使用循环来遍历某个元素集的时候，那就是迭代。&lt;/p&gt;
&lt;p&gt;在Python里面，可迭代对象(iterable)和迭代器(iterator)有着特殊的含义。&lt;/p&gt;</description></item><item><title>python核心 - 模块和包</title><link>https://xiongneng.me/posts/python/pycore/module/</link><pubDate>Fri, 30 Oct 2015 22:22:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/module/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;模块和包都是用来组织代码用的，在python中一个模块就是一个.py文件，而一个包就是一个包含了&lt;code&gt;__init__.py&lt;/code&gt;的文件夹。
使用模块最大的好处就是提高代码可维护性，我们在编写代码的时候通常会引用内置模块或第三方模块。&lt;/p&gt;</description></item><item><title>python核心 - 打包与发布</title><link>https://xiongneng.me/posts/python/pycore/setuptools/</link><pubDate>Mon, 26 Oct 2015 22:22:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/setuptools/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;当需要将写的程序打包分发出去的时候，就要使用到setuptools工具了，这里我通过一个实际例子来介绍它的使用方法。
之前写过一个rpc模块叫xnrpc：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;github项目地址：&lt;a href="https://github.com/yidao620c/xnrpc" target="_blank" rel="external nofollow noopener noreferrer"&gt;https://github.com/yidao620c/xnrpc&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;pipi模块地址：&lt;a href="https://pypi.python.org/pypi/xnrpc" target="_blank" rel="external nofollow noopener noreferrer"&gt;https://pypi.python.org/pypi/xnrpc&lt;i class="fa-solid fa-external-link-alt fa-xs ms-1 text-secondary" aria-hidden="true"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class="heading-element" id="软件包归档格式"&gt;&lt;span&gt;软件包归档格式&lt;/span&gt;
 &lt;a href="#%e8%bd%af%e4%bb%b6%e5%8c%85%e5%bd%92%e6%a1%a3%e6%a0%bc%e5%bc%8f" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;Python的软件包一开始是没有官方的标准分发格式的。比如Java有jar包或者war包作为分发格式，Python则什么都没有。
后来不同的工具都开始引入一些比较通用的归档格式。比如，setuptools引入了Egg格式。
但是，这些都不是官方支持的，存在元数据和包结构彼此不兼容的问题。因此，为了解决这个问题，
PEP 427定义了新的分发包标准，名为Wheel。目前pip和setuptools工具都支持Wheel格式。
这里我们简单总结一下常用的分发格式：&lt;/p&gt;</description></item><item><title>python核心 - 字符串编码</title><link>https://xiongneng.me/posts/python/pycore/unicode/</link><pubDate>Sat, 24 Oct 2015 10:06:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/unicode/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;字符串也是一种数据类型，但是，字符串比较特殊的是还有一个编码问题。&lt;/p&gt;
&lt;p&gt;Unicode把所有语言都统一到一套编码里，这样就不会再有乱码问题了。Unicode标准也在不断发展，
但最常用的是用两个字节表示一个字符（如果要用到非常偏僻的字符，就需要4个字节）。现代操作系统和大多数编程语言都直接支持Unicode。&lt;/p&gt;</description></item><item><title>python核心 - 函数式编程</title><link>https://xiongneng.me/posts/python/pycore/functional/</link><pubDate>Thu, 22 Oct 2015 10:06:22 +0800</pubDate><author>yidao620@163.com (XiongNeng)</author><guid>https://xiongneng.me/posts/python/pycore/functional/</guid><category domain="https://xiongneng.me/categories/python/">Python</category><description>&lt;p&gt;函数式编程就是一种抽象程度很高的编程范式，纯粹的函数式编程语言编写的函数没有变量(或者说不能给变量重新赋值)，
因此，任意一个函数，只要输入是确定的，输出就是确定的，这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言，
由于函数内部的变量状态不确定，同样的输入，可能得到不同的输出，因此，这种函数是有副作用的。&lt;/p&gt;</description></item></channel></rss>