157个知识点学会Python编程(满满的干货)

157个知识点学会Python编程(满满的干货)

目录


第一章 搭建环境

两个不同系统下的Python环境安装教程如下:
windows下安装Python环境
Linux下安装Python环境

小结

在本章中,你大致了解Python,并在自己的系统中安装了Python。你还安装了一个文本编辑器,以简化Python代码的编写工作。你学习了如何在终端会话中运行Python代码片段,并运行了第一个货真价实的程序——hello_world.py。你还大致了解了如何解决安装问题。

第二章 变量和简单数据类型

name = "my name is xxx"

1.字符串首字母大写

name.title()

2.字符串字母全大写

name.upper()

3.字符串字母全小写

name.lower()

4.合并字符串

通过‘+’进行连接和合并

name + 'Xiaoming' + '.'

5.换行和添加制表符(程序行开头的缩进)

\n 换行
\t 加制表符

6.删除字符串前后空白

rstrip() 删除后端空白(暂时的)
例:name.rstrip() 
lstrip() 删除前端空白
strip()  删除两端空白

7.注意在使用单引、双引时要区分英文的’s等语句

's

8.四则运算符号的应用

+”、“-”、“*”、“/”、“**”
加   减   乘   除   乘方

9.转换数字为字符串

str()
注:小数点除法的用法

10.注释

注释通过“#”来完成
要成为专业的程序员,必须编写有意义的注释

11.Python终端浏览其他指导规则

import this

小结

在本章中,你学习了:如何使用变量;如何创建描述性变量名以及如何消除名称错误和语法错误;字符串是什么,以及如何使用小写、大写和首字母大写方式显示字符串;使用空白来显示整洁的输出,以及如何提出字符串中多余的空白;如何使用整数和浮点数;使用数值数据时需要注意的意外行为。你还学习了如何编写说明性注释,让代码对你和其他人来说更容易理解。最后,你了解了让代码尽可能简单的理念。
在第三章中,你将学习如何在被称为列表的变量中存储信息集,以及如何通过遍历列表来操作其中的信息。

第三章 列表简介

12.列表

列表:由一些列按照特定顺序排列的元素组成

13.列表符号

通过[]表示列表,并用逗号分隔其中的元素
bicycles = ['trck','cannondale','redline','specialized']

14.如何访问列表

bicycles[0] bicycles[1] bicycles[2] bicycles[3]
令bicycles[0].title()等
注:还可以-1-2-3-4表示从后往前调用

15.使用字符串组合

“A”+“B”+“C”

16.修改列表元素

names[0]="XX"

17.添加列表元素

使用append语句

names.append("xx")

18.插入列表元素

使用insert语句

names.insert(0,'xx')
其中0表示插入位置,且为第一个

19.删除列表元素

使用del语句

del names[0]

20.pop()方法删除元素,且出栈最后一个元素

popped_motorcycle = motorcycles.pop()

21.弹出列表中任何位置处的元素

在pop()中添加索引号

first_owned = motorcycles.pop(0)

注:使用pop()时,被弹出的元素就不再在列表中了,但仍可继续调用

22.根据值删除元素

使用remove()

motorcycles.remove('ducati')
其中ducati为motorcycles中的一个元素

注:需要知道要删除的值
组织列表

23.按照字母顺序永久性排序列表

使用sort()

sort() 正向排序
sort(reserse = True) 反向排序
names.sort()

注:排序为永久性的

24.使用sorted()对列表进行临时排序

只是临时按照字母顺序排序,但并不改变原有的顺序

sorted(names) 

如果想反向排序也可引入reserse = True

sorted(names,reverse = True) 

25.倒着打印列表

使用reverse()直接反转列表,且为永久性修改

names.reverse()
print(names)

26.确定列表长度

使用len()

len(names)  直接调用即可

使用列表时避免索引错误
如果列表中有3个元素,但你访问[3]会导致报错:

Traceback(most recent call last):
	File"motorcycles.py",line 3,in<module>
		print(motorcycle[3])
IndexError:list index out of range

在这种情况下,我们可以将列表或长度打印出来

小结

本章中,你学习了,列表时什么以及如何使用其中的元素;如何定义列表以及如何增删元素;如何对列表进行永久性排序,以及如何为展示列表而进行临时排序;如何确定列表的长度,以及在使用列表时如何避免索引错误。
在第四章,你将学习如何以更高效的方式处理列表元素。通过使用为数不多的几行代码来遍历列表元素,你就能高效地处理它们,即便列表包含数千乃至数百万个元素。

