第7章 用户输入和while循环(结合编写交互式程序)
7.1 函数input()的工作原理
message=input(“清晰易懂的提示”)
暂停程序运行,等待用户输入,返回字符串(可用int()等转换)
*结合while循环可大量填充字典等数据结构
7.2 while循环简介
while 指定条件:
不断运行直至不满足指定条件;需避免死循环
若要求满足多个条件才可继续运行,可定义一个布尔变量(“
标志
”),判断是否处于活动状态
break语句
:直接退出for/while循环
continue语句
:忽略余下代码,返回循环开头,判断是否继续
7.3 使用while循环来处理列表和字典(收集、存储并组织大量输入)
for循环中不应修改列表,while循环可遍历+修改
结合pop()移动列表元素
结合remove()删除所有指定值
结合input()使用用户输入填充字典
第8章 函数
函数
:带名字的代码块,可提高代码效率,更易维护和排除故障,并可在不同程序中重用
8.1 定义函数
定义
:
def 函数名(形参):
调用
:
函数名(实参)
*使用
描述性
函数名,增加可读性
8.2 传递实参
(1)
位置实参
:实参形参顺序相同
(2)
关键字实参
:无需考虑顺序,传递名称-值对,如type=“dog”
形参可指定
默认值
,优先级低于显式提供的实参;有默认值的形参需放在最后列出
默认值设置为空字符串时,可将该参数视为
可选值
,从而让函数简化处理不同情形
提供的实参个数或类型不符合要求时,会
引发错误
8.3 返回值return(简化主程序)
可返回任何类型的值,包括列表和字典
8.4 传递列表
永久性修改,高效处理大量数据;传递[:]副本可禁止修改,但会降低效率,慎用
*每个函数只应负责一项具体工作,有助于将复杂任务划分为一系列步骤
8.5 传递任意数量的实参
*形参名:创建一个空元组,接收任意数量实参值
**形参名:创建一个空字典,接收任意数量实参键-值对
两者均需放在最后,封装余下的实参
8.6 将函数存储在模块(独立文件)中
导入
整个模块
(句点表示法调用):
import 模块名 (as 别名)
导入
特定函数
(直接调用):
from 模块名 import 函数名 (as 别名)
导入模块中所有函数(
不推荐
):
from 模块名 import *
8.7 函数编写指南
描述性名称;只用小写字母和下划线;编写文档字符串;默认值和关键字的=两边无需空格
代码顺序:(程序注释+)import语句+主体代码
第9章 类
面向
对象
编程:编写类,定义通用行为,再基于类创建对象(实例化)
9.1 创建和使用类
# 类名称首字母大写
# 实例名首字母小写
class Dog():
'''类的说明'''
# 方法:类中的函数
# 属性:类中以self为前缀的变量
# __init__特殊方法,实例化时自动运行;__默认方法前后均有两个下划线__
# self是指向实例本身的引用,自动传递,让实例访问类中的属性和方法(句点表示法)
def __init__(self, name):
self.name = name
def other_method(self):
# 创建实例
my_dog = Dog(“a”)
# 访问属性,无括号
my_dog.name
# 调用方法,有括号
my_dog.other_method()
9.2 使用类和实例
属性
必须指定
初始值
(0或空值也可,和变量一个道理):
(1)实例化时传递实参赋值,__init __()括号里需包含相应形参
(2)在类的内部指定默认值,__init __()括号里无需包含相应形参,直接self.attr=value即可
修改
属性的值:直接访问修改;编写更新属性的方法修改
9.3 继承
子类=父类(超类)+新的属性和方法
,与父类同文件且父类在先
class 父类名():
class 其他类():
class 子类名(父类名):
def __init__(self,形参):
# super()将父类与子类关联起来
super().__init__(形参)
self.新属性=初始值
# 将实例用作属性,便于将大类拆分为多个协同工作的小类
self.other_attri=其他类()
def 新方法(self):
# 重写方法
def 父类同名方法(self):
*类可以模拟实物,建模方法无对错之分,只有效率高低之分
9.4 导入类(存储在模块中,与导入函数类似):
导入
整个模块
(句点表示法调用):
import 模块名 (as 别名)
导入
特定类
(直接调用):
from 模块名 import 类名1(,类名2,……)
导入模块中所有类(
不推荐
):
from 模块名 import *
9.5 Python标准库:一组模块
如:
collections.OrderedDict:记录键-值对添加顺序(使用OrderedDict()调用,而非花括号)
random模块:生成随机数
math数学模块
9.6 类编码风格
类名
:OrderedDict(驼峰命名法)
实例名/模块名
:ordered_dict
函数、类、模块均需
文档字符串
先import
标准库
模块,再空行+
自定义
模块
第10章 文件和异常
10.1 从文件中读取数据(返回字符串)
# 使用任何文件前均需打开
# 使用with可在无需访问后自动关闭文件,比手动open()+close()方便
# open()返回的对象仅在with代码块内可用
# filename=当前目录下的文件名/相对or绝对文件路径(Windows系统需使用r+反斜杠\)
# 当字符串较长或较复杂时,往往先将其存储在一个变量中,再将变量传递给函数
with open(filename) as f:
data = f.read().rstrip() # read()返回包含全部内容的字符串,且末尾有空行
for line in f: # for循环逐行读取
lines = f.readlines() # 逐行读取并存入列表
10.2 写入文件(字符串格式)
# mode包括:r读取,w写入,a附加,r+读写,省略=默认只读
with open(filename, mode) as f:
f.write(data) # 需手动添加换行符\n等设置格式
10.3 异常(一种管理错误的特殊的类)
使用
try-except(-else)代码块
处理
try:
# 可能引发异常的代码
except 异常名:
# 处理异常的代码
# 或直接pass(什么也不做;或充当占位符,留待之后编写)
else:
# try没问题后才能执行的代码
异常
:ZeroDivisionError、FileNotFoundError等等
优点
:使程序免于崩溃,能够继续运行,更健壮;控制与用户分享错误信息的程度
10.4 存储数据(json模块)
JSON
(JavaScript Object Notation),在编程语言间通用
存储
:json.dump(data,f_obj)
读取
:json.load(f_obj)
*
重构
:将代码划分为一系列完成具体工作的函数,简化代码结构,使代码更清晰易懂、易维护扩展
第11章 测试代码(unittest模块)
11.1 测试函数
单元测试
:核实函数某一个方面没问题
测试用例
:一组单元测试,核实函数各种情形下没问题;全覆盖很难,一般针对
重要行为
编写测试即可
import unittest
from 模块名 import 需测试的函数名
class 最好与测试函数相关且包含Test的类名(unittest.TestCase):
# 必须test_开头,方法才将自动调用;长没事,描述清楚即可
def test_测试内容(self):
a = 需测试的函数()
# 断言方法之一
self.assertEqual(实际值a,期望值b)
# 运行测试
unittest.main()
输出结果
:
(1)句点/E/F=通过一个测试/测试引发错误/测试导致断言失败
(2)OK(FAILED)=(未)通过所有测试
11.2 测试类
测试类与测试函数类似,测试的是类中方法的行为
6种断言方法
:
assertEqual(a,b)、assertNotEqual(a,b)
assertTrue(x)、assertFalse(x)
assertIn(item,list)、assertNotIn(item,list)
测试类需要在每个测试方法中创建实例;使用setUp()可只创建一次,并在所有方法中使用;Python先运行setUp(),再运行test_打头方法
def setUp(self):
# 可一次性创建一系列实例并设置属性
self.实例名=类()
self.属性名=value