Python编程:从入门到实践

Python编程:从入门到实践

    • ==Appendix 1.代码规范==
    • 1.1函数编写规范
      • 函数名使用小写字母和单词之间下划线。应给函数指定描述性名称。模块命名也是
      • 每个函数应有简要的DocStrings注释
        • 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 字典列表
      • 通过循环生成字典并append到列表中
    • 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类#类名首字母大写
        • class 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 测试类:用于测试类的
      • ==方法setUp()==

Appendix 1.代码规范

1.1函数编写规范

函数名使用小写字母和单词之间下划线。应给函数指定描述性名称。模块命名也是

每个函数应有简要的DocStrings注释

每个函数都应包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。

DocStrings 文档字符串

Python编程:从入门到实践_第1张图片

给形参指定默认值时,等号两边不要有空格,对于函数调用中的关键字实参,也应遵循这种约定:

Python编程:从入门到实践_第2张图片

在左括号后换行,是函数形参过长的处理办法。

Python编程:从入门到实践_第3张图片

每行代码长度不要超过这根竖线

Python编程:从入门到实践_第4张图片

1.2 类编写规范

类的名称每个单词首字母大写且不使用下划线,实例名和模块名都采用小写格式,并在单词之间加上下划线。

每个类紧跟定义后包含一个文档字符串描述类的功能

可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。

需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import 语句,再添加一个空行,然后编写导入你自己编写的模块的import 语句。

Python编程:从入门到实践_第5张图片

1.3 测试类、测试函数编写规范

单元测试 是测试函数某一方面是否有问题
测试用例 是一组单元测试
全覆盖式测试 是一整套单元测试

类名包含字样Test

方法名必须以test_打头,这样它才会在我们运行test_name_function.py时自动运行。

Python编程:从入门到实践_第6张图片

1.4 通过空行,划分程序

要将程序的不同部分分开,可使用空行。你应该使用空行来组织程序文件,但也不能滥用;例如,如果你有5行创建列表
的代码,还有3行处理该列表的代码,那么用一个空行将这两部分隔开是合适的。然而,你不应使用三四个空行将它们隔开。
空行不会影响代码的运行,但会影响代码的可读性。

1.5 输入输出

message=input("please input your name: ")冒号后要有个空格

打印的内容太长,如何拆分

Python编程:从入门到实践_第7张图片

Chapter 2 变量

注意  就目前而言,应使用小写的Python变量名。在变量名中使用大写字母虽然不会导致错误,但避免使用大写字母是个不错的主意。
Python编程:从入门到实践_第8张图片
Python编程:从入门到实践_第9张图片
Python编程:从入门到实践_第10张图片

2.3字符串

‘…’,"…",#字符串,单引号,双引号都可以。

str(18) #把数字转化为字符串

int(‘18’) #把字符串转化为整数

float(18),float(‘3.14’) #把整形转化为浮点数,把字符串转换为浮点数

name.title() #每个单词首字母改为大写

name.upper() #全部大写

name.lower() #全部小写

Python编程:从入门到实践_第11张图片

删除空白,都是暂时性删除,若要永久删除字符串中的空白,需要将删除操作的结果存回变量中

favorite_language.strip() #暂时性剔除字符串两端的空白

favorite_language.lstrip() #剔除字符串开头的空白

favorite_language.rstrip() #剔除字符串末尾的空白

在这里插入图片描述
Python编程:从入门到实践_第12张图片

message=message.replace(‘dog’,‘cat’) #替换指定单词,一次性全部替换

Python编程:从入门到实践_第13张图片

message.split() #以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中。

Python编程:从入门到实践_第14张图片

字符串拼接新方式 很常用,材料中的源码字符串拼接用的都是这个

f"{str1}中间想加什么都可以{str2} {str3}" #字符串拼接

Python编程:从入门到实践_第15张图片

Chapter 3 列表 [ …]

3.1列表的增、删、查、改

bicycles=[‘trek’,‘cannondale’,‘redline’,‘specialized’] #初始化列表

print(bicycles[0]) #访问列表

print(bicycles[-1]) #访问列表倒数第一个元素

Python编程:从入门到实践_第16张图片

