实用的 Python 编程--讲师说明 作者:戴维·比兹利(David Beazley) 概述 对于如何使用我的课程"实用的 Python 编程"进行教学的问题,本文档提供一些通用的说明和建议,包括课程目标.课程受众.棘手的内容等. 一些人会在一个典型的.为期三天的公司培训中进行教学,本说明就是提供给这些教学人员的.在如何教授自己的课程方面,这些说明可能会给你带来一些启发. 目标受众和一般方法 本课程旨在作为已经有一定的编程经验人员的"Python 入门"课程.这绝…
欢迎光临 大约 25 年前,当我第一次学习 Python 时,发现 Python 竟然可以被高效地应用到各种混乱的工作项目上,我立即被震惊了.15 年前,我自己也将这种乐趣教授给别人.教学的结果就是本课程--一门实用的学习 Python的课程.本课程自 2007 年面世以来,已经被应用到400多个团体的面对面教学中.这些团体中包含了交易员.系统管理员.天文学家.修理工以及上百名使用 Python 帮助火星探测器着陆的火箭科学家.现在,我很高兴能够在知识共享协议下将这份课程共享给大家. GitHu…
目录 | 上一节 (5.1 再谈字典) | 下一节 (6 生成器) 5.2 类和封装 创建类时,通常会尝试将类的内部细节进行封装.本节介绍 Python 编程中有关封装的习惯用法(包括私有变量和私有属性). Public vs Private 虽然类的主要作用之一是封装对象的属性和内部实现细节.但是,类还定义了外界用来操作该对象的公有接口(public interface).实现细节与公有接口之间的区别很重要. 问题 在 Python 中,几乎所有与类和对象有关的东西都是开放(open)的. 可…
目录 | 上一节 (8.2 日志) | 下一节 (9 包) 8.3 调试 调试建议 假设程序崩溃了: bash % python3 blah.py Traceback (most recent call last): File "blah.py", line 13, in ? foo() File "blah.py", line 10, in foo bar() File "blah.py", line 7, in bar spam() File…
目录 | 上一节 (4.1 类) | 下一节 (4.3 特殊方法) 4.2 继承 继承(inheritance)是编写可扩展程序程序的常用手段.本节对继承的思想(idea)进行探讨. 简介 继承用于特殊化现有对象: class Parent: ... class Child(Parent): ... 新类 Child 称为派生类(derived class)或子类(subclass).类 Parent 称为基类(base class)或超类(superclass).在子类名后的括号 () 中指定…
目录 | 上一节 (1.1 Python) | 下一节 (1.3 数字) 1.2 第一个程序 本节讨论有关如何创建一个程序.运行解释器和调试的基础知识. 运行 Python Python 程序始终在解释器中运行. 解释器是一个"基于控制台"的应用程序,通常从命令行 shell 启动. python3 Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04) [GCC 4.2.1 (Apple Inc. build 5666) (do…
目录 | 上一节 (3.2 深入函数) | 下一节 (3.4 模块) 3.3 错误检查 虽然前面已经介绍了异常,但本节补充一些有关错误检查和异常处理的其它细节. 程序是如何运行失败的 Python 不对函数参数类型或值进行检查或者校验.函数可以处理与函数内部语句兼容的任何数据. def add(x, y): return x + y add(3, 4) # 7 add('Hello', 'World') # 'HelloWorld' add('3', '4') # '34' 如果函数中有错误,它…
目录 | 上一节 (3.3 错误检查) | 下一节 (3.5 主模块) 3.4 模块 本节介绍模块的概念以及如何使用跨多个文件的函数. 模块和导入 任何一个 Python 源文件都是一个模块. # foo.py def grok(a): ... def spam(b): ... import 语句加载并执行一个模块. # program.py import foo a = foo.grok(2) b = foo.spam('Hello') ... 命名空间 模块是命名值的集合,有时也称为命名空间…
目录 | 上一节 (3.4 模块) | 下一节 (3.6 设计讨论) 3.5 主模块 本节介绍主程序(主模块)的概念 主函数 在许多编程语言中,存在一个主函数或者主方法的概念. // c / c++ int main(int argc, char *argv[]) { ... } // java class myprog { public static void main(String args[]) { ... } } 这是启动应用程序时执行的第一个函数. Python 主模块 Python…
目录 | 上一节 (3.6 设计讨论) | 下一节 (4.2 继承) 4.1 类 本节介绍 class 语句以及创建新对象的方式. 面向对象编程(OOP) 面向对象编程是一种将代码组织成对象集合的编程技术. 一个对象包括: 数据.属性 行为.方法--应用于对象的函数. 在本课程中,你已经使用了面向对象编程技术. 例如,操作列表. >>> nums = [1, 2, 3] >>> nums.append(4) # Method >>> nums.inse…
目录 | 上一节 (4 类和对象) | 下一节 (6 生成器) 5. Python 对象的内部工作原理 本节介绍 Python 对象的内部工作原理.来自其它语言的程序员通常会发现 Python 的类概念缺乏特性.例如,没有访问控制(access-control)的概念(如:private,protected),self 参数让人感觉很奇怪,并且,坦白地说,使用对象有时候让人感到"一切都是开放的".虽然某种程度上来说也许是这样,但是我们要了解其工作原理,以及一些常见的编程习惯,以便更好的…
目录 | 上一节 (7.5 装饰方法 | 下一节 (8.2 日志) 8.1 测试 多测试,少调试(Testing Rocks, Debugging Sucks) Python 的动态性质使得测试对大多数程序而言至关重要.编译器不会发现你的 bug,发现 bug 的唯一方式是运行代码,并确保尝试了所有的特性. 断言(Assertions) assert 语句用于程序的内部检查.如果表达式不为真,则会触发 AssertionError 异常. assert 语句语法: assert <express…
课程设置与概述 欢迎访问本课程(Practical Python Programming).这个页面包含一些关于课程设置的重要信息. 课程周期和时间要求 该课程最初是作为一个由讲师主导的,持续 3 -4 天的现场培训.要全部完成本课程,您应该最少计划用25-35小时进行学习.大部分的参与者发现,在不浏览题解代码的情况下,学习材料是相当具有挑战性的(见下文) 设置和 Python 安装 您只需要安装 3.6 或者更新版本的 Python 即可.不依赖于任何特定的操作系统,编辑器,IDE,或者其它与…
目录 | 上一节 (1.2 第一个程序) | 下一节 (1.4 字符串) 1.3 数字 本节讨论数学计算. 数字类型 Python 有 4 种类型的数字: 布尔型 整型 浮点型 复数(虚数) 布尔型(bool) 布尔型数字有两个值:True,False. a = True b = False 在数值上,它们被计算成值为 1,0 的数. c = 4 + True # 5 d = False if d == 0: print('d is False') 但是,不要像上面这样写代码,这会很奇怪. 整型…
目录 | 上一节 (1.4 字符串) | 下一节 (1.6 文件) 1.5 列表 本节介绍 Python 原始数据类型列表(list). 列表是一种有序的集合. 创建列表 使用方括号 [] 来定义列表字面量. names = [ 'Elwood', 'Jake', 'Curtis' ] nums = [ 39, 38, 42, 65, 111] 有时候,列表也可以通过其它方法创建.例如:使用字符串的 split() 方法可以将一个字符串拆分为一个列表: >>> line = 'GOOG,…
目录| 上一节(1.5 列表) | 下一节 (1.7 函数) 1.6 文件管理 大多数的程序需要从某处读取输入.本节讨论文件访问. 文件输入和输出 打开一个文件: f = open('foo.txt', 'rt') # Open for reading (text) g = open('bar.txt', 'wt') # Open for writing (text) 读取所有的数据: data = f.read() # Read only up to 'maxbytes' bytes data…
目录 | 上一节 (1.6 文件) | 下一节 (2.0 处理数据) 1.7 函数 随着程序开始变大,我们会想要有条理地组织这些程序.本节简要介绍函数.库模块以及带有异常的错误处理. 自定义函数 对你要重用的代码使用函数.下面是函数的定义方式: def sumcount(n): ''' Returns the sum of the first n integers ''' total = 0 while n > 0: total += n n -= 1 return total 函数调用: a…
目录 | 上一节 (1.7 函数) | 下一节 (2.2 容器) 2.1 数据类型和数据结构 本节以元组和字典为代表介绍数据结构. 原始数据类型 Python 有一些原始数据类型: 整数 浮点数 字符串(文本) 空类型 email_address = None None 常用作可选值或缺失值的占位符.它在条件语句中计算为 False. if email_address: send_email(email_address, msg) 数据结构 实际的程序具有更复杂的数据.例如,关于股票的持有信息:…
目录 | 上一节 (2.1 数据类型) | 下一节 (2.3 格式化) 2.2 容器 本节讨论列表(list),字典(dict)和集合(set). 概述 通常,程序必须处理许多对象. 股票的投资组合 股票价格表 这里有三种主要的选择(译注:数据结构)可以使用: 列表.有序的数据. 字典.无序的数据. 集合.互异且无序的数据. 把列表当作容器 当数据顺序很重要时,请使用列表.记住,列表可以存储任何类型的对象.例如,包含元组的列表: portfolio = [ ('GOOG', 100, 490.1…
目录| 上一节 (2.3 格式化) | 下一节 (2.5 Collections模块) 2.4 序列 序列数据类型 Python 有三种序列数据类型. 字符串:如 'Hello'.字符串是字符序列 列表:如 [1, 4, 5]. 元组:如 ('GOOG', 100, 490.1). 所有的序列都是有序的,由整数进行索引,并且具有长度. a = 'Hello' # String b = [1, 4, 5] # List c = ('GOOG', 100, 490.1) # Tuple # Inde…
目录 | 上一节 (2.2 容器) | 下一节 (2.4 序列) 2.3 格式化 虽然本节稍微有点离题,但是当处理数据时,通常想要生成结构化的输出(如表格).示例: Name Shares Price ---------- ---------- ----------- AA 100 32.20 IBM 50 91.10 CAT 150 83.44 MSFT 200 51.23 GE 95 40.37 MSFT 50 65.10 IBM 100 70.44 字符串格式化 在 Python 3.6+…
目录 | 上一节 (2.4 序列) | 下一节 (2.6 列表推导式) 2.5 collections 模块 collections 模块为数据处理提供了许多有用的对象.本部分简要介绍其中的一些特性. 示例:事物计数 假设要把每只股票的总份额表格化. portfolio = [ ('GOOG', 100, 490.1), ('IBM', 50, 91.1), ('CAT', 150, 83.44), ('IBM', 100, 45.23), ('GOOG', 75, 572.45), ('AA'…
目录 | 上一节 (2.6 列表推导式) | 下一节 (3 从程序组织) 2.7 对象 本节介绍有关 Python 内部对象模型的更多详细信息,并讨论一些与内存管理,拷贝和类型检查有关的问题. 赋值 Python 中的许多操作都与赋值或者存储值有关. a = value # Assignment to a variable s[n] = value # Assignment to a list s.append(value) # Appending to a list d['key'] = va…
目录 | 上一节 (2 处理数据) | 下一节 (4 类和对象) 3. 程序组织 到目前为止,我们已经学习了一些 Python 基础知识并编写了一些简短的脚本.但是,当开始编写更大的程序时,我们会想要有条理地组织这些程序.本节将深入讨论关于函数编写,错误处理以及模块的更多细节.最后,您应该能够编写跨多个文件的,并细分为函数的程序.我们还将提供一些有用的代码模板,以编写更有用的脚本. 3.1 函数和脚本编写 3.2 关于函数的更多细节 3.3 异常处理 3.4 模块 3.5 主模块 3.6 关于拥…
目录 | 上一节 (2.7 对象模型) | 下一节 (3.2 深入函数) 3.1 脚本 在该部分,我们将深入研究编写 Python 脚本的惯例. 什么是脚本? 脚本就是运行和终止一系列语句的程序. # program.py statement1 statement2 statement3 ... 到目前为止,我们主要在编写脚本. 问题 如果你编写一个有用的脚本,它的特性和功能将会增加.你可能想要将其应用于相关的问题.随着时间的推移,它可能会成为一个关键的应用程序.如果你不注意的话,它可能会变成一…
目录 | 上一节 (3.1 脚本) | 下一节 (3.3 错误检查) 3.2 深入函数 尽管函数在早先时候介绍了,但有关函数在更深层次上是如何工作的细节却很少提供.本节旨在填补这些空白,并讨论函数调用约定,作用域规则等问题. 调用函数 考虑以下函数: def read_prices(filename, debug): ... 可以使用位置参数调用该函数: prices = read_prices('prices.csv', True) 或者,可以使用关键字参数调用该函数: prices = re…
目录 | 上一节 (3 程序组织) | 下一节 (5 Python对象的内部工作原理) 4. 类和对象 到目前为止,我们的程序仅使用了内置的 Python 数据类型.本节,我们介绍类(class)和对象(object)的概念.你将学习 class 语句,该语句允许你创建新的对象.我们还将介绍继承(inheritance)的概念,继承通常用于构建可扩展的程序.最后,我们将研究类的一些其它特性,包括特殊方法,动态属性查找以及自定义异常. 4.1 类简介 4.2 继承 4.3 特殊方法 4.4 自定义…
目录 | 上一节 (4.2 继承) | 下一节 (4.4 异常) 4.3 特殊方法 可以通过特殊方法(或者称为"魔术"方法(magic method))自定义 Python 行为的各部分.本节介绍特殊方法的思想.此外,还将讨论动态属性访问和绑定方法. 简介 类可以定义特殊方法.特殊方法对于 Python 解释器而言具有特殊的意义.特殊方法总是以双下划线 __ 开头和结尾,例如 __init__. class Stock(object): def __init__(self): ...…
目录 | 上一节 (4.3 特殊方法) | 下一节 (5 对象模型) 4.4 定义异常 用户可以通过类实现自定义异常: class NetworkError(Exception): pass **异常类始终继承自 Exception ** 它们通常是空类.空类内部使用 pass 表示. 你也可以对异常进行分层: class AuthenticationError(NetworkError): pass class ProtocolError(NetworkError): pass 练习 练习 4…
目录 | 上一节 (4.4 异常) | 下一节 (5.2 封装) 5.1 再谈字典 Python 对象系统主要基于字典实现.本节将对此进行讨论. 字典 字典是命名值(named values)的集合. stock = { 'name' : 'GOOG', 'shares' : 100, 'price' : 490.1 } 虽然字典常用于简单的数据结构,但是字典也用于解释器的关键部分.字典可能是 Python 中最重要的数据类型. 字典和模块 在模块内,字典存储所有的全局变量和函数. # foo.…