第四章 操作列表

27.利用for循环打印名单

magicians = ['alice','david','carolina']
for magician in magicians:
	print(magician)

使用单数和复数式名称,可帮助你判断代码段处理的是单个列表元素还是整个列表。

28.在for循环中执行更多的操作

例:通过for循环对每个names打印并调节首字母

\n 中途换行

29.for循环结束后执行一些操作

对于for循环后有缩进循环才执行,否则执行一次不进行循环操作

30.注意缩进(for循环等)

一般不缩进报错expected an indented block

31.一些小建议

逻辑缩进很重要(不易发现,只能看结果)
不必要缩进会报错(unexpected indent)
有些代码逻辑上不必要缩进
注:不要遗漏了冒号,for循环后冒号提示该缩进
创建数值列表

32.range()函数

从指定的第一个值开始数,并在到达你指定的第二个值后停止,且输出不包括第二个值。

for value in range(1,5):
	print(value)
输出:1 2 3 4

33.使用range()创建数字列表

组合list()使用

numbers = list(range(1,6))
输出[1,2,3,4,5]

注:range(2,11,2)从2到11,且间距为2

34.还可使用append函数

a.append(xx)

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

min() 找最小
max() 找最大
sum() 求和

36.列表解析

表达式 for 变量 in range(1,11):
使用列表的一部分

37.切片

[0:3] 表示从第一个元素到第三个元素
[1:4] 表示从第二个元素到第四个元素
[ :4] 输出前四个
[2: ] 从正数第三个到末尾
[-3:] 倒数三个元素

38.遍历切片部分元素

for player in player[:3]:
	print(player.title())

39.创建两个独立列表

[:]表示列表全部元素

my_foods = ['pizza','falafel']
friend_foods = my_foods[:]

40.元组

使用圆括号而不是方括号来标识

dimensions = (200,50)

注:每个元素都不可修改

41.for循环遍历

for dimension in dimensions:
	print(dimensions)

42.for循环遍历

虽然不能改变每一个元组的数据,但可以对整个元组进行赋值

dimensions = (400,200)

43.漂亮的代码格式

①缩进:四个空格
②行长:每行不超过80字符,最大99字符
注释行长不超过72字符
③空行:两个不同的代码手段用空行隔开
PE8标准

小结

本章中,你学习了:如何高效地处理列表中的元素;如何使用for循环遍历列表,Python如何根据缩进来确定程序的结构以及如何避免一些常见的缩进错误;如何创建简单的数字列表,以及可对数字列表执行的一些操作;如何通过切片来使用列表的一部分和复制列表。你还学习了元组(它对不应变化的值提供了一定程度的保护)以及在代码变得越来越复杂时如何设置格式使其易于阅读。
在第五章中,你将学习如何使用if语句在不同的条件下采取不同的措施;学习如何将一组较复杂的条件测试组合起来,并在满足特定条件时采取相应的措施;你还将学习如何在遍历列表时,通过使用if语句对特定元素采取特定的措施。

第五章 if语句

44.经典结构

for car in cars:
	if car == 'bmw':
		print(car.upper())
	else:
		print(car.title())

45.检查是否相等

赋值 car = 'bmw'
判断 car == 'bmw'
输出 True

46.检查是否相等时不考虑大小写

赋值 car = 'Audi'
判断 car == 'audi'
输出 False
赋值 car = 'Audi'
判断 car.lower() == 'audi'
输出 True

47.检查是否不相等

使用!=进行判断

赋值 car = 'Audi'
判断 car != 'audi'
输出 True

48.比较数字

赋值 age = 18
判断 age == 18
输出 True

49.检查多个条件

1) and 检查多个,并列
2) or  检查多个,

50.检查特定值是否包含在列表中

使用关键词in

names = ['a','b','c']
'b' in names
输出True

51.检查特定值是否不包含在列表中

使用关键词not in

names = ['a','b','c']
'd' not in names
输出True

52.布尔表达式

通过True或False直接赋值

game_active = True

53.if判断基本结构

if xxx:
	do something

54.if-else语句

if xxx:
	do something 1
else:
	do something 2

55.if-elif-else语句

if xxx:
	do something 1
elif xxx:
	do something 2
else:
	do something 3

56.使用多个elif代码块

if xxx:
	do something 1
elif xxx:
	do something 2
elif xxx:
	do something 3
elif xxx:
	do something 4
else:
	do something 5

57.省略else代码块

if xxx:
	do something 1
elif xxx:
	do something 2