motorcycles[0]=‘ducati’ #修改列表元素

Python编程:从入门到实践_第17张图片

motorcycles.append(‘ducati’) #在列表末尾添加元素

Python编程:从入门到实践_第18张图片

motorcycles.insert(0,‘ducati’) #在列表任意位置插入元素

Python编程:从入门到实践_第19张图片

del motorcycles[0] #del语句删除指定位置元素

Python编程:从入门到实践_第20张图片

x=motorcycles.pop() #列表元素出栈

Python编程:从入门到实践_第21张图片

x=motorcycles.pop(2) #弹出指定位置元素

Python编程:从入门到实践_第22张图片

motorcycles.remove(‘ducati’) #根据值删除元素

Python编程:从入门到实践_第23张图片

remove()只能删除第一个指定的值,多次出现用循环。

在这里插入图片描述

3.3列表排序,逆序,长度,某个元素出现的个数

cars=[‘bmw’,‘audi’,‘toyota’,‘subaru’]

list.count(obj) #统计某个元素在列表中出现的次数。

cars.sort() #永久排序,字母顺序排序

cars.sort(reverse=True) #永久排序,字母相反顺序排序

Python编程:从入门到实践_第24张图片

sorted(cars,reverse=True) #临时性排序

Python编程:从入门到实践_第25张图片

cars.reverse() #倒着打印列表

Python编程:从入门到实践_第26张图片

len(cars)

Python编程:从入门到实践_第27张图片

Chapter4 操作列表

4.1 遍历整个列表

magicians=[‘alice’,‘david’,‘carolina’]

for magician in magicians: #遍历magicians列表中的元素

Python编程:从入门到实践_第28张图片
Python编程:从入门到实践_第29张图片

常见错误:遗漏冒号,多余的缩进

4.3 创建数值列表

for value in range(1,5): #1,2,3,4

range(10) #[0,9)

Python编程:从入门到实践_第30张图片
Python编程:从入门到实践_第31张图片

4.3.2 使用range()创建数字列表

numbers=list(range(1,6)) #创建列表 numbers=[1,2,3,4,5]

Python编程:从入门到实践_第32张图片
x_values=list(range(1,1001))

y_values=[x**2 for x in x_valuse] #自动计算数据,快速生成列表

Python编程:从入门到实践_第33张图片

4.3.3 对数字列表执行简单的统计计算

digits=list(range(0,10))

min(digits),max(digits),sum(digits)#最小,最大,求和

Python编程:从入门到实践_第34张图片

squares=[value**2 for value in range(1,11)] #列表解析

在这里插入图片描述

4.4 切片,使用列表的一部分

players=[‘charles’,‘matina’,‘michael’,‘florence’,‘eli’]

print(players[0:3]) #打印切片(子列表) 0,1,2元素

Python编程:从入门到实践_第35张图片

players[:4],players[2:],players[-3:]

Python编程:从入门到实践_第36张图片
Python编程:从入门到实践_第37张图片

for player in players[:3]: #遍历切片

Python编程:从入门到实践_第38张图片

4.4.3 复制列表

my_foods=[‘pizza’,‘falafel’,‘carrot cake’]

friend_foods=my_foods[:] 正确, friend_foods=my_foods 错误;

Python编程:从入门到实践_第39张图片
Python编程:从入门到实践_第40张图片

4.5 元组(…) #不可变的列表被称为元组

列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,这对处理网站的用户列表或游戏中的角色列表至关重要。然而,有时候你需要创建一系列不可修改的元素,元组可以满足这种需求。Python将不能修改的值称为不可变的 ,而不可变的列表被称为元组 。

dimensions=(200,50)#一个矩阵的长和宽我们不希望它改变,所以将长和宽存放在一个元组当中

print(dimesions[0]) #访问元组

Python编程:从入门到实践_第41张图片

for dimension in dimensions: #遍历元组中的所有值:

Python编程:从入门到实践_第42张图片

虽然不能修改元组的元素,但可以给存储元组的变量重新赋值

Python编程:从入门到实践_第43张图片

Chapter 5 if语句

Python编程:从入门到实践_第44张图片

if x>3 and x<6 ;if x>3 or x<1

Python编程:从入门到实践_第45张图片

