Python编程–从入门到实践(第一部分)
第一章 数据类型
字符串
- 用引号括起来的都是字符串(单引号/双引号都可)
字符串中可以包含引号
正确使用单、双引号
单引号应该位于两个双引号之间
string的函数
- 大小写有关
- title() : 首字母大写的方式显示每个单词
- upper()
- lower()
- 合并(拼接)
- ‘+’ 可以实现拼接字符串
- 空白/换行
增加空白
- 字符串中使用制表符 \n \t
删除多余的空白
- rstip() 删除字符串末尾的空白
- lstrip() 删除字符串开头的空白
- strip()同时删除开头和结尾的空白
- 分隔
- split() 以空格为分隔符将字符串分拆成多个部分,返回一个列表
数字类型
整型
- 可执行加减乘除运算
- 特殊的 ******表示乘方运算
- // 表示整除
浮点型
注意:由于计算机内部存储浮点数的方式,导致存储一个确定的浮点数 只会 无限的接近 。
类型转换
函数str() 会让Python将非字符串值表示为字符串
int()可以将字符串转化成int
float()同上
第二章 列表
基本操作
索引
- 下标从 0 开始
- 索引 [ - 1] 表示最后一个元素, -2 就表示倒数第2个
列表的状态都是动态的,可以增加 和 删除 、改
增删
- append()函数添加新元素到尾部
- insert(index, ‘’)添加元素到索引index(0-max)前面 就是代替list[index] 后面的后移一位
根据索引删除 - pop()弹出列表末尾的元素并返回
- pop(index)弹出指定索引的元素,并返回
- del list[key] 注:没有括号 根据 列表[索引]指定删除哪一个 。特点是 删除了 且 得不到其元素
根据值来删除 - remove(value)只删除第一个指定的值,
组织列表-排序
按字母顺序组织
sort()
对列表按字母顺序进行永久排序
列表只能包含同种类型数据才可以排序,不可以数字+ str
sort函数可以通过传递参数设置排序顺序 比如: reverse=True 则按逆序进行排序sorted()
对列表进行临时排序
列表元素保留原来的排序顺序,显示的时候以特定顺序显示
使用方法为:sorted(list)
也可以传递参数sorted(list,reverse=True)
对元素反转
-
reverse()
永久性的修改列表的排列顺序,还可以随时恢复原来状态
列表长度
len(list)
操作列表
遍历列表
for-in
循环遍历 遍历结束的时候 终值还保存在变量中- python解释器按缩进判断是否同属一个循环,因此不合适的缩进会造成错误
数值列表
- range(1,5)函数 实际会生成1-4的数字,差一问题的出现
返回的是range类, 可以通过list(range())
函数转换成数值列表
- range(start,end,步长)可以指定步长,
- min、max、sum 对数值列表进行统计计算。
min(list)
列表解析⚑
生成列表的时候,一般先创建一个空的列表,for-in循环加入值,可以二者合一生成列表
square = [ a**2 for a in range(1,10) ]
使用部分列表-切片
切片可以访问列表的部分值 list[start,end]
和range()一样存在差一现象
适用于
- 复制列表
- 整个列表 :
a=b[:]
如果简单的a=b
这两个变量都指向同一个列表,造成对某一个列表修改其元素,另一个的也会修改,因为都是指向的同一个列表
元组 tuple
列表适合存储程序运行期间可能变化的数据集,是动态可修改的。而元组可以实现创建一系列不可修改的元素的列表,存储的一组值在程序的整个运行周期内都不可变。
- 定义:dimensions = (1,2,3)
- 元组的元素不可修改
但是可以创建同名元组变量进行重新赋值
Python代码格式设置指南
PEP-8 标准
缩进等规则
第三章 if
检查是否相等
- 比如网站用户搜索的时候 需要对其键入的搜索值转换成
lower()
小写之后和库的内容进行比对(而库里统一存储小写标题等信息) - 使用 ==
- 检查不等 !=
检查多个条件
- 与 and
- 或 or
- 非 !
- in 是否在列表中
- not in
与列表结合
- 判断列表是否为空
if list:将列表名放在条件表达式中,当列表至少包含一个元素的时候返回真
第四章 字典
字典是一种动态结构,可以随时添加键值对。
访问
- 通过key 访问value
添加键值对
直接给一个新的键 赋 值即可, 添加之后的键值对顺序与排列顺序并不相同,Python只关心键与值的对应关系
创建字典,一般先创建一个空字典,然后再通过上面的方法进行一个一个添加
删除键值对
- del a[‘key’] 将key 彻底删除 键 与 值
字典遍历
for k, v in dic.items():
print('key: ' + key)
print('value' + value)
items()
返回键值对列表 , 将每个键值对存储到两个不同的变量中。
>>> dic.items()
dict_items([('name', 'Foubaby'), ('year', 18)])
遍历字典的时候,键值对的返回顺序也和存储顺序不是一样的,
keys()
返回字典的键的列表
也可以直接对字典名进行遍历, 默认也是遍历键
因为字典总是关注键与值之间的对应关系,而不关注元素按什么顺序存储的,因此遍历得到的元素顺序不一定和存储的顺序一样
- 怎么按序进行遍历字典项呢?-- 有序字典 OrderedDict
使用标准库 collections 中的 类 OrderedDict 创建此字典实例
from collections import OrderedDict
dic = OrderedDict()
- 按序遍历字典的键
for name in sorted(dic.keys()):
...
values()
遍历得到所有的值 的 列表 不包含任何键
只取字典的值的话 会有很多重复值,要想去重操作
集合
提取一个字典中不同的值
- 使用
set()
将得到的列表转换成集合
集合里的元素每一个都是独一无二的
嵌套
字典 与 列表 相互嵌套
- 字典中一个键 关联多个值的时候 就需要使用 列表作为value
第五章 while 和 用户输入
获取输入
input()
等待用户输入,并在按回车之后继续运行。
默认将用户输入转化成字符串int()
获取数值输入
将input()返回的变量用int()转换格式,int(input())
while
- 使用标志
active = True 通过不同条件修改active属性值,while(active) - break
- continue
- 删除列表中指定值的项
while 'cat' in list:
...
- 判断列表是否空
while list_name:
...
第六章 函数
定义
def
关键字
实参 && 形参
实参传递值赋给形参, 是简单的浅拷贝
实参的对应
位置实参
- 按顺序将函数调用中的实参关联到函数定义中的形参
- 实参顺序严格一致
def animal(type, name):
animal('dog', 'Palu')
关键字实参
- 进行函数调用的时候明确指出实参对应的形参
- 关键字实参的顺序不重要
- 务必准确的指定形参名
def animal(type, name):
animal(type= 'dog', name= 'Palu')
默认形参
- 形参没有对应实参的时候,采用默认值
def ani(petname, anitype='dog'):
print(petname + anitype)
带默认值的形参要放在参数列表的最后面,为了在调用的时候位置实参对应的都是前面的无默认值实参,对位置实参进行正确解读。
- 通过设置默认形参为空,实现实参的可选,用户没有输入任何值的时候调用默认值空。
返回值
函数可以返回任意类型的值,包括字典、列表等复杂结构,传递和都是通过对象名
返回字典
通过return dic
传递列表
将列表作为实参进行传递给形参属于深拷贝,在函数里修改形参元素,实参的元素也随之修改。如果不想修改实参的值,可以使用切换传递实参a[:] 实际上只是传递了一个副本
缺点: 会产生时间和内存开销去保存副本
传递任意数量的实参⚑
实现接收不同数量的实参
- 函数的形参设置为:
def func(*arg)
*arg
的* 表示创建名为arg 的空元组,实参传来的所有值都封装到这个元组
同时使用位置实参和任意数量实参
如果函数要接受不同类型的实参,需要将接受任意数量实参的形参(*arg)放在形参列表的最后。先匹配位置实参和关键字实参,余下的实参都传递给最后一个形参中。
def func(size, *arg):
...
func(12,'a','b','c')
使用任意数量的关键字实参⚑
实现接收多个类型的实参
def func(first, last, **user_info):
''' user_info 是一个字典 '''
...
func('wang','sun', old = 19, like = 'music')
形参**user_info
**的两个星号表示创建一个空字典
函数存储到模块中 ⚑
- 导入整个模块
模块就是扩展名为.py的文件 比如test.py
有一个函数func()
import test
test.func()
实际上是Python将test.py的全部函数复制到当前程序中,便可以使用test.py中定义的全部函数。
- 导入特定的函数
from test import func
func()
- 使用as给函数或模块重命名
from module_name import function_name as fn
import module_name as mn
- 导入模块中所有函数
from test import *
func()
注意: 使用不是自己编写的大型模块的时候,最好不要使用这种方法,防止模块中有的函数名称和自己定义的函数名称相同,会导致覆盖函数的错误。
最佳的做法: 要么导入整个模块,使用句点符进行调用函数,要么只导入需要的函数。
函数编写指南
- 函数名使用小写字符和下划线隔开
- 函数下面要有文档字符串
def get_name(object):
""" 得到对象的名字 """
- 形参指定默认值和函数调用关键字实参的时候,等号两边不要有空格
- 函数与函数之间用两行空格隔开
第七章 类
类的创建
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
def sit(self):
print(self.title() + 'is now sitting. ')
def roll_over(self):
print(self.name.title() + 'is rolling over. ')
- init ()方法
是一个特殊的方法,创建Dog类的实例的时候,自动运行它
形参 self 必要的,需要在name,age前面, 调用此方法的时候自动传入实参self, 每个与类相关联的方法调用都自动传递实参self , 是一个指向实例本身的引用 , 让实例可以访问类中的属性和方法。
没有显示的包含return 语句,但是返回创建的类的实例 - 类每个方法如果要使用类的属性,也要设置第一个形参为self
- 给属性设置默认初始值
就不用在__ init __ 函数的参数中设置此形参
def __init__(self, name):
self.name = name
self.age = 20
- 修改属性的值
- 直接通过实例的访问来修改 .age = 18
- 通过方法修改属性的值
类的继承
一个类继承另一个类的时候,自动获得另一个类的所有属性和方法。
- 创建
class Little_Dog(Dog):
def __init__(self, name, age, color):
super().__init__(name, age)
self.color = color
- 父类代码需要在子类代码的前面
- 重写父类的方法
子类的实例调用此方法将忽略父类的此方法。 - 类的实例作为类属性
导入类⚑
将类存储在模块中,主程序中导入这个模块
- 多个相关的类可以存储在一个模块中,
from car import Car, ElectricCar
- 导入整个模块
import car
car.Car('', '')
- 在一个模块中导入另一个模块的类
Python标准库
标准库就是一组模块,Python默认安装的,比如
可以下载外部模块。命令行下通过 pip install module_name 进行需要的库的安装
类编写风格指南
- 类名采用驼峰命名法,单词的首字母大写,不采用下划线
- 实例名和模块名采用小写的方式,单词之间加上下划线。
- 类定义后面跟一个文档字符串,描述类的相关信息
- 模块也应该包含文档字符串
- 类中使用一个空行分隔方法,模块中使用两个空行分隔类
- 同时导入标准库和自己编写模块的import语句时:先导入标准库, 再导入自己写的模块的类/方法,中间用空格隔开
第八章 文件和异常
文件中读取数据
要使用文本文件中的信息,首先要将信息读进内存中。可以一次性读取全部内容 或者 每次一行的方式进行读取。
读取整个文件
with open('xx.txt') as file_object:
contents = file_object.read()
...
-
open()
函数做了大部分工作,要使用文件 必须 打开再读取。返回一个表示文件的对象。
默认从当前程序的所在目录下寻找此文件,可以指定文件路径
- 相对路径:
with open('test/xx.txt')
或者
with open('test\xx.txt')
从当前程序的目录下的test字文件夹寻找文件
- 绝对路径
详细路径 ‘C:Users\ …’ - 按照标准: 我们需要在with 中对打开的文件进行 关闭 通过
close()
但是close()时机的不适当 或者 由于bug未调用 close()会导致数据丢失 或 受损
所以,只管用with open打开文件, python会在合适的时候自动关闭文件 read()
函数读取文件的全部内容
read()读取的内容到达文件末尾的时候会返回一个空字符串,显示出来就是一个空行,删除可以通过rstrip()
i
逐行读取
with open(filename) as file:
for line in file:
...
问题: 在打印输出的时候,每输出一行,就多一行空白行,因为每行的末尾都有一个看不见的换行符,而且print()
语句也会加上一个换行符,因此每行末尾有两个换行符。
怎么消除呢?
通过print(line.rstrip())
函数
创建包含文件各行内容的列表
可以将文件内容存储在一个列表中,这样with 代码块外部也可以用这个文件内容
file_object.readlines()
for line in lines:
...
with 代码块外面可以访问文件内容。
文件内容使用
上面open是将文件内容读入内存,之后就可以进行各种操作了
读取文件的时候,python将其中所有文本解读为字符串,进行别用的话需要进行数值类型转换。
读取文件的时候,如果文本文档中包含中文,而代码报错显示
‘gbk’ codec can’t decode byte 0x97 in position 0: incomplete multibyte sequence
是编码的问题,可以采用
-
with open('test.txt', encoding='UTF-8') as file:
来打开文件
写入文件
要实现文本写入,调用open()
函数的时候需要提供另一个实参,表明以什么方式打开文件。
open(filename, 'w')
以写入的模式打开这个文件- 其他的
‘r’ 读取模式 ‘a’ 附加模式 'r+ '能够读取+写入
默认以只读的方式打开文件 - 要写入的文件不存在,会自动创建此文件
如果已经存在,会在返回文件对象前清空文件。慎用 此模式 因此一般使用’r+' - python 只能将字符串写入文本文件,要将数值写入文本文件,必须先使用函数
str()
将其转换成字符格式 write()
函数不会在写入的文本末尾添加换行符,因此写入多行的时候需要添加换行符
以上方式写入文件都是清空文件原来的内容进行覆盖,或者创建不存在的文件,如何保留原来的内容进行增添呢?
- ‘a’ 的模式 不会在返回文件对象前清空存在的文件内容,文件不存在会创建此文件
- 并且将写入的行添加到文件末尾
异常
python 使用称为 异常的 特殊对象来管理程序运行期间发生的错误,异常通过try - except 代码块处理。
完整的try - except - else 代码块结构
- try
将可能导致错误的代码行 放在try 代码块中 - 如果try中的代码块导致来错误,将查找对应的except代码块,并运行其中的代码, 显示一条友好的错误消息,而不是在终端显示一条 traceback
也可以使用pass
语句 失败时一声不吭 pass充当占位符,表示什么也不做 - else 代码块:
在except 后面添加else 代码块,如果try代码块正确执行,那么转为else
正常执行的主要的函数功能写在 else 代码块中
常见的错误对象 – 异常
- FileNotFoundError 异常 由open()函数导致的
- jZeroDivisionError 异常 由除0 导致的
存储数据 – json
对用户输入的信息,可以通过列表 、字典存储到内存中,但是用户关闭程序就没了,所以需要保存用户输入信息到文件。
可以使用json模块 : 实现简单的数据结构存储到文件中,并且程序再次运行时,加载文件的数据。
Json使用
json.dump(data, file_obj)
参数为 数据结构,以可写方式打开的文件对象。
实现将数据data转存到文件对象 通过文件对象的扩展名是 .json格式的json.load()
数据读取到内存
参数是文件对象
加载存储在.json文件中的信息, 存储的是什么类型的数据就返回什么类型的对象
保存和读取用户生成的数据 - 作为日志文件
- 实现记住用户名称,下次进入程序的时候就可以从文件中读取用户名,并对其发出问候。
第九章 测试
测试函数
**单元测试 和 测试用例 **
- 单元测试: 核实函数的某个方面没有问题
- 测试用例: 是一组单元测试,一起核实函数
怎么进行测试? 使用模块 unittest
- 导入模块unittest 和 测试的函数
- 创建一个继承unittest.TestCase的类,编写一系列的测试方法
import unittest
from name_function import func
class NamesTestCase(unittest.TestCase):
def test_first(self):
...
self.assertEqual(anwser, final)
unittest.main()
- 类名一般要与 测试的函数名有关,并包含Test字样,「必须包含继承 unittest.TestCase」
- 包含的方法名 必须以test_ 打头,运行测试文件时,test_ 方法自动运行。
- 测试结果是否和期望值一样,调用unittest.assertEqual()方法,「断言方法」
- 可以设置多个这样的测试函数实现对函数的多个方面进行测试
- 或者将测试用例存储在列表中,在一个测试函数中通过for循环进行检测
测试类
unittest 的断言方法有很多种
- assertEqual(a,b)
- assertNotEqual(a,b)
- assertTrue(x)
- assertFalse(x)
- assertIn(item, list)
- assertNotIn(item, list)
编写测试类
- 导入 unittest 和 对象类所在模块
- 构建测试类 继承 unittest.TestCase
- 测试方法
- 可以在每一个测试方法中 创建对象类的实例 然后进行测试
- 也可以统一创建1个类的实例对象
SetUp(self)方法
- 将 对象类的实例作为当前测试类的属性
- 设置测试用例的列表 同样作为 测试类的属性
在不同的测试方法中通过属性调用对象实例的方法进行测试
- 最后通过 unittest.main() 启动测试