elif xxx:
	do something 3
elif xxx:
	do something 4
...

58.测试多个条件

if if if 多if

if xxx:
	do something 1
if xxx:
	do something 2
if xxx:
	do something 3
if xxx:
	do something 4
...

使用if语句处理列表

59.检查特殊元素

for循环中加if

for name in names:
	if name == xx:
		do something

60.确定列表不是空的

对于列表names,如为空则返回False

if names:
	do something
若列表为空if判断失效	

61.使用多个列表

for+if+else结构

列表1 = []
列表2 = []
for 变量名 in 列表1:
	if 变量名 in 列表2:
		print("xxx")
	else:
		print("xxx")	

62.良好的if语句格式

在 > , = , >= 等符号左右各加一个空格,更美观

a = b > c >= d

小结

本章中,你学习了如何编写结果要么为True要么为False的条件测试。你学习了如何编写简单的if语句,if-else语句和if-elif-else结构。在程序中,你使用了这些结构来测试特定的条件。以确定这些条件是否满足。你学习了如何在利用高效的for循环的同时,以不同于其他元素的方式对特定的列表元素进行处理,你还再次学习了Python就代码格式方面提出的建议。这可确保即便你编写的程序越来越复杂。其代码依然易于阅读和理解。
在第六章,你将学习Python字典,字典类似于列表。但让你能够将不同的信息关联起来,你将学习如何创建和遍历字典以及如何将字典列表和if语句结合起来使用。学习字典让你能够模拟更多现实世界的情形。

63.使用字典,键-值对

alien_0 = {'color':'green','points':5}
键color 值green
键point 值5

64.访问字典中的值

直接调用
alien_0['color']
如果打印会输出green

65.添加键-值对

字典是一种动态结构,可随时添加键-值对

alien_0['x_position'] = 25

注:字典只注重添加顺序,只关心键和值之间的关联关系。

66.创建一个空子典

alien_0 = {}

67.修改字典中的值

alien_0['color'] = 'yellow'

68.删除键-值对

直接使用del语句

del alien_0['color']

69.由类似对象组成的字典

格式:首行缩进四个空格/一个Tab,后面加逗号,最后加括号

favorite_languages = {
	'jen':'python',
	'sarah':'c',
	'edward':'ruby',
	}

70.遍历字典

直接调用user_o,items()

for key,value in user_o.items():
	print(key)
	print(value)

71.遍历字典中的所有键

直接调用.keys()

for name in favorite_language.keys():
	print(name.title())

72.按顺序遍历字典中的所有键

.keys()组合排序函数sort()

for name in sorted(favorite_language.keys()):
	print(name.title())

73.遍历字典中的所有值

直接调用.values()

for language in favorite_language.values():
	print(language.title())

注:在调用值时,可能会有相同的值,可以通过set()进行去重

for language in set(favorite_language.values()):
	print(language.title())

74.嵌套

alien_0 = {'color':'green','point':5}
alien_1 = {'color':'yellow','points':10}
aliens = [alien_0,alien_1]
for alien in aliens:
	print(alien)

注:如果想修改某个值,直接if判断

alien_0 = {'color':'green','point':5}
alien_1 = {'color':'yellow','points':10}
aliens = [alien_0,alien_1]
for alien in aliens:
	if alien['color'] == green
		do something

75.列表存在字典中

pizza = {
	'crust':'thick',
	'toppings':['mushrooms','extra cheese'],
	}

76.字典套字典