if ‘bmw’ in cars #检查特定值是否包含在列表中

Python编程:从入门到实践_第46张图片

if ‘bmw’ not in cars #检查特定值是否不包含在列表中

Python编程:从入门到实践_第47张图片

5.3.3 if-elif-else结构,注意不要遗漏了冒号

Python编程:从入门到实践_第48张图片

5.4.2 if cars: #确定列表不是空的

Python编程:从入门到实践_第49张图片

5.4.3 使用多个列表,通过for循环和if-elif-else的结合

Python编程:从入门到实践_第50张图片

Chapter 6 字典

alien_0={‘color’: ‘green’, ‘points’: 5} #{…}存放一系列的键-值对

在Python中,字典 是一系列键—值对 。每个键 都与一个值相关联,你可以使用键来访问与之相关联的值。与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可将任何Python对象用作字典中的值。
Python编程:从入门到实践_第51张图片

alien_0[‘x_position’]=0 #添加键-值对

Python编程:从入门到实践_第52张图片
Python编程:从入门到实践_第53张图片

alien_0[‘color’]=‘yellow’ #修改字典中的值

Python编程:从入门到实践_第54张图片

del alien_0[‘points’] #删除键-值对

Python编程:从入门到实践_第55张图片

由类似对象组成的字典

Python编程:从入门到实践_第56张图片

遍历字典

for key,value in user_0.items(): #遍历字典,不要遗漏了.items()

Python编程:从入门到实践_第57张图片

注意,即便遍历字典时,键—值对的返回顺序也与存储顺序不同。Python不关心键—值对的存储顺序,而只跟踪键和值之间的关联关系。若要跟踪顺序可以使用python标准库中模块collections 中的OrderedDict

Python编程:从入门到实践_第58张图片

for name in favorite_languages.keys(): #遍历字典中的所有键

Python编程:从入门到实践_第59张图片

for language in favorite_languages.values(): #遍历字典中所有值

Python编程:从入门到实践_第60张图片

for language in set (favorite_languages.values()): #剔除重复项

Python编程:从入门到实践_第61张图片

for name in sorted(favorite_languages.keys()): #按顺序遍历字典中的所有键

Python编程:从入门到实践_第62张图片

6.4 嵌套 包含前面列表和字典以及二者的遍历

有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套 。

6.4.1 字典列表

Python编程:从入门到实践_第63张图片

通过循环生成字典并append到列表中

Python编程:从入门到实践_第64张图片
经常需要在列表中包含大量的字典,而其中每个字典都包含特定对象的众多信息。例如,你可能需要为网站的每个用户创建一个字典(就像6.3.1节的user.py中那样),并将这些字典存储在一个名为users 的列表中。在这个列表中,所有字典的结构都相同,因此你可以遍历这个列表,并以相同的方式处理其中的每个字典。

6.4.2 在字典中存储列表

Python编程:从入门到实践_第65张图片

每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。

Python编程:从入门到实践_第66张图片
注意  列表和字典的嵌套层级不应太多。如果嵌套层级比前面的示例多得多,很可能有更简单的解决问题的方案。
Python编程:从入门到实践_第67张图片

Chapter 7 用户输入和while循环

message=input(“Please enter your ID:”)

Python编程:从入门到实践_第68张图片

intput()读入的都是字符串,若想获取数值输入需要用int()

Python编程:从入门到实践_第69张图片

7.2 while i <=5: #i=1提前赋值 while循环

让用户选择何时退出

Python编程:从入门到实践_第70张图片

while active: #使用标志,active=True提前定义好。

Python编程:从入门到实践_第71张图片

使用break 退出循环

Python编程:从入门到实践_第72张图片

在循环中使用continue

Python编程:从入门到实践_第73张图片

7.3 使用while循环来处理列表和字典

for 循环中不应修改列表,要在遍历列表的同时对其进行修改,可使用while 循环。

while unconfirmed_users: #while列表非空,使用while处理列表。

Python编程:从入门到实践_第74张图片

while ‘cat’ in pets: #remove结合while删除包含特定值的所有列表元素

Python编程:从入门到实践_第75张图片

使用用户输入来填充字典

