Python编程:从入门到实践
- ==Appendix 1.代码规范==
- 1.1函数编写规范
- 函数名使用小写字母和单词之间下划线。应给函数指定描述性名称。模块命名也是
- 每个函数应有简要的DocStrings注释
- 给形参指定默认值时,等号两边不要有空格,对于函数调用中的关键字实参,也应遵循这种约定:
- 在左括号后换行,是函数形参过长的处理办法。
- 每行代码长度不要超过这根竖线
- 1.2 类编写规范
- 类的名称每个单词首字母大写且不使用下划线,实例名和模块名都采用小写格式,并在单词之间加上下划线。
- 可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。
- 需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import 语句,再添加一个空行,然后编写导入你自己编写的模块的import 语句。
- 1.3 测试类、测试函数编写规范
- 类名包含字样Test
- 方法名必须以test_打头,这样它才会在我们运行test_name_function.py时自动运行。
- 1.4 通过空行,划分程序
- 1.5 输入输出
- message=input("please input your name: ")冒号后要有个空格
- 打印的内容太长,如何拆分
- Chapter 2 变量
- 2.3字符串
- ‘.....’,"......",#字符串,单引号,双引号都可以。
- str(18) #把数字转化为字符串
- int('18') #把字符串转化为整数
- float(18),float('3.14') #把整形转化为浮点数,把字符串转换为浮点数
- name.title() #每个单词首字母改为大写
- name.upper() #全部大写
- name.lower() #全部小写
- 删除空白,都是暂时性删除,若要永久删除字符串中的空白,需要将删除操作的结果存回变量中
- favorite_language.strip() #暂时性剔除字符串两端的空白
- favorite_language.lstrip() #剔除字符串开头的空白
- favorite_language.rstrip() #剔除字符串末尾的空白
- message=message.replace('dog','cat') #替换指定单词,一次性全部替换
- message.split() #以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中。
- 字符串拼接新方式 很常用,材料中的源码字符串拼接用的都是这个
- f"{str1}中间想加什么都可以{str2} {str3}" #字符串拼接
- Chapter 3 列表 [ ....]
- 3.1列表的增、删、查、改
- bicycles=['trek','cannondale','redline','specialized'] #初始化列表
- print(bicycles[0]) #访问列表
- print(bicycles[-1]) #访问列表倒数第一个元素
- motorcycles[0]='ducati' #修改列表元素
- motorcycles.append('ducati') #在列表末尾添加元素
- motorcycles.insert(0,'ducati') #在列表任意位置插入元素
- del motorcycles[0] #del语句删除指定位置元素
- x=motorcycles.pop() #列表元素出栈
- x=motorcycles.pop(2) #弹出指定位置元素
- motorcycles.remove('ducati') #根据值删除元素
- remove()只能删除第一个指定的值,多次出现用循环。
- 3.3列表排序,逆序,长度,某个元素出现的个数
- list.count(obj) #统计某个元素在列表中出现的次数。
- cars.sort() #永久排序,字母顺序排序
- cars.sort(reverse=True) #永久排序,字母相反顺序排序
- sorted(cars,reverse=True) #临时性排序
- cars.reverse() #倒着打印列表
- len(cars)
- Chapter4 操作列表
- 4.1 遍历整个列表
- for magician in magicians: #遍历magicians列表中的元素
- 常见错误:遗漏冒号,多余的缩进
- 4.3 创建数值列表
- for value in range(1,5): #1,2,3,4
- range(10) #[0,9)
- 4.3.2 使用range()创建数字列表
- numbers=list(range(1,6)) #创建列表 numbers=[1,2,3,4,5]
- y_values=[x**2 for x in x_valuse] #自动计算数据,快速生成列表
- 4.3.3 对数字列表执行简单的统计计算
- min(digits),max(digits),sum(digits)#最小,最大,求和
- squares=[value**2 for value in range(1,11)] #列表解析
- 4.4 切片,使用列表的一部分
- print(players[0:3]) #打印切片(子列表) 0,1,2元素
- players[:4],players[2:],players[-3:]
- for player in players[:3]: #遍历切片
- 4.4.3 复制列表
- friend_foods=my_foods[:] 正确, friend_foods=my_foods 错误;
- ==4.5 元组(.....) #不可变的列表被称为元组==
- dimensions=(200,50)#一个矩阵的长和宽我们不希望它改变,所以将长和宽存放在一个元组当中
- print(dimesions[0]) #访问元组
- for dimension in dimensions: #遍历元组中的所有值:
- 虽然不能修改元组的元素,但可以给存储元组的变量重新赋值
- Chapter 5 if语句
- if x>3 and x<6 ;if x>3 or x<1
- if 'bmw' in cars #检查特定值是否包含在列表中
- if 'bmw' not in cars #检查特定值是否不包含在列表中
- 5.3.3 if-elif-else结构,注意不要遗漏了冒号
- 5.4.2 if cars: #确定列表不是空的
- 5.4.3 使用多个列表,通过for循环和if-elif-else的结合
- Chapter 6 字典
- ==alien_0={'color': 'green', 'points': 5} #{......}存放一系列的键-值对==
- alien_0['x_position']=0 #添加键-值对
- alien_0['color']='yellow' #修改字典中的值
- del alien_0['points'] #删除键-值对
- 由类似对象组成的字典
- ==遍历字典==
- ==for key,value in user_0.items(): #遍历字典,不要遗漏了.items()==
- ==注意,即便遍历字典时,键—值对的返回顺序也与存储顺序不同。Python不关心键—值对的存储顺序,而只跟踪键和值之间的关联关系。若要跟踪顺序可以使用python标准库中模块collections 中的OrderedDict==
- ==for name in favorite_languages.keys(): #遍历字典中的所有键==
- for language in favorite_languages.values(): #遍历字典中所有值
- ==for language in set (favorite_languages.values()): #剔除重复项==
- for name in sorted(favorite_languages.keys()): #按顺序遍历字典中的所有键
- 6.4 ==嵌套 包含前面列表和字典以及二者的遍历==
- 6.4.1 字典列表
- 6.4.2 在字典中存储列表
- ==每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。==
- Chapter 7 用户输入和while循环
- message=input("Please enter your ID:")
- ==intput()读入的都是字符串,若想获取数值输入需要用int()==
- 7.2 while i <=5: #i=1提前赋值 while循环
- 让用户选择何时退出
- while active: #使用标志,active=True提前定义好。
- 使用break 退出循环
- 在循环中使用continue
- 7.3 使用while循环来处理列表和字典
- ==for 循环中不应修改列表,要在遍历列表的同时对其进行修改,可使用while 循环。==
- while unconfirmed_users: #while列表非空,使用while处理列表。
- while 'cat' in pets: #remove结合while删除包含特定值的所有列表元素
- 使用用户输入来填充字典
- Chapter 8 函数
- def greet_user(username): #定义一个函数,并能向函数传递信息
- 8.1 传递实参
- describe_pet('dog','xiaohei') #位置实参,实参传入时必须按位置顺序传入
- describe_pet(pet_name='xiaohei',animal_type='dog') #关键字实参,无需考虑实参顺序,但需要给出形参名。
- def describe_pet(pet_name,animal_type='dog'): #默认值
- ==在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。==
- 8.3 返回值
- return full_name.title() #返回简单值
- 返回一个字典,同理可以返回一个列表
- 传递一个列表
- ==print_models(unprinted_designs[:])#禁止函数修改列表,切片表示法[:]创建列表的副本==
- ==def make_pizza(*toppings): #传递任意数量的实参。toppings是一个元组,星号让python创建了一个名为topings的空元组。==
- def make_pizza(size,*toppings):#结合使用位置实参和任意数量实参
- ==def build_profile(first,last,**user_info): #使用任意数量的关键字实参,user_info是一个空字典==
- ==8.6 将函数存储在模块中 #模块是.py文件==
- import pizza #导入整个模块,pizza.make_pizza(16,'cheese'),调用pizza.py文件中的make_pizza函数
- pizza.make_pizza(16,'cheese') #导入整个模块后所使用的的句点表示法
- from module_name import function_name #导入特定的函数
- import numpy as np #使用as给模块指定别名
- from pizza import make_pizza as mp #使用as给函数指定别名
- from pizza import * #导入模块中的所有函数,不建议这样用,最好是导入整个模块并使用句点表示法,让代码更容易阅读。
- Chapter 9 类
- 9.1 创建和使用类
- 9.1.1创建Dog类#类名首字母大写
- ==def \_\_init\_\_(self,name,age)方法==
- my_dog=Dog('xiaohei',6)#创建实例
- my_dog.name, my_dog.sit() #访问属性,调用方法
- self.age=18 #给属性指定默认值
- 修改属性的值
- xiaohei.age=10 #直接通过实例进行修改
- 通过方法修改属性的值
- 通过方法对属性的值进行递增
- ==9.3 Class ElectrictCar(Car): #继承==
- super().\_\_init\_\_(make,model,year) #子类的init方法下面需要用super().init方法将父类和子类关联起来
- 给子类定义属性和方法
- 子类中的方法与父类中的方法同名可实现重写父类方法
- ==将实例用作属性==
- 9.4 导入类
- from car import Car #导入单个类
- from car import Car, ElectricCar #从一个模块中导入多个类
- import car #导入整个模块,使用句点表示法访问需要的类
- Python标准库
- ==Chapter 10 文件和异常==
- 10.1 从文件中读取数据
- with open('pi_digit.txt') as file_object: #打开文件,关键字with在不再需要访问文件后将其关闭
- 10.1.1读取整个文件
- contents=file_object.read() #读取整个文件
- contents.rstrip() #Chapter 2有更详细的内容
- with open('./test/pi_digits.txt') as file_object: 使用相对路径查找打开文件,'.'不能少,代表相对路径,没有'.’则是绝对路径
- 10.1.3 逐行读取
- for line in file_object:
- lines=file_object.readlines() #创建一个包含文件各行内容的列表
- 10.2 写入文件
- with open(filename,'w') as file_object: #文件不存在则创建,存在则先清空内容
- 写入空文件
- file_object.write("I love qiqi")
- 写入多行
- 附加到文件
- with open(filename,'a') as file_object #文件不存在则创建,存在的话,写入到文件的行都将添加到文件末尾
- 10.3 异常
- 使用异常避免崩溃或被黑客攻击
- try:-except 异常:异常处理-else 结构
- 失败时一声不吭
- pass #可在代码块中使用它来让Python什么都不要做
- 10.4 存储数据
- json.dump(numbers,file_object) #将数列numbers放入.json文件中
- 10.4.3 重构
- Chapter 11 单元测试和测试用例
- 11.1 测试函数:用于测试函数的
- 可通过的测试
- 不能通过的测试
- 测试未通过怎么办?:应该修改被测试的函数,而不是修改测试
- 11.2 测试类:用于测试类的
Appendix 1.代码规范
1.1函数编写规范
函数名使用小写字母和单词之间下划线。应给函数指定描述性名称。模块命名也是
每个函数应有简要的DocStrings注释
每个函数都应包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。
DocStrings 文档字符串
![Python编程:从入门到实践_第1张图片](http://img.e-com-net.com/image/info8/e529b8a9c20848f58aff836ee216d64d.jpg)
给形参指定默认值时,等号两边不要有空格,对于函数调用中的关键字实参,也应遵循这种约定:
![Python编程:从入门到实践_第2张图片](http://img.e-com-net.com/image/info8/770ac2cc33c94e5186496ae6d8b8d61d.jpg)
在左括号后换行,是函数形参过长的处理办法。
![Python编程:从入门到实践_第3张图片](http://img.e-com-net.com/image/info8/e6bb291f4c4c4a529cb66d9c9bd253b5.jpg)
每行代码长度不要超过这根竖线
![Python编程:从入门到实践_第4张图片](http://img.e-com-net.com/image/info8/7821d20a3880490a8d9167cdc7c910ee.jpg)
1.2 类编写规范
类的名称每个单词首字母大写且不使用下划线,实例名和模块名都采用小写格式,并在单词之间加上下划线。
每个类紧跟定义后包含一个文档字符串描述类的功能
可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。
需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import 语句,再添加一个空行,然后编写导入你自己编写的模块的import 语句。
![Python编程:从入门到实践_第5张图片](http://img.e-com-net.com/image/info8/879c227e5c214041a1f5227d0b43441b.jpg)
1.3 测试类、测试函数编写规范
单元测试 是测试函数某一方面是否有问题
测试用例 是一组单元测试
全覆盖式测试 是一整套单元测试
类名包含字样Test
方法名必须以test_打头,这样它才会在我们运行test_name_function.py时自动运行。
![Python编程:从入门到实践_第6张图片](http://img.e-com-net.com/image/info8/5ad48e68716d4ca8b6bf255b623121dc.jpg)
1.4 通过空行,划分程序
要将程序的不同部分分开,可使用空行。你应该使用空行来组织程序文件,但也不能滥用;例如,如果你有5行创建列表
的代码,还有3行处理该列表的代码,那么用一个空行将这两部分隔开是合适的。然而,你不应使用三四个空行将它们隔开。
空行不会影响代码的运行,但会影响代码的可读性。
1.5 输入输出
message=input("please input your name: ")冒号后要有个空格
打印的内容太长,如何拆分
![Python编程:从入门到实践_第7张图片](http://img.e-com-net.com/image/info8/cf4ebdbddfe2462494c8a2c13f723bcd.jpg)
Chapter 2 变量
注意 就目前而言,应使用小写的Python变量名。在变量名中使用大写字母虽然不会导致错误,但避免使用大写字母是个不错的主意。
![Python编程:从入门到实践_第8张图片](http://img.e-com-net.com/image/info8/91bb1305df654805a6b5f4d5d0b80c2d.jpg)
![Python编程:从入门到实践_第9张图片](http://img.e-com-net.com/image/info8/48ba2caf1770438ca6877a9448ba23e6.jpg)
![Python编程:从入门到实践_第10张图片](http://img.e-com-net.com/image/info8/07abae6cc1784725bb24d0dc0d59234a.jpg)
2.3字符串
‘…’,"…",#字符串,单引号,双引号都可以。
str(18) #把数字转化为字符串
int(‘18’) #把字符串转化为整数
float(18),float(‘3.14’) #把整形转化为浮点数,把字符串转换为浮点数
name.title() #每个单词首字母改为大写
name.upper() #全部大写
name.lower() #全部小写
![Python编程:从入门到实践_第11张图片](http://img.e-com-net.com/image/info8/8fe6b8c6237644a2b65daf0a97aaba75.jpg)
删除空白,都是暂时性删除,若要永久删除字符串中的空白,需要将删除操作的结果存回变量中
favorite_language.strip() #暂时性剔除字符串两端的空白
favorite_language.lstrip() #剔除字符串开头的空白
favorite_language.rstrip() #剔除字符串末尾的空白
![在这里插入图片描述](http://img.e-com-net.com/image/info8/88f6337e4ac646b4962c22dd54381a8e.jpg)
![Python编程:从入门到实践_第12张图片](http://img.e-com-net.com/image/info8/5dc8ee9cd8804dcf80db744bc5af7bcb.jpg)
message=message.replace(‘dog’,‘cat’) #替换指定单词,一次性全部替换
![Python编程:从入门到实践_第13张图片](http://img.e-com-net.com/image/info8/3046aa00ddb44a1187736c76371840ac.jpg)
message.split() #以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中。
![Python编程:从入门到实践_第14张图片](http://img.e-com-net.com/image/info8/11b29b5e1f044701884c2dc27f661148.jpg)
字符串拼接新方式 很常用,材料中的源码字符串拼接用的都是这个
f"{str1}中间想加什么都可以{str2} {str3}" #字符串拼接
![Python编程:从入门到实践_第15张图片](http://img.e-com-net.com/image/info8/039fe226ff8945b09a8d70c57707e211.jpg)
Chapter 3 列表 [ …]
3.1列表的增、删、查、改
bicycles=[‘trek’,‘cannondale’,‘redline’,‘specialized’] #初始化列表
print(bicycles[0]) #访问列表
print(bicycles[-1]) #访问列表倒数第一个元素
![Python编程:从入门到实践_第16张图片](http://img.e-com-net.com/image/info8/499eb66035834a05a2ba3542ed14823d.jpg)
motorcycles[0]=‘ducati’ #修改列表元素
![Python编程:从入门到实践_第17张图片](http://img.e-com-net.com/image/info8/f3107636714f430f8a2380d3425ac5ca.jpg)
motorcycles.append(‘ducati’) #在列表末尾添加元素
![Python编程:从入门到实践_第18张图片](http://img.e-com-net.com/image/info8/05af2072608e41ffa381b79e6e2abcd3.jpg)
motorcycles.insert(0,‘ducati’) #在列表任意位置插入元素
![Python编程:从入门到实践_第19张图片](http://img.e-com-net.com/image/info8/dbb6d3997ce941f2a4040651123c59ee.jpg)
del motorcycles[0] #del语句删除指定位置元素
![Python编程:从入门到实践_第20张图片](http://img.e-com-net.com/image/info8/6e6dd49adf2b4e5893be979a06c80004.jpg)
x=motorcycles.pop() #列表元素出栈
![Python编程:从入门到实践_第21张图片](http://img.e-com-net.com/image/info8/f9e32e2ad41649f59dd99b905c81dbe6.jpg)
x=motorcycles.pop(2) #弹出指定位置元素
![Python编程:从入门到实践_第22张图片](http://img.e-com-net.com/image/info8/dcc1c9c31b6f46e3a18c6b8f9cd66ef6.jpg)
motorcycles.remove(‘ducati’) #根据值删除元素
![Python编程:从入门到实践_第23张图片](http://img.e-com-net.com/image/info8/3b9f3f0e352d4689890c79c4afc3888c.jpg)
remove()只能删除第一个指定的值,多次出现用循环。
![在这里插入图片描述](http://img.e-com-net.com/image/info8/51b3bb5e0c1f4f91a7315a704d6da312.jpg)
3.3列表排序,逆序,长度,某个元素出现的个数
cars=[‘bmw’,‘audi’,‘toyota’,‘subaru’]
list.count(obj) #统计某个元素在列表中出现的次数。
cars.sort() #永久排序,字母顺序排序
cars.sort(reverse=True) #永久排序,字母相反顺序排序
![Python编程:从入门到实践_第24张图片](http://img.e-com-net.com/image/info8/7af8ac161f454c258aa8e13ad27130a7.jpg)
sorted(cars,reverse=True) #临时性排序
![Python编程:从入门到实践_第25张图片](http://img.e-com-net.com/image/info8/b0029ead01b948d4a09eba494cd88fed.jpg)
cars.reverse() #倒着打印列表
![Python编程:从入门到实践_第26张图片](http://img.e-com-net.com/image/info8/9ef275011d37465a8071ed2992328949.jpg)
len(cars)
![Python编程:从入门到实践_第27张图片](http://img.e-com-net.com/image/info8/3957b44ecce7495a83e28581525f7c97.jpg)
Chapter4 操作列表
4.1 遍历整个列表
magicians=[‘alice’,‘david’,‘carolina’]
for magician in magicians: #遍历magicians列表中的元素
![Python编程:从入门到实践_第28张图片](http://img.e-com-net.com/image/info8/aba50adbf1d64cee8779ed5fe5c76b6c.jpg)
![Python编程:从入门到实践_第29张图片](http://img.e-com-net.com/image/info8/c8051a31fba34339ab438341b3978e80.jpg)
常见错误:遗漏冒号,多余的缩进
4.3 创建数值列表
for value in range(1,5): #1,2,3,4
range(10) #[0,9)
![Python编程:从入门到实践_第30张图片](http://img.e-com-net.com/image/info8/81895d98467c4080b77f7ea6283f391c.jpg)
![Python编程:从入门到实践_第31张图片](http://img.e-com-net.com/image/info8/8b194bd846004e92aa4b47847a23c719.jpg)
4.3.2 使用range()创建数字列表
numbers=list(range(1,6)) #创建列表 numbers=[1,2,3,4,5]
![Python编程:从入门到实践_第32张图片](http://img.e-com-net.com/image/info8/56296c4091fd4008ac779cdbad1ca126.jpg)
x_values=list(range(1,1001))
y_values=[x**2 for x in x_valuse] #自动计算数据,快速生成列表
![Python编程:从入门到实践_第33张图片](http://img.e-com-net.com/image/info8/3231c33833b149faa9829ee7d3989d69.jpg)
4.3.3 对数字列表执行简单的统计计算
digits=list(range(0,10))
min(digits),max(digits),sum(digits)#最小,最大,求和
![Python编程:从入门到实践_第34张图片](http://img.e-com-net.com/image/info8/14d59148207d40619761a51e17c0796e.jpg)
squares=[value**2 for value in range(1,11)] #列表解析
![在这里插入图片描述](http://img.e-com-net.com/image/info8/9c00cfa0749144018a5c86e13e4ba2d5.jpg)
4.4 切片,使用列表的一部分
players=[‘charles’,‘matina’,‘michael’,‘florence’,‘eli’]
print(players[0:3]) #打印切片(子列表) 0,1,2元素
![Python编程:从入门到实践_第35张图片](http://img.e-com-net.com/image/info8/5bccb77cbe214ba49da776580e2c18e3.jpg)
players[:4],players[2:],players[-3:]
![Python编程:从入门到实践_第36张图片](http://img.e-com-net.com/image/info8/cbf3b096950a49d5bb82dc8787a8e4a6.jpg)
![Python编程:从入门到实践_第37张图片](http://img.e-com-net.com/image/info8/5af81e04c3dc45c39473fc21151476cb.jpg)
for player in players[:3]: #遍历切片
![Python编程:从入门到实践_第38张图片](http://img.e-com-net.com/image/info8/53e8f3f5d48040a09a3fe25f0e1c0052.jpg)
4.4.3 复制列表
my_foods=[‘pizza’,‘falafel’,‘carrot cake’]
friend_foods=my_foods[:] 正确, friend_foods=my_foods 错误;
![Python编程:从入门到实践_第39张图片](http://img.e-com-net.com/image/info8/b901191c18e349f590d25ed53a5e8abf.jpg)
![Python编程:从入门到实践_第40张图片](http://img.e-com-net.com/image/info8/179dd540559142318b368b44460d8c84.jpg)
4.5 元组(…) #不可变的列表被称为元组
列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,这对处理网站的用户列表或游戏中的角色列表至关重要。然而,有时候你需要创建一系列不可修改的元素,元组可以满足这种需求。Python将不能修改的值称为不可变的 ,而不可变的列表被称为元组 。
dimensions=(200,50)#一个矩阵的长和宽我们不希望它改变,所以将长和宽存放在一个元组当中
print(dimesions[0]) #访问元组
![Python编程:从入门到实践_第41张图片](http://img.e-com-net.com/image/info8/07a0764b8c4a4061b268c4d7c0c3f86a.jpg)
for dimension in dimensions: #遍历元组中的所有值:
![Python编程:从入门到实践_第42张图片](http://img.e-com-net.com/image/info8/32772505773d475eb49cfeb23c1b354b.jpg)
虽然不能修改元组的元素,但可以给存储元组的变量重新赋值
![Python编程:从入门到实践_第43张图片](http://img.e-com-net.com/image/info8/3b62144d852a45e5abcaf8ed75cc4c75.jpg)
Chapter 5 if语句
![Python编程:从入门到实践_第44张图片](http://img.e-com-net.com/image/info8/a09f643f23354b40824d61d6a243f4f8.jpg)
if x>3 and x<6 ;if x>3 or x<1
![Python编程:从入门到实践_第45张图片](http://img.e-com-net.com/image/info8/23deee5a18204b86b08a796173e6fbed.jpg)
if ‘bmw’ in cars #检查特定值是否包含在列表中
![Python编程:从入门到实践_第46张图片](http://img.e-com-net.com/image/info8/db2fe4773660461381298d9dbbd1bd79.jpg)
if ‘bmw’ not in cars #检查特定值是否不包含在列表中
![Python编程:从入门到实践_第47张图片](http://img.e-com-net.com/image/info8/97c1a8329e294beea8dcc6d7c9000614.jpg)
5.3.3 if-elif-else结构,注意不要遗漏了冒号
![Python编程:从入门到实践_第48张图片](http://img.e-com-net.com/image/info8/044ee5d41957406f846d9e878311cf8c.jpg)
5.4.2 if cars: #确定列表不是空的
![Python编程:从入门到实践_第49张图片](http://img.e-com-net.com/image/info8/d05f6a4fefc34cc2a21dd7fd8bcfd970.jpg)
5.4.3 使用多个列表,通过for循环和if-elif-else的结合
![Python编程:从入门到实践_第50张图片](http://img.e-com-net.com/image/info8/699da76d15cb48279911d55e67853e98.jpg)
Chapter 6 字典
alien_0={‘color’: ‘green’, ‘points’: 5} #{…}存放一系列的键-值对
在Python中,字典 是一系列键—值对 。每个键 都与一个值相关联,你可以使用键来访问与之相关联的值。与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可将任何Python对象用作字典中的值。
![Python编程:从入门到实践_第51张图片](http://img.e-com-net.com/image/info8/847d8d9f5a8b444d8c020ba3edaf56c7.jpg)
alien_0[‘x_position’]=0 #添加键-值对
![Python编程:从入门到实践_第52张图片](http://img.e-com-net.com/image/info8/da58cb9eed8a4782a59cdc28371a5b46.jpg)
![Python编程:从入门到实践_第53张图片](http://img.e-com-net.com/image/info8/49b419a259a6431ca2b383ee57881c0b.jpg)
alien_0[‘color’]=‘yellow’ #修改字典中的值
![Python编程:从入门到实践_第54张图片](http://img.e-com-net.com/image/info8/3dec5a70a9034cd1b8e235254e9a49da.jpg)
del alien_0[‘points’] #删除键-值对
![Python编程:从入门到实践_第55张图片](http://img.e-com-net.com/image/info8/9a49259a33684a7c9337bcc4b924b466.jpg)
由类似对象组成的字典
![Python编程:从入门到实践_第56张图片](http://img.e-com-net.com/image/info8/803fa2cc400c4f218af4b8c71a36df95.jpg)
遍历字典
for key,value in user_0.items(): #遍历字典,不要遗漏了.items()
![Python编程:从入门到实践_第57张图片](http://img.e-com-net.com/image/info8/8e40f107182e49948503661fba3cb902.jpg)
注意,即便遍历字典时,键—值对的返回顺序也与存储顺序不同。Python不关心键—值对的存储顺序,而只跟踪键和值之间的关联关系。若要跟踪顺序可以使用python标准库中模块collections 中的OrderedDict
![Python编程:从入门到实践_第58张图片](http://img.e-com-net.com/image/info8/cb6bad0b25ba455dae9c0f89111b8238.jpg)
for name in favorite_languages.keys(): #遍历字典中的所有键
![Python编程:从入门到实践_第59张图片](http://img.e-com-net.com/image/info8/ccd7e8cb73dc4d6ebc58f01e92b1d69d.jpg)
for language in favorite_languages.values(): #遍历字典中所有值
![Python编程:从入门到实践_第60张图片](http://img.e-com-net.com/image/info8/13b2bfc5f5034efba629107fb3603f42.jpg)
for language in set (favorite_languages.values()): #剔除重复项
![Python编程:从入门到实践_第61张图片](http://img.e-com-net.com/image/info8/48b50e2cf7ef45c48a17e7eb3a7b57d5.jpg)
for name in sorted(favorite_languages.keys()): #按顺序遍历字典中的所有键
![Python编程:从入门到实践_第62张图片](http://img.e-com-net.com/image/info8/e1cb7220956d4167a55cebb80561fa00.jpg)
6.4 嵌套 包含前面列表和字典以及二者的遍历
有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套 。
6.4.1 字典列表
![Python编程:从入门到实践_第63张图片](http://img.e-com-net.com/image/info8/61387bf3b89542188eebd9268fa6b74a.jpg)
通过循环生成字典并append到列表中
![Python编程:从入门到实践_第64张图片](http://img.e-com-net.com/image/info8/579b67e66e1d468999c881f22bc1e302.jpg)
经常需要在列表中包含大量的字典,而其中每个字典都包含特定对象的众多信息。例如,你可能需要为网站的每个用户创建一个字典(就像6.3.1节的user.py中那样),并将这些字典存储在一个名为users 的列表中。在这个列表中,所有字典的结构都相同,因此你可以遍历这个列表,并以相同的方式处理其中的每个字典。
6.4.2 在字典中存储列表
![Python编程:从入门到实践_第65张图片](http://img.e-com-net.com/image/info8/b87eaf33b6dd4c3fb7877ecd8ee3425e.jpg)
每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。
![Python编程:从入门到实践_第66张图片](http://img.e-com-net.com/image/info8/911d12c8d5144f1a8e89fb5253c0c5e2.jpg)
注意 列表和字典的嵌套层级不应太多。如果嵌套层级比前面的示例多得多,很可能有更简单的解决问题的方案。
![Python编程:从入门到实践_第67张图片](http://img.e-com-net.com/image/info8/f2fdf66cc5254c47a22dc92661089a41.jpg)
Chapter 7 用户输入和while循环
message=input(“Please enter your ID:”)
![Python编程:从入门到实践_第68张图片](http://img.e-com-net.com/image/info8/a423964d5347417eba10f33caaa66e2d.jpg)
intput()读入的都是字符串,若想获取数值输入需要用int()
![Python编程:从入门到实践_第69张图片](http://img.e-com-net.com/image/info8/858dfad37ff14786b1fa7f8748c8d24a.jpg)
7.2 while i <=5: #i=1提前赋值 while循环
让用户选择何时退出
![Python编程:从入门到实践_第70张图片](http://img.e-com-net.com/image/info8/3de52199e6fe4b1ab91d4f5798004a28.jpg)
while active: #使用标志,active=True提前定义好。
![Python编程:从入门到实践_第71张图片](http://img.e-com-net.com/image/info8/d5f69eec4fa34ecb95adfb6596aeb303.jpg)
使用break 退出循环
![Python编程:从入门到实践_第72张图片](http://img.e-com-net.com/image/info8/b1876fc87ab14c89ac7d54fdb600c7a8.jpg)
在循环中使用continue
![Python编程:从入门到实践_第73张图片](http://img.e-com-net.com/image/info8/d45a7024b1a74109a483af3d1f780fa8.jpg)
7.3 使用while循环来处理列表和字典
for 循环中不应修改列表,要在遍历列表的同时对其进行修改,可使用while 循环。
while unconfirmed_users: #while列表非空,使用while处理列表。
![Python编程:从入门到实践_第74张图片](http://img.e-com-net.com/image/info8/01acfaa0d2884078b66214d04a72d1a7.jpg)
while ‘cat’ in pets: #remove结合while删除包含特定值的所有列表元素
![Python编程:从入门到实践_第75张图片](http://img.e-com-net.com/image/info8/8bf2bc277efb441494ed726b74a81dd0.jpg)
使用用户输入来填充字典
![Python编程:从入门到实践_第76张图片](http://img.e-com-net.com/image/info8/7ff1ec341a1e46378de4b85844786db4.jpg)
Chapter 8 函数
def greet_user(username): #定义一个函数,并能向函数传递信息
![Python编程:从入门到实践_第77张图片](http://img.e-com-net.com/image/info8/19352c7612e94daabae62662fb0c15c1.jpg)
8.1 传递实参
def describe_pet(animal_type,pet_name):
describe_pet(‘dog’,‘xiaohei’) #位置实参,实参传入时必须按位置顺序传入
![Python编程:从入门到实践_第78张图片](http://img.e-com-net.com/image/info8/bd38790e76854a3a8e9c9f39b85add6e.jpg)
describe_pet(pet_name=‘xiaohei’,animal_type=‘dog’) #关键字实参,无需考虑实参顺序,但需要给出形参名。
![Python编程:从入门到实践_第79张图片](http://img.e-com-net.com/image/info8/669c34b9ab6c406cb87f17acb66b861f.jpg)
def describe_pet(pet_name,animal_type=‘dog’): #默认值
在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。
![Python编程:从入门到实践_第80张图片](http://img.e-com-net.com/image/info8/888a96befc794dfa939b4d1bcaf285fa.jpg)
![Python编程:从入门到实践_第81张图片](http://img.e-com-net.com/image/info8/dab0461d6c454528a37d387ff2f84681.jpg)
8.3 返回值
return full_name.title() #返回简单值
![Python编程:从入门到实践_第82张图片](http://img.e-com-net.com/image/info8/f7b0d2d453fd4c68b7487c8a6f8c3b1e.jpg)
返回一个字典,同理可以返回一个列表
def buld_person(first_name,last_name='qiqi',age=''):
person={'first_name':first_name,'last_name':last_name}
print(type(age))
if age:
person['age']=age
return person
person=buld_person('du','jianjun',23)
print(person)
def buld_person(first_name,last_name='qiqi',age=None):
person={'first_name':first_name,'last_name':last_name}
print(type(age))
if age>=18:
person['age']=age
return person
person=buld_person('du','jianjun',23)
print(person)
![Python编程:从入门到实践_第83张图片](http://img.e-com-net.com/image/info8/dbc45cd6ee7a46f39da2ca4432e62662.jpg)
传递一个列表
![Python编程:从入门到实践_第84张图片](http://img.e-com-net.com/image/info8/39d712617ab84b3b9827be1c5b633ff6.jpg)
print_models(unprinted_designs[:])#禁止函数修改列表,切片表示法[:]创建列表的副本
![Python编程:从入门到实践_第85张图片](http://img.e-com-net.com/image/info8/28fcb866d29e480db965c3157d566d7a.jpg)
def make_pizza(*toppings): #传递任意数量的实参。toppings是一个元组,星号让python创建了一个名为topings的空元组。
![Python编程:从入门到实践_第86张图片](http://img.e-com-net.com/image/info8/9aeeb3069c5e45c3a072cb913265de40.jpg)
def make_pizza(size,*toppings):#结合使用位置实参和任意数量实参
![Python编程:从入门到实践_第87张图片](http://img.e-com-net.com/image/info8/1d1f51c48c1a4998ab162d6da3bf1b25.jpg)
def build_profile(first,last,**user_info): #使用任意数量的关键字实参,user_info是一个空字典
![Python编程:从入门到实践_第88张图片](http://img.e-com-net.com/image/info8/7482a5f7f7e24bf9ad0f428103c5d88c.jpg)
8.6 将函数存储在模块中 #模块是.py文件
import pizza #导入整个模块,pizza.make_pizza(16,‘cheese’),调用pizza.py文件中的make_pizza函数
pizza.make_pizza(16,‘cheese’) #导入整个模块后所使用的的句点表示法
![Python编程:从入门到实践_第89张图片](http://img.e-com-net.com/image/info8/fae8778d0e3c481198ea78e0f2634fb7.jpg)
![Python编程:从入门到实践_第90张图片](http://img.e-com-net.com/image/info8/2c18f9fe8ce04db8a2a3993480467eb9.jpg)
from module_name import function_name #导入特定的函数
![Python编程:从入门到实践_第91张图片](http://img.e-com-net.com/image/info8/169fae3f45d24f558f93345ed205504c.jpg)
import numpy as np #使用as给模块指定别名
![Python编程:从入门到实践_第92张图片](http://img.e-com-net.com/image/info8/50819c13bb5543d8b134be092be101d5.jpg)
from pizza import make_pizza as mp #使用as给函数指定别名
![Python编程:从入门到实践_第93张图片](http://img.e-com-net.com/image/info8/7586ba6e5ac448839d7762062ef2ca78.jpg)
from pizza import * #导入模块中的所有函数,不建议这样用,最好是导入整个模块并使用句点表示法,让代码更容易阅读。
![Python编程:从入门到实践_第94张图片](http://img.e-com-net.com/image/info8/8a11aa63136d4d14b1b741853eed79b0.jpg)
Chapter 9 类
9.1 创建和使用类
9.1.1创建Dog类#类名首字母大写
class Dog():
![Python编程:从入门到实践_第95张图片](http://img.e-com-net.com/image/info8/1b50f18b150548f49f35286a771df6cf.jpg)
def __init__(self,name,age)方法
![Python编程:从入门到实践_第96张图片](http://img.e-com-net.com/image/info8/5ec895b59600444c9b1df792a0acfdb0.jpg)
my_dog=Dog(‘xiaohei’,6)#创建实例
![Python编程:从入门到实践_第97张图片](http://img.e-com-net.com/image/info8/ddbb350b9f444c33a9e745dc105f84bb.jpg)
my_dog.name, my_dog.sit() #访问属性,调用方法
![Python编程:从入门到实践_第98张图片](http://img.e-com-net.com/image/info8/9b10f0fe16a241c9bdea16f97b8405e3.jpg)
self.age=18 #给属性指定默认值
![Python编程:从入门到实践_第99张图片](http://img.e-com-net.com/image/info8/dd3fb2cd142943caab774448ba92bc0d.jpg)
修改属性的值
可以以三种不同的方式修改属性的值:直接通过实例进行修改;通过方法进行设置;通过方法进行递增(增加特定的值)。
xiaohei.age=10 #直接通过实例进行修改
![Python编程:从入门到实践_第100张图片](http://img.e-com-net.com/image/info8/b61dc39f4a05463aa6c9c5a173d83a51.jpg)
通过方法修改属性的值
![Python编程:从入门到实践_第101张图片](http://img.e-com-net.com/image/info8/ea0df39571df4eb1841aef421abfb3c2.jpg)
通过方法对属性的值进行递增
![Python编程:从入门到实践_第102张图片](http://img.e-com-net.com/image/info8/ef8414a038ec4fc0b56483b7cc01e9ca.jpg)
9.3 Class ElectrictCar(Car): #继承
一个类继承 另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类(超类),而新类称为子类 。
![在这里插入图片描述](http://img.e-com-net.com/image/info8/12a70dd46be04935b39d4ed85b75db86.jpg)
super().__init__(make,model,year) #子类的init方法下面需要用super().init方法将父类和子类关联起来
![Python编程:从入门到实践_第103张图片](http://img.e-com-net.com/image/info8/f2fdd1e0f6d547b296490989782e0196.jpg)
给子类定义属性和方法
![Python编程:从入门到实践_第104张图片](http://img.e-com-net.com/image/info8/00342f861a92466bab7a44f74f14f6aa.jpg)
子类中的方法与父类中的方法同名可实现重写父类方法
![Python编程:从入门到实践_第105张图片](http://img.e-com-net.com/image/info8/444d635221a54696b8e3394b9850d19c.jpg)
将实例用作属性
例子很重要,看一看
class Person():
def __init__(self,user_name,**info):
self.user_name=user_name
self.info={}
for k,v in info.items():
self.info[k]=v
def print_name(self):
print(self.user_name)
return self.user_name
def print_info(self):
print(self.info)
class Lover(Person):
def __init__(self,user_name,Person,**info):
super().__init__(user_name,**info)
self.lover=Person
def print_info(self):
print(self.user_name+"'s lover is "+self.lover.user_name,self.info)
def print_lover_info(self):
self.lover.print_info()
djj=Person('dujianjun',location="HIT",interest='coding')
caoqiqi=Lover('caomin',djj,location='xiangyun',interest='reading')
caoqiqi.print_info()
caoqiqi.print_lover_info()
![Python编程:从入门到实践_第106张图片](http://img.e-com-net.com/image/info8/2d4fc90da8d04abab937c549c1abe501.png)
![Python编程:从入门到实践_第107张图片](http://img.e-com-net.com/image/info8/a613e4d0921e47cfbfc9344e60264722.jpg)
9.4 导入类
from car import Car #导入单个类
from car import Car, ElectricCar #从一个模块中导入多个类
![Python编程:从入门到实践_第108张图片](http://img.e-com-net.com/image/info8/b1ca42a6f0724884b5e19a12471e20a9.jpg)
import car #导入整个模块,使用句点表示法访问需要的类
![Python编程:从入门到实践_第109张图片](http://img.e-com-net.com/image/info8/1fc4052532e944128f1d10d904f6b226.jpg)
Python标准库
Python标准库链接 :https://pymotw.com/3/index.html
![Python编程:从入门到实践_第110张图片](http://img.e-com-net.com/image/info8/3753c5680d434ef6822b1b4dc5231679.jpg)
Chapter 10 文件和异常
10.1 从文件中读取数据
with open(‘pi_digit.txt’) as file_object: #打开文件,关键字with在不再需要访问文件后将其关闭
10.1.1读取整个文件
contents=file_object.read() #读取整个文件
在with这个代码块下,打开的文件不会关闭,出了with代码块,文件就会关闭
![Python编程:从入门到实践_第111张图片](http://img.e-com-net.com/image/info8/9464256bac524b6583ffb4f47d039909.jpg)
![Python编程:从入门到实践_第112张图片](http://img.e-com-net.com/image/info8/c9062a4a2f2a4d248d596b68f64303ef.jpg)
contents.rstrip() #Chapter 2有更详细的内容
![Python编程:从入门到实践_第113张图片](http://img.e-com-net.com/image/info8/4a1ee5b543bf4decb8b1a4ceb46a6d8a.jpg)
with open(’./test/pi_digits.txt’) as file_object: 使用相对路径查找打开文件,’.‘不能少,代表相对路径,没有’.’则是绝对路径
注意 Windows系统有时能够正确地解读文件路径中的斜杠(/)。如果你使用的是Windows系统,且结果不符合预期,请确保在文件路径中使用的是反斜杠()。
各个系统打开路径的方式不同
![Python编程:从入门到实践_第114张图片](http://img.e-com-net.com/image/info8/1d44b327b9644e618501e8fd25f15fcd.jpg)
![Python编程:从入门到实践_第115张图片](http://img.e-com-net.com/image/info8/ad55baa02e3a495bb1a1f020b0bfffd1.jpg)
10.1.3 逐行读取
for line in file_object:
![Python编程:从入门到实践_第116张图片](http://img.e-com-net.com/image/info8/5b883d9ec7084ca88c4e02df94f3f665.jpg)
lines=file_object.readlines() #创建一个包含文件各行内容的列表
![Python编程:从入门到实践_第117张图片](http://img.e-com-net.com/image/info8/3f5a4729da474fdda424d13dde1b2dab.jpg)
使用文件的内容举例:
![Python编程:从入门到实践_第118张图片](http://img.e-com-net.com/image/info8/e07357f3beb64274a49d3e87e05be702.jpg)
== 对于你可处理的数据量,Python没有任何限制;只要系统的内存足够多,你想处理多少数据都可以。==
![Python编程:从入门到实践_第119张图片](http://img.e-com-net.com/image/info8/20de9df0bd244daf9b90b4c9284d964d.jpg)
10.2 写入文件
with open(filename,‘w’) as file_object: #文件不存在则创建,存在则先清空内容
如果你要写入的文件不存在,函数open() 将自动创建它。然而,以写入(‘w’ )模式打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件。
写入空文件
file_object.write(“I love qiqi”)
注意 Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str() 将其转换为字符串格式。
== 读取模式(‘r’)、写入模式(‘w’)、附加模式(‘a’)、读写模式(‘r+’)==
![Python编程:从入门到实践_第120张图片](http://img.e-com-net.com/image/info8/246abc6dd23345d990ddf9dd17cec161.jpg)
写入多行
函数write() 不会在你写入的文本末尾添加换行符,因此如果你写入多行时没有指定换行符,文件看起来可能不是你希望的那样:
![Python编程:从入门到实践_第121张图片](http://img.e-com-net.com/image/info8/bf5848e36e2944e397b2f1b881572ce5.jpg)
![Python编程:从入门到实践_第122张图片](http://img.e-com-net.com/image/info8/c1d95ab15883452cbb9210166b5aca12.jpg)
附加到文件
with open(filename,‘a’) as file_object #文件不存在则创建,存在的话,写入到文件的行都将添加到文件末尾
![Python编程:从入门到实践_第123张图片](http://img.e-com-net.com/image/info8/1aa01d523ec34ccd9148687c5f7917c8.jpg)
10.3 异常
使用异常避免崩溃或被黑客攻击
![Python编程:从入门到实践_第124张图片](http://img.e-com-net.com/image/info8/27f88432a6bd4a50a302ab3d4428083b.jpg)
try:-except 异常:异常处理-else 结构
![Python编程:从入门到实践_第125张图片](http://img.e-com-net.com/image/info8/eac5f51652504c7aa03407ad6400dcbe.jpg)
处理FileNotFoundError 异常
![Python编程:从入门到实践_第126张图片](http://img.e-com-net.com/image/info8/e2d436d40e7f422e9436a30662c2ae60.jpg)
失败时一声不吭
pass #可在代码块中使用它来让Python什么都不要做
![Python编程:从入门到实践_第127张图片](http://img.e-com-net.com/image/info8/78078b50b42d49138fea496b32c59618.jpg)
10.4 存储数据
import json
with open(‘numbers.json’,‘w’) as file_object:
json.dump(numbers,file_object) #将数列numbers放入.json文件中
![Python编程:从入门到实践_第128张图片](http://img.e-com-net.com/image/info8/527992fccfcc42b0be914fa2c154e708.jpg)
10.4.3 重构
你经常会遇到这样的情况:代码能够正确地运行,但可做进一步的改进——将代码划分为一系列完成具体工作的函数。这样的过程被称为重构 。重构让代码更清晰、更易于理解、更容易扩展。
Chapter 11 单元测试和测试用例
Python标准库中的模块unittest 提供了代码测试工具。
单元测试 用于核实函数的某个方面没有问题
测试用例 是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求。良好的测试用例考虑到了函数可能收到的各种输入,包含针对所有这些情形的测试。
全覆盖式测试 用例包含一整套单元测试,涵盖了各种可能的函数使用方式。对于大型项目,要实现全覆盖可能很难。通常,最初只要针对代码的重要行为编写测试即可,等项目被广泛使用时再考虑全覆盖。
11.1 测试函数:用于测试函数的
可通过的测试
mport unittest
from name_function import get_formatted_name
class NameTestCase(unittest.TestCase):
def test_first_last_name(self):
name=get_formatted_name('du','jianjun')
print(name)
self.assertEqual('Du Jianjun',name)
if __name__ == '__main__':
unittest.main()
![Python编程:从入门到实践_第129张图片](http://img.e-com-net.com/image/info8/6c01920856984eabbc42a49b79c7dfb4.jpg)
不能通过的测试
测试未通过会报错成这样:
![Python编程:从入门到实践_第130张图片](http://img.e-com-net.com/image/info8/1a3deea56e94453fb4e7afc7ade35ffd.jpg)
![Python编程:从入门到实践_第131张图片](http://img.e-com-net.com/image/info8/3519ee0f47f840d0b92410fec756d03b.jpg)
![Python编程:从入门到实践_第132张图片](http://img.e-com-net.com/image/info8/3de003088b44418bb1367af0be737aa6.jpg)
测试未通过怎么办?:应该修改被测试的函数,而不是修改测试
![Python编程:从入门到实践_第133张图片](http://img.e-com-net.com/image/info8/a950473fcdab44788b887a0ea15ade5b.jpg)
11.2 测试类:用于测试类的
![Python编程:从入门到实践_第134张图片](http://img.e-com-net.com/image/info8/ad8240d0df2545c7baba2891bc434a94.jpg)
和测试函数写法基本一致
![Python编程:从入门到实践_第135张图片](http://img.e-com-net.com/image/info8/d57b7161820c4e5380a28c0c1ea060e3.jpg)
![Python编程:从入门到实践_第136张图片](http://img.e-com-net.com/image/info8/25904effed4548f0a26d2eb87a3c5691.jpg)
![Python编程:从入门到实践_第137张图片](http://img.e-com-net.com/image/info8/e3d570527c234155992a91e9be4af0c2.jpg)
![Python编程:从入门到实践_第138张图片](http://img.e-com-net.com/image/info8/f411fb17dc134092a58697fde55ecd8f.jpg)
方法setUp()
注意 运行测试用例时,每完成一个单元测试,Python都打印一个字符:测试通过时打印一个句点;测试引发错误时打印一个E ;测试导致断言失败时打印一个F 。这就是你运行测试用例时,在输出的第一行中看到的句点和字符数量各不相同的原因。如果测试用例包含很多单元测试,需要运行很长时间,就可通过观察这些结果来获悉有多少个测试通过了。
import unittest
from survey import AnonymousSurvey
class AnonymousSurveyTestCase(unittest.TestCase):
def setUp(self):
question='What language did you first learn to speak?'
self.my_survey=AnonymousSurvey(question)
self.responses=['English','Chinese','Spanish']
def test_single_response(self):
self.my_survey.store_response(self.responses[0])
self.assertIn(self.responses[0],self.my_survey.responses)
def test_three_response(self):
for response in self.responses:
self.my_survey.store_response(response)
for response in self.responses:
self.assertIn(response,self.my_survey.responses)
if __name__ == '__main__':
unittest.main()
![Python编程:从入门到实践_第139张图片](http://img.e-com-net.com/image/info8/2a1fbdbd056f4b0f976df3050859d80f.jpg)
![Python编程:从入门到实践_第140张图片](http://img.e-com-net.com/image/info8/c748ba5cd8a64d3a82d7995c2839c996.jpg)