user = {
	'aeinstein':{
		'first':'albert',
		'last':'einstein',
		'location':'princeton',
		},
	'mcurie':{
		'first':'marie',
		'last':'curie',
		'location':'paris',
		}

调用:

for username,user_info in user.items():
	user_info['first']

小结

在本章中,你学习了:如何定义字典,以及如何使用存储在字典中的信息;如何访问和修改字典中的元素,以及如何遍历字典中的所有信息;如何遍历字典中所有的键-值对、所有的键和所有的值,如何在列表中嵌套字典,在字典中嵌套列表以及在字典中嵌套字典。
下一章中,将学习while循环以及如何从用户哪里获取输入。这是激动人心的一章,让你知道如何将程序编程交互性的——能够对用户输入作出响应。

第七章 用户输入和while循环

77.函数input()的工作原理

工作原理:input()让程序暂停运行,等待用户输入一些文本。获取用户输入后,Python将其存储在一个变量中,以方便使用。

message = input("请输入")
print(message)

78.编写清晰的程序

对于某些字符串末尾加空格,过长的字符串通过\n来换行,可以使代码更美观。

79.使用int()来获取数值输入

强制类型转换,可将字符串直接转换成整数型

age = input("How old are you")
age = int(age)
age >= 10

80.求模运算符–>与C语言一样,%取余

5 % 3 = 2

81.Python2.7中的input()函数

注:对于Python2.7中的input(),应该使用raw_input()来提示输入,否则程序不会报错,会乱执行

82.while循环

for循环用于针对集合中的每个元素都一个代码块,而while循环不断地运行,直到指定的条件不满足为止。
while 循环使用格式:

while 条件:
	do something

83.利用while循环让用户选择何时退出

while message != 'quit':
	message = input("请输入")

84.标志的使用

通过对flag进行定义可直接改变条件

while flag:
	if xx:
		flag = True
	else:
		flag = False

85.使用break语句可退出循环

while True:
	语句
	if city == 'quit':
		break
	else:
		print("xxx")

86.在循环中使用continue

continue可以返回到循环开头,并根据条件测试结果决定是否继续执行循环

while xx < 10:
	xx += 1
	if xx % 2 == 0:
		continue
	print("xxx")

注:千万要避免无限循环
使用while循环来处理列表和字典

87.在列表之间移动元素

list = ['alice','brian','candace'] 创建列表
new_list = [] 定义空列表
while list: 循环列表
	name = list.pop()print(name.title())         环
	new_list.append(name)       输出

结果:

Candace
Brain
Alice

88.删除包含特定值的所有列表元素

使用remove命令

while 'cat' in pets:
	pets.remove('cat') 循环寻找pets中的cat元素并删除

89.使用用户输入来填充字典

while循环填充,主要通过标志结束循环,其余的还是对字典的应用

小结

在本章中,你学习了:如何在程序中使用input()来让用户提供信息;如何处理文本和数字输入,以及如何使用while循环,让程序按用户的要求不断地运行;多种控制while循环流程的方式:设置活动标志、使用break语句以及使用continue语句;如何使用while循环在列表之间移动元素,以及如何从列表中删除所有包含特定值的元素;如何结合while循环和字典。
在第八章中,你将学习函数。函数让你能够将程序分成多个很小的部分。其中每部分都负责完成一项具体任务。你可以根据需要调用同一个函数任意次,还可将函数存储在独立的文件中,使用函数可以让你编写的代码效率更高,更容易维护和排除故障,还可在众多不同的程序中重用。

第八章 函数

90.定义函数

函数格式:

def 函数名():
	语句

91.向函数传递信息(任务)

def greet_user(username):
	print("Hello," + username.title() + "!")
调用函数时:
greet_user('jesse')

92.实参和形参

上述91中,username为形参
jesse为实参

93.传递参数

位置参数:每个实参都关联到函数定义中的一个形参

def describe_pet(animal_type,pet_name):
	print("My," + animal_type+"'s name is") + pet_name.title() + "."
调用函数时:
describe_pet('hamster','harry')

注:①可循环多次调用
②位置实参的顺序很重要,不要乱赋值
比如上述函数调用describe_pet(‘harry’,‘hamster’)会导致宠物的种类和名字颠倒。

94.关键字实参

直接在调用函数时使用如下格式:

describe_pet(animal_type = 'hamster',pet_name = 'harry')

注:使用关键字实参时,务必准确地指定函数定义中的形参名

95.默认值

在定义函数中可对函数赋初始值

def describe_pet(pet_name,animal_type = 'dog'):

注:在使用默认值时,在形参中必须先列出没有默认值的形参,再列出有默认值的实参。这让Python依然能够正确的解读位置实参

96.等效的函数调用

有如下定义函数

def describe_pet(pet_name,animal_type = 'dog'):
	xxxx

调用时可采用多种形式

describe_pet('willie')
describe_pet(pet_name = 'willie')
describe_pet('willie','hamster')
describe_pet(pet_name = 'willie',animal_type = 'hamster')
describe_pet(animal_type = 'hamster',pet_name = 'willie')

注:使用哪种调用方式无关紧要,只要函数调用能生成你希望的输出就行,使用对你来说最容易理解的调用方式即可。

97.避免实参错误

带有实参的函数,如果在调用时不指定实参,系统会反馈错误信息
错误如下:

Traceback(most recent call last):
	File "pets.dog", line 6, in <module>
		describe_pet()
TypeError: describe_pet() missing 2 required positional arguments: 'animal_type' and 'pet_name'

98.返回值

通过return语句将值返回到调用函数的代码行
返回简单行

def xx(a,b):
	语句1
	return 2
print(xx(a,b))
输出 2

99.让实参变成可选的

通过对某个参数赋默认值

100.返回字典

函数可返回任何类型的值

def build_person(first_name,last_name):
	person = {'first':first_name,'last':last_name}
	return person

101.结合使用函数和while循环

一个无限循环的例子

def get_formatted_name(first_name,last_name):
	full_name = first_name + '' + last_name
	return full_name.title()
while True:
	print("\n Please tell me your name: ")
	f_name = input("First name: ")
	l_name = input("Last name: ")
	formatted_name = get_formatted_name(f_name,l_name)
	print("\n Hello," + "my heart" formatted + "!")

102.传递列表

将列表设为形参,然后通过for循环引用和输出

def greet_users(names):
	for name in names:
	msg = "Hello," + name.title() + "!"
	print(msg)
调用:
usernames = ['hannah','try','margot']
greet_users(usernames)

103.在函数中修改列表

函数传参配合.append()生成列表

104.禁止函数修改列表

可通过中间变量的形式,使用切片表示法创建一个列表的副本,通过函数修改副本的列表,这样可以有效的防止列表被修改

function_name(list_name[:])

切片表示法[:]创建列表的副本function_name以完成列表的修改
注:虽然向函数传递列表的副本可保留原始列表的内容,但除非有充分的理由需要传递副本,否则还是应该将原始列表传递给函数,因为让函数使用现成的列表可避免花时间和内存创建副本,从而提高效率,在处理大型列表时尤其如此。

105.传递任意数量的实参–>通过指针实现

def make_pizza(*toppings):
	print(toppings)
调用:
make_pizza('pepperoni')
make_pizza('mushrooms','green peppers','extra cheese')
结果:
('pepperoni')
('mushrooms','green peppers','extra cheese')

106.结合使用位置实参和任意数量实参

注:必须要将准备接纳任意数量实参的形参放在最后

def make_pizza(size,*toppings):
	print("\n Making a " + str(size) + ...)
	for topping in toppings:
		print("-" + topping)
调用:
make_pizza(16,'pepperoni')
make_pizza(12,'mushrooms','green peppers','extra cheese')

107.使用任意数量的关键字实参

def bulid_profile(first,last,**user_info):
	profile = {}
	profile['first_name'] = first
	profile['last_name'] = last
	for key,value in user_info.items():
		profile[key] = value
	return profile
调用:
user_profile = build_profile('albert','einstein',location = 'princeton',field = 'physics')
print(user_profile)

108.将函数存储在模块中

通过import语句引入文件,进而引入函数

109.导入整个模块

假设要导入的文件:设置名字pizza.py

def make_pizza(size,*toppings):
	print("\n Making a" + str(size) + "_inch pizza with the following toppings:")
	for topping in toppings:
		print("-" + topping)

主文件:making_pizzas.py

import pizza
pizza.make_pizza(16,'pepperoni')

110.导入特定的函数

格式:

from module_name import function_name
或
from module_name import function_name,function_name1

例:

from pizza import make_pizza
make.pizza(16,'pepperoni')

111.使用as给函数指定别名

例:

from pizza import make_pizza as mp
mp(16,'pepperoni')import cv2 as cv

112.导入模块中的所有函数

使用星号(*)运算符可让Python导入模块中的所有函数

from pizza import *

113.函数编写指南

描述性名称尽量有意义,漂亮,PEP8

小结

在本章中,你学习了:如何编写函数,以及如何传递参数,让函数能够访问完成其工作所需的信息;如何使用位置参数和关键字实参,以及如何接收任意数量的实参;显示输出的函数和返回值的函数;如何将函数同列表、字典、if语句和while循环结合起来使用,你还知道了如何将函数存储在被称为模块的独立文件中,让程序文件更简单,更易于理解。最后,你学习了函数编写指南,遵循这些指南可让程序始终结构良好,并对你和其他人来说易于阅读。
程序员的目标之一是,编写简单的代码来完成任务,而函数有助于你实现这样的目标,他们让你编写好代码块并确定其能够正确运行后,就可置之不理。确定函数能够正确地完成其工作后,你就可以接着投身于下一个编码任务。
函数让你编写代码一次后,想重用他们多少次就重用多少次。需要运行函数中的代码时,只需编写一行函数调用代码,就可让函数完成其工作,需要修改函数的行为时,只需修改一个代码块,而所做的修改将影响调用这个函数的每个地方。
使用函数让程序更容易阅读,而良好的函数名概述了程序各个部分的作用,相对于阅读一系列的代码块,阅读一系列函数调用让你能够更快地明白程序的作用。
函数还让代码更容易测试和调试。如果程序使用一系列的函数来完成其任务。而其中的每个函数都完成一项具体的工作,测试和维护起来将容易得多:你可编写分别调用每个函数的程序,并测试每个函数是否在它可能遇到的各种情形下都能正确地运行。经过这样的测试后你就能信心满满。深信你每次调用这些函数时,它们都将正确地运行。
在第九章,你将学习编写类。类将函数和数据整洁地封装起来,让你能够灵活而高效地使用它们。

第九章 类

面向对象编程是最有效的软件编写方法。
类–>一类–>每个对象都自动具备这种通用行为
创建和使用类

114.创建Dog类

样式:

dog.py
class Dog():
	def_init_(self,name,age):
		self.name = name
		self.age = age
	def sit(self):
		print(self.name.title() + "is now sitting")
	def roll_over(self):
		print(self.name.title() + "rolled over!")

115.方法_init()

包含三个形参:self、name和age
创建类时只需给最后两个形参(name和age)提供值。
前缀self的变量可供类中的所有方法使用。
可供通过类的任何实例来访问这些变量。

116.根据类创建实例

直接调用

my_dog = Dog('xx',6)

117.调用方法

my_dog.sit()

118.调用属性

my_dog.name()

119.创建多个实例

my_dog = Dog('xx',6)
your_dog = Dog('xxx',7)
my_dog.sit()
your_dog.sit()

120.使用类和实例

同上

121.给属性指定默认值

在类中设置参数时,对某一个参数直接赋值

class car()
	def _init_(self,make,model,year):
		self.make = make
		self.model =  model
		self.year = year
		self.odometer_reading = 0

122.修改属性的值——先调用在修改

my_car = car('audi','a8',2018)
my_car.odometer_reading = 23

123.通过方法修改属性的值

如果有替你更新属性的方法,将大有裨益

class car():
	def update_odometer(self,mileage):
		self.odometer_reading = mileage
调用时直接
my_new_car.update_odometer(23)

124.继承

子类继承父类的所有属性和方法
同时还可以定义自己的属性和方法
主要通过super.init(make,model,year)

class car(): 父类
	def _init_(self,make,model,year):
		self.make = make
		self.model = model
		self.year = year
		self.odometer_reading = 0
class ElectricCar(car) 子类
	def _init_(self,make,model,year):
		super()._init_(make,model,year)
		self.battery_size = 70 给子类定义属性
	def describe_battery(self):  给子类定义方法
		print("xx")
	def fill_gas_tank():    重写父类的方法致使父类方法被替换
		print("xx")

125.将实例用作属性

类中调用类

class Battery(): 
	def _init_(self,battery_size = 70):
		self.battery_size = battery_size
	def describe_battery(self):
		print("xx")
class ElectricCar(car)
	def _init_(self,make,model,year):
		super()._init_(make,model,year)
		self.battery = Battery()

调用:

my_tesla = ElectricCar('tesla','model s',2016)
my_tesla.battery.describe_battery()

126.导入类

from car import Car 直接将类导入

在一个文件中还可存储多个类,且可以导入

127.导入整个模块——直接导入文件名

import car

128.导入模块中的所有类

from module_name import *

注:一般不推荐这种导入方式
首先,其他的导入方式可以直接看出程序使用了哪些类
其次,可能会名称冲突

129.在一个模块中导入另一个模块

本质就是互相调用

130.Python标准库

collections中的一个类——OrderedDict

from collections import OrderedDict
favorite_languages = OrderedDict()
favorite_languages['jen'] = 'Pythoon'

131.类编码风格

类名应采用驼峰命名法,即类名中的每个单词的首字母都大写,而不使用下划线。
实例名和模块名都采用小写格式,并在单词之间加上下划线。
每个类后面包含一个文档字符串,用来描述这个类是用于做什么的。
可使用空行来组织代码,但不要滥用。
类中,一个空行分隔方法
模块中,两个空行来分隔类
需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import语句。再添加一个空行,然后编写导入你自己编写的模块的import语句,在包含多条import语句的程序中,这种做法让人更容易明白程序使用的各个模块都来自何方。

小结

在本章中,你学习了:如何编写类;如何使用属性在类中存储信息,以及如何编写方法,以让类具备所需的行为;如何编写方法_init_(),以便根据类创建包含所需属性的实例。你见识了如何修改实例的属性——包括直接修改以及通过方法进行修改。你还了解了使用继承可简化相关类的创建工作;将一个类的实例用作另一个类的属性可让类更简洁。
你了解,通过将类存储在模块中,并在需要使用这些类的文件中导入它们,可让项目组织有序。你学习了Python标准库,并见识了一个使用模块collections中的OrderedDict类的示例。最后,你学习了编写类时应遵循的Python约定。
在第十章中,你将学习如何使用文件,这让你能够保存你在程序中的工作,以及你让用户做的工作。你还将学习一场,这是一种特殊的Python类,用于帮助你在发生错误时采取相应的措施

第十章 文件和异常

从文件种读取数据

132.读取整个文本

with open('pi_digits.txt') as file_object:
	contents = file_object.read()
	print(contents)

with的使用可以保证文件在不需要访问时关闭,如果使用open()、close()可能会导致bug或数据损坏。read()函数为读取文本函数。
注:read()读取时可能会有空白行,可用rstrip()删除

133.文件路径

Python查找文件时是在当前Python文件的文件夹下查找的,若同级目录下有其他文件夹可间接访问。例如,相对路径

with open('text_files/filename.txt') as file_object:

文件目录格式
Python_work——python.py
——text_files——filename.txt
以上是Linux/OsX系统
若windows则需用反斜杠(\)而不是斜杠(/)

with open('text_files\filename.txt') as file_object:

另外,还可以使用绝对路径(较长)

file_path = '/home/ehmatthes/other_files/filename.txt'
with open(file_path) as file_object:

134.逐行读取

filename = 'pi_digits.txt'
with open(filename) as file_object:
	for line in file_object: 按行读取
		print(line)

这种方式可以方便我们查找、修改某些信息。

135.创建一个包含文件各行内容的列表

with open(filename) as file_object:
	lines = file_object.readlines()

通过readlines函数读取了文件

136.使用文件的内容

直接调用文件读取时赋值的变量即可

with open(filename) as file_object:
	lines = file_object.readlines()
pi_string = ''
for line in lines:
	pi_string += line.strip()

注:读取文本时,所有文本都为字符串。如果要调用数字,并将其作为数值使用,必须要用int/float()转化。

137.包含一百万位的大型文件

Python可处理的数据量,没有任何限制,只要系统内存足够多。

138.写入空文件

filename = 'programming.txt'
with open(filename,'w') as file_object:
	file_object.write("I love you.")

open(filename,‘w’) 第二个参数为写入模式
'r’读取模式
'w’写入模式
'a’附加模式
'r+'读取和写入模式
文件.write() 写入文本
注:Python只能将字符串写入文本文件。
要将数值数据存储到文本文件中。
必须先使用函数str()将其转换为字符串格式

139.写入多行

write()函数不会自动在文本末尾添加换行符,因此如果想在写入的文本中添加换行的文本,需自己添加换行符"\n"

140.附加到文件

with open(filename,'a') as file_object:
	file_object.write("I love you.")

141.异常

可以修改Python所报的异常,显示你编写的友好的错误信息,而不是令用户迷惑的traceback

142.处理ZeroDivisionError异常

使用try-except代码块

try:
	print(5/0)
except ZeroDivisionError:
	print("You can't divide by zero!")

143.使用异常避免崩溃

使用else代码块

print("Give me two numbers,and I'll divide them.")
print("Enter 'q' to quit.")
while True:
	first_number = input("\n First number: ")
	if first_number == 'q':
		break
	second_number = input("Second number: ")
try:    防止出错
	answer = int(first_number)/int(second_number)
except ZeroDivisionError:
	print("You can't divide by zero!")
else:   输出结果
	print(answer)    

try-except-else代码块的工作原理:
Python尝试执行try代码块中的代码;只有可能引发异常的代码才需要放在try语句中。有一些仅在try代码成功执行时才需要执行的代码被放在else代码块中,except则是发生异常时该怎么办

144.处理FileNot Found Error异常

文件找不到的错误

try:
	with open(filename) as f_obj:
		xx = f_obj.read()
except FileNotFoundError:
	print("xxx")

145.分析文本

split()函数,以空格为分隔符将字符串分拆成多个部分

146.失败时不提示信息

try:
	--XX
except FileNotFoundError:
	pass
else:
	--xx
	print("xxx")

147.存储数据

json模块存储数据
JSON格式最初是JavaScript开发的,但随后成了一种常见格式,被包括Python在内的众多语言采用

148.json.dump()和json.load()存储和加载

json.dump()两个形参,第一个为存储的数据,第二个为要存储的文件

import json
numbers = [2,3,5,7,11,13]
filename = 'numbers.json'
with open(filename,'w') as f_obj:
	json.dump(numbers,f_obj)

注:需引入json模块
json.load加载文件

import json
filename = 'numbers.json'
filename = 'numbers.json'
with open(filename) as f_obj:
	numbers = json.load(f_obj)
print(numbers)

注:json.load()只有一个形参,即文件名

149.保存和读取用户生成的数据

json.dump()和json.load()的使用

150.重构

就是将每一个功能用一个函数表示,模块化编程

小结

在本章中,你学习了:如何使用文件;如何一次性读取整个文件,以及如何每次一行的方式读取文件的内容;如何写入文件,以及如何将文本附加到文件末尾;什么是异常以及如何处理程序可能引发的异常;如何存储Python数据结构,以保存用户提供的信息,避免用户每次运行程序时都需要重新提供。
在第十一章中,你将学习高效的代码测试方式,这可帮助你确定代码正确无误,以及发现扩展现有程序时可能引入的bug

第十一章 测试代码

使用Python模块unittest工具来测试代码

151.单元测试和测试用例

单元测试用于核实函数的某个方面没有问题;
测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求
全覆盖式测试用例包含一整套单元测试,涵盖了各种可能的函数使用方式

152.可通过的测试

导入unittest,创建继承unittest.TestCase的类编写系列方法,对函数行为的不同方面进行测试

import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
	def test_first_last_name(self):
		formatted_name = get_formatted_name('janis','joplin')
		self.assertEqual(formatted_name,'Janis Joplin')
unittest.main()

在此,①我们导入了模块unittest和要测试的函数get_formatted_name()
②创建了一个名为NamesTestCase的类,用于单元测试且该类要继承unittest.TestCase类
③在运行时,所有以test_打头的方法都将自动运行
④使用了unittest类的一个功能,一个断言方法assertEqual()即,如果结果正确,万事大吉,否则跟我说一声。

153.测试不通过

报错如下:

E
ERROR:test_first_last_name(_main_.NamesTestCase)
Traceback(most recent call last):
	File "test_name_function.py",line 8,in test_first_last_name
		formatted_name = get_formatted_name('jains','joplin')
TypeError:get_formatted_name() missing 1 required positional argument:'last'
Ran 1 test in 0.000s
FAILED(errors = 1)

154.添加新测试

直接在类中添加函数(包含assertEqual())即可
测试类
如果类测试通过,就能确信对类所做的改进没有意外地破坏其原有的行为

155.各种断言方法

Python在unittest.TestCase类中提供了很多断言方法。
常见如下

1.assertEqual(a,b)       核实a=b
2.assertNotEqual(a,b)    核实a!=b
3.assertTrue(x)          核实x为True
4.assertFalse(x) 	     核实x为False
5.assertIn(item,list)    核实item在list中
6.assertNotIn(item,list) 核实item不在list中 

156.一个要测试的类

格式:

import unittest
from survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase):
	def test_store_single_response(self):
		--snip--
		self.assertIn('English',my_survey.responses)