Python编程:从入门到实践_第76张图片

Chapter 8 函数

def greet_user(username): #定义一个函数,并能向函数传递信息

Python编程:从入门到实践_第77张图片

8.1 传递实参

def describe_pet(animal_type,pet_name):

describe_pet(‘dog’,‘xiaohei’) #位置实参,实参传入时必须按位置顺序传入

Python编程:从入门到实践_第78张图片

describe_pet(pet_name=‘xiaohei’,animal_type=‘dog’) #关键字实参,无需考虑实参顺序,但需要给出形参名。

Python编程:从入门到实践_第79张图片

def describe_pet(pet_name,animal_type=‘dog’): #默认值

在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。

Python编程:从入门到实践_第80张图片
Python编程:从入门到实践_第81张图片

8.3 返回值

return full_name.title() #返回简单值

Python编程:从入门到实践_第82张图片

返回一个字典,同理可以返回一个列表

def buld_person(first_name,last_name='qiqi',age=''):#默认参数age是str对象
    person={'first_name':first_name,'last_name':last_name}
    print(type(age))
    if age:#不能用if age>=18: 因为这里的age是str对象,不是int对象
        person['age']=age
    return person
person=buld_person('du','jianjun',23)#23可以打引号,也可以不打引号
print(person)

def buld_person(first_name,last_name='qiqi',age=None):#默认参数age是int对象
    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张图片

传递一个列表

Python编程:从入门到实践_第84张图片

print_models(unprinted_designs[:])#禁止函数修改列表,切片表示法[:]创建列表的副本

Python编程:从入门到实践_第85张图片

def make_pizza(*toppings): #传递任意数量的实参。toppings是一个元组,星号让python创建了一个名为topings的空元组。

Python编程:从入门到实践_第86张图片

def make_pizza(size,*toppings):#结合使用位置实参和任意数量实参

Python编程:从入门到实践_第87张图片

def build_profile(first,last,**user_info): #使用任意数量的关键字实参,user_info是一个空字典

Python编程:从入门到实践_第88张图片

8.6 将函数存储在模块中 #模块是.py文件

import pizza #导入整个模块,pizza.make_pizza(16,‘cheese’),调用pizza.py文件中的make_pizza函数

pizza.make_pizza(16,‘cheese’) #导入整个模块后所使用的的句点表示法

Python编程:从入门到实践_第89张图片
Python编程:从入门到实践_第90张图片

from module_name import function_name #导入特定的函数

Python编程:从入门到实践_第91张图片

import numpy as np #使用as给模块指定别名

Python编程:从入门到实践_第92张图片

from pizza import make_pizza as mp #使用as给函数指定别名

Python编程:从入门到实践_第93张图片

from pizza import * #导入模块中的所有函数,不建议这样用,最好是导入整个模块并使用句点表示法,让代码更容易阅读。

Python编程:从入门到实践_第94张图片

Chapter 9 类

9.1 创建和使用类

9.1.1创建Dog类#类名首字母大写

class Dog():

Python编程:从入门到实践_第95张图片

def __init__(self,name,age)方法

Python编程:从入门到实践_第96张图片

my_dog=Dog(‘xiaohei’,6)#创建实例

Python编程:从入门到实践_第97张图片

my_dog.name, my_dog.sit() #访问属性,调用方法

Python编程:从入门到实践_第98张图片

self.age=18 #给属性指定默认值

Python编程:从入门到实践_第99张图片

修改属性的值

可以以三种不同的方式修改属性的值:直接通过实例进行修改;通过方法进行设置;通过方法进行递增(增加特定的值)。

xiaohei.age=10 #直接通过实例进行修改

Python编程:从入门到实践_第100张图片

通过方法修改属性的值

Python编程:从入门到实践_第101张图片

通过方法对属性的值进行递增

Python编程:从入门到实践_第102张图片

9.3 Class ElectrictCar(Car): #继承

一个类继承 另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类(超类),而新类称为子类 。
在这里插入图片描述

super().__init__(make,model,year) #子类的init方法下面需要用super().init方法将父类和子类关联起来

Python编程:从入门到实践_第103张图片

给子类定义属性和方法

Python编程:从入门到实践_第104张图片

