《Python编程 从入门到实践》第一部分阅读笔记
第一部分 基础知识
第2章 变量和简单数据类型
- 变量名只包含数字、字母和下划线,且只以字母或下划线开头
- 字符串
- 单引号或双引号括起
- 在字符串中包含引号:
'I told my friend, "Python is my favorite language!"'
或"The language 'Python' is named after Monty Python, not the snake."
str.title()
:以首字母大写的方式显示每个单词str.lower()
与str.upper()
+
拼接字符串str.rstrip()
:去除字符串末尾的空白;str.lstrip()
:去除字符串前端的空白;str.strip()
:去除字符串两端的空白
- 数字:整数与浮点数
第3章 列表简介
[]
表示列表,逗号分隔元素list.append()
在列表尾部添加元素list.insert(loca, data)
在列表下标为loca
的位置添加元素data
del list_name[data_index]
:删除列表list_name
中下标为data_index
的数据list.pop(index)
:从列表删除下标为index
的元素,并返回该元素(无参数时为最后一个元素)list.remove(data)
:删除指定值(第一个)并返回该元素list.sort()
:对列表永久性从小到大排序,不需要返回值;反序排序则添加参数reverse=True
sorted()
:对列表临时排序list.reverse()
:列表反序
第4章 操作列表
range(第一个数,最后一个数,步长)
**
:乘方运算- 切片:
[0:3]
:前3个数据[3:]
:第四个元素到列表末尾[-3:]
:最后三个元素- 可用
for
遍历切片列表 food = food_[:]
:实现列表复制,得到两个列表
- 元组
- 可用索引访问元素
- 不能修改元组元素
第5章 if语句
第6章 字典
6.2 使用字典
一系列键值对,任何对象都可作为值
添加键值对/修改值:
alien_0['x_position'] = 0
空字典:
alien_0 = {}
删除键值对:
del alien_0['points']
最后一个键值对后面可以添加逗号,以便在下一行添加新的键值对
1
2
3
4
5
6favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
6.3 遍历字典
代码:
1
2
3
4
5
6for key, value in user_0.items(): # 键—值对的返回顺序与存储顺序不同
pass
for name in favorite_languages.keys(): # 遍历字典中的所有键,keys()返回一个列表
pass
for language in favorite_languages.values(): # 遍历字典中的所有值
pass
6.4 嵌套
- 字典组成的列表,每个字典代表一个具有较多属性的对象(类似于C++的结构体)
- 字典中存储列表
- 字典中嵌套字典
第7章 用户输入与while
input()
让程序暂停运行,等待用户输入一些文本,回车后返回字符串
第8章 函数
- 使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的实参
- 给实参设定默认值为空字符串,则可在调用时只在必要才提供额外信息
- 列表传入函数后,函数对列表的修改是永久性的。如果只想传入副本而非引用,则调用时的参数为
list_name[:]
,创建函数的副本 - 传递任意数目的实参
- 函数定义时的参数为:
def make_pizza(*names):
,则所有传入的参数被放到空元组names
中。此参数要定义在函数参数列表最后 - 参数为
**names
:传入的参数被放到空字典names
中
- 函数定义时的参数为:
import
、from import
、以及as
从其他模块导入函数或指定别名- 指定参数默认值时,等号两边不用空格;指定关键词传递参数时,等号两边不用空格
第9章 类
- 类名通常为驼峰命名
- 先导入标准库,再空行并导入自己的标准库
- 类中用一个空行分隔函数
9.1 创建和使用类
代码
1
2
3
4
5
6class Dog()
def __int__(self, name, age):
self.name = name
self.age = age
def sit(self):
pass__init__()
:- 创建新的实例时都会调用
- 每个与类关联的方法都会自动传递实参
self
,为指向实例本身的引用,使实例能访问类中的属性与方法 - 以
self
为前缀的变量可供类中的所有方法使用,还可通过类的所有实例来访问这些变量
句点法访问实例的属性、调用方法
9.2 使用类和实例
- 类中的每个属性都必须有初始值,即使是0或空串
- 可以不在
__init__()
中指定初始值,即实例化时不提供形式参数 - 可以通过句点法直接修改实例的属性,
dog.age = 18
;或实现一个函数,通过函数调用更新
9.3 继承
代码:
1
2
3class ElectricCar(Car):
def __init__(self, make, model, year):
super().__init__(make, model, year)子类
__init__()
- 子类需要初始化父类的属性
gitsuper()
将父类与子类关联起来,让子类实例包含父类所有属性
重写父类方法:与父类方法同名即可
实例可作为另一个类的属性,如
self.battery = Battery()
9.4 导入类
- 导入单个类:创建只包含一个类
Car
的模块car.py
,之后在另一个文件中from car import Car
- 导入多个类:同上,指明导入的类名即可,逗号分隔类名
from car import Car, ElectricCar
- 导入所有类:
from module_name import *
,不推荐这一方法
9.5 Python标准库:OrderedDict
从
collections
中导入,其实例同字典几乎相同,区别只在于记录了键值对的添加顺序,具有列表和字典的主要优点代码:
1
2
3
4
5
6
7
8
9
10
11from collections import OrderedDict
favorite_languages = OrderedDict()
favorite_languages['jen'] = 'python'
favorite_languages['sarah'] = 'c'
favorite_languages['edward'] = 'ruby'
favorite_languages['phil'] = 'python'
for name, language in favorite_languages.items():
print(name.title() + "'s favorite language is " +
language.title() + ".")
第10章 文件和异常
10.1 文件中读取数据
读取整个文件:
1
2
3with open('pi_digits.txt') as file_object: # with在不再需要访问文件后将其关闭
contents = file_object.read() # 读取文件的全部内容,返回文本的字符串
print(contents.rstrip()) # read()到达文件末尾时返回一个空字符串,即打印后多出一个空行。因此用rstrip()去除尾部多余的空行相对路径、绝对路径
- windows系统中为反斜杠
- Linux中为正斜杠
逐行读取
1
2
3with open('pi_digits.txt') as file_object: # with在不再需要访问文件后将其关闭
for line in file_object: # 读取文件的全部内容,返回文本的字符串
print(line.rstrip()) # 每行末尾都有两个换行符,一个来自文件,一个来自print语句,因此需要rstrip()去除多余的换行列表:
readlines()
,在with
外也可使用此语句,且存储为每一行的内容(不包含换行符)
10.2 写入文件
写入文件,代码:
1
2with open(filename, 'w') as file_object:
file_object.write("I love programming.")附加到文件尾,模式为
'a'
10.3 异常
代码:
1
2
3
4
5
6try:
answer = a/b
except ZeroDivisionError:
print("You can't divide by zero!")
else: # 依赖于try代码块成功执行的代码都应放到else代码块中
print(answer)其他常见异常:
FileNotFoundError
只要程序依赖于外部因素,如用户输入、存在指定的文件、有网络链接,就有可能出现异常
10.4 存储数据——json
json.dump()
的参数:要存储的数据以及可用于存储数据的文件对象;json.load()
的参数:读取的文件对象1
2
3
4with open(filename, 'w') as f_obj:
json.dump(numbers, f_obj) # 存储
with open(filename) as f_obj:
numbers = json.load(f_obj) # 读取
第11章 测试代码
11.1 测试函数
模块
unittest
提供了代码测试工具单元测试用于核实函数的某个方面没有问题;测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求
函数名必须以test_打头,且由自动调用,不用编写调用它们的代码
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13# 导入模块unittest和要测试的函数get_formatted_ name()
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase): # 用于包含一系列针对get_formatted_name()的单元测试
def test_first_last_name(self):
formatted_name = get_formatted_name('janis', 'joplin')
self.assertEqual(formatted_name, 'Janis Joplin') # 一个断言方法,核实得到的结果是否与期望的结果一致
def test_first_last_middle_name(self):
formatted_name = get_formatted_name('wolfgang', 'mozart', 'amadeus')
self.assertEqual(formatted_name, 'Wolfgang Amadeus Mozart')
unittest.main()
11.2 测试类
常见的断言方法:
1
2
3
4
5
6assertEqual(a, b) # 核实a == b
assertNotEqual(a, b) # 核实a != b
assertTrue(x) # 核实x为True
assertFalse(x) # 核实x为False
assertIn(item, list) # 核实item在list中
assertNotIn(item, list) # 核实item不在list中