unittest.main()

157.方法SetUp()

通过SetUp创建调查对象和一组答案,供使用的测试方法使用。

import unittest
from survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase):
	def SetUp(self):
		question = "What language did you first learn to speak?"
		self.my.survey = AnonymousSurvey(question)
		self.responses = ['English','Spanish','Mandarin']
	def test_store_single_response(self):
		--snip--
		self.assertIn('English',my_survey.responses)
unittest.main()

注:运行测试用例时,没完成一个单元测试,Python都打印一个字符:测试通过时打印一个句点;测试引发错误时打印一个E;测试导致断言失败时打印一个F。这就是你运行测试用例时,在输出的第一行中看到的句点和字符数量各不相同的原图。如果测试用例包含很多单元测试,需要运行很长时间,就可通过观察这些结果获悉有多少个测试通过。

小结

在本章中,你学习了:如何使用模块unittest中的工具来为函数和类编写测试;如何编写继承unittest.TestCase的类,以及如何编写测试方法,以核实函数和类的行为符合预期;如何使用方法SetUp来根据类高效地创建实例并设置其属性,以便在类的所有测试方法中都可使用它们。

总结

恭喜你成功学习到此,Python的基础知识已经完全学完啦。接下来即将进入实战,祝贺你在学习Python的道路上走了这么远,愿你在以后的学习中有好运相伴!

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值