子类中的方法与父类中的方法同名可实现重写父类方法

Python编程:从入门到实践_第105张图片

将实例用作属性

例子很重要,看一看

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张图片

Python编程:从入门到实践_第107张图片

9.4 导入类

from car import Car #导入单个类

from car import Car, ElectricCar #从一个模块中导入多个类

Python编程:从入门到实践_第108张图片

import car #导入整个模块,使用句点表示法访问需要的类

Python编程:从入门到实践_第109张图片

Python标准库

Python标准库链接 :https://pymotw.com/3/index.html
Python编程:从入门到实践_第110张图片

Chapter 10 文件和异常

10.1 从文件中读取数据

with open(‘pi_digit.txt’) as file_object: #打开文件,关键字with在不再需要访问文件后将其关闭

10.1.1读取整个文件

contents=file_object.read() #读取整个文件

在with这个代码块下,打开的文件不会关闭,出了with代码块,文件就会关闭
Python编程:从入门到实践_第111张图片
Python编程:从入门到实践_第112张图片

contents.rstrip() #Chapter 2有更详细的内容

Python编程:从入门到实践_第113张图片

with open(’./test/pi_digits.txt’) as file_object: 使用相对路径查找打开文件,’.‘不能少,代表相对路径,没有’.’则是绝对路径

注意 Windows系统有时能够正确地解读文件路径中的斜杠(/)。如果你使用的是Windows系统,且结果不符合预期,请确保在文件路径中使用的是反斜杠()。
各个系统打开路径的方式不同
Python编程:从入门到实践_第114张图片
Python编程:从入门到实践_第115张图片

10.1.3 逐行读取

for line in file_object:

Python编程:从入门到实践_第116张图片

lines=file_object.readlines() #创建一个包含文件各行内容的列表

Python编程:从入门到实践_第117张图片
使用文件的内容举例:
Python编程:从入门到实践_第118张图片
== 对于你可处理的数据量,Python没有任何限制;只要系统的内存足够多,你想处理多少数据都可以。==
Python编程:从入门到实践_第119张图片

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张图片

写入多行

函数write() 不会在你写入的文本末尾添加换行符,因此如果你写入多行时没有指定换行符,文件看起来可能不是你希望的那样:
Python编程:从入门到实践_第121张图片
Python编程:从入门到实践_第122张图片

附加到文件

with open(filename,‘a’) as file_object #文件不存在则创建,存在的话,写入到文件的行都将添加到文件末尾

Python编程:从入门到实践_第123张图片

10.3 异常

使用异常避免崩溃或被黑客攻击

Python编程:从入门到实践_第124张图片

try:-except 异常:异常处理-else 结构

Python编程:从入门到实践_第125张图片
处理FileNotFoundError 异常
Python编程:从入门到实践_第126张图片

失败时一声不吭

pass #可在代码块中使用它来让Python什么都不要做

Python编程:从入门到实践_第127张图片

10.4 存储数据

import json
with open(‘numbers.json’,‘w’) as file_object:

json.dump(numbers,file_object) #将数列numbers放入.json文件中

Python编程:从入门到实践_第128张图片

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): #类名之后,直接跟测试函数,都是test_开头
        name=get_formatted_name('du','jianjun')
        print(name)
        self.assertEqual('Du Jianjun',name) #第一参数放预期结果,第二参数放输出结果

if __name__ == '__main__': #下面截图少了这一句,会出错
    unittest.main()

Python编程:从入门到实践_第129张图片

不能通过的测试

测试未通过会报错成这样:
Python编程:从入门到实践_第130张图片
Python编程:从入门到实践_第131张图片
Python编程:从入门到实践_第132张图片

测试未通过怎么办?:应该修改被测试的函数,而不是修改测试

Python编程:从入门到实践_第133张图片

11.2 测试类:用于测试类的

Python编程:从入门到实践_第134张图片
和测试函数写法基本一致
Python编程:从入门到实践_第135张图片
Python编程:从入门到实践_第136张图片
Python编程:从入门到实践_第137张图片
Python编程:从入门到实践_第138张图片

方法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张图片
Python编程:从入门到实践_第140张图片

你可能感兴趣的:(编程学习笔记)