1. Python概述
1)对象
数据表示为对象:对象本质上是一个内存块,拥有特定的值,支持特定类型的运算操作
Python 3中,一切皆为对象。
每个对象由标识(identity)、类型(type)和值(value)标识
- 标识(identity)用于唯一标识一个对象,通常对应于对象在计算机内存中的位置。使用内置函数id(obj1)可返回对象obj1的标识 通过内置的id()函数,可以获取一个对象唯一的id标识(CPython的实现为内存存放位置)
- 类型(type)用于表示对象所属的数据类型(类),数据类型(类)用于限定对象的取值范围,以及允许执行的处理操作。使用内置函数type(obj1)可以返回对象obj1所属的数据类型 通过内置的type()函数,可以判断一个对象的类型
- 值(value)用于表示对象的数据类型的值。使用内置函数print(obj1)可返回对象obj1的值
2)标识符
标识符的第一个字符必须是字母、下划线(“_”),其后的字符可以是字母、下划线或数字 一些特殊的名称,如if、for等保留关键字,不能作为标识符
注意事项:
(1)Python标识符区分大小写。例如,ABC和abc视为不同的名称
(2)以双下划线开始和结束的名称通常具有特殊的含义。例如,__init__为类的构造函数,一般应避免使用
(3)避免使用Python预定义标识符名作为自定义标识符名。例如:NotImplemented、Ellipsis、int、float、list、str、tuple等
3)关键字
关键字即预定义保留标识符。关键字不能在程序中用作标识符,否则会产生编译错误
4)常量
Python语言不支持常量,即没有语法规则限制改变一个常量的值
Python语言使用约定,声明在程序运行过程中不会改变的变量为常量,通常使用全大写字母(可以使用下划线增加可阅读性)表示常量名
5)Python运算符及其优先级
表达式的组成:操作数、运算符和圆括号按一定规则组成表达式
2. print中的f表示什么?
示例:
字符串格式化
在Python中,f 代表着格式化字符串(Formatted String)。
格式化字符串以字母"f"或"F"作为前缀,后跟一对大括号{},其中可以包含变量名称、表达式或函数调用。
3. 大写字母表示常量
>>> PI = 3.14 #浮点类型常量
• Python 语言使用约定,声明在程序运行过程中不会改变的变量为常量,通常使用 全大写字母 (可以使用下划线增加可阅读性)表示常量名
4.不可变对象和可变对象
不可变对象一旦创建,其值就不能被修改,例如:int、str、complex等
Python对象的可变性取决于其数据类型的设计,即是否允许改变其值
5.可变参数(单星参数和双星参数)
• 在声明函数时,通过 带星的参数 ,如 *param1 ,允许向函数传递 可变数量的实参 。调用函数时,从那一点后所有的参数被收集为一个 元组• 在声明函数时,也可以通过 带双星的参数 ,如 **param2 ,允许向函数传递 可变数量的实参 。调用函数时,从那一点后所有的参数被收集为一个 字典• 带星或双星的参数 必须位于形参列表的最后位置
例子:
def my_function(*args, **kwargs): print("单星参数:", args) # 输出为一个元组 print("双星参数:", kwargs) # 输出为一个字典 # 调用函数
my_function(1, 2, 3, name="Alice", age=30)
输出:
单星参数: (1, 2, 3) #元组形式
双星参数: {'name': 'Alice', 'age': 30} #字典形式:key:value
6.循环结构
1)可迭代对象(iterable)
可迭代对象:一次返回一个元素,适合于循环
2)range对象
range(start, stop[, step])
从start开始,到stop结束(不包含stop)。如果指定了可选的步长step,则序列按步长增长
3)九九乘法表
注意:
str.format("{0:1}*{1:1}={2:<2} ", i, j, i * j)
这里有几个关键点:
-
{0}
,{1}
,{2}
:这些是占位符,用于插入参数到字符串中。数字0
、1
、2
分别对应传递给format
方法的参数列表中的第一个、第二个和第三个参数。 -
:1
:这是一个格式说明符,它指定了字段的最小宽度为1个字符。如果字段的值少于这个宽度,它不会进行任何填充(因为这里没有指定填充字符)。在这个例子中,它确保i
和j
至少占用一个字符的宽度。 -
:<2
:这又是另一个格式说明符。<
表示左对齐,2
表示字段的最小宽度为2个字符。如果字段的值少于这个宽度,它会在右侧(因为是对齐到左侧)用空格填充。在这个例子中,它确保i * j
的结果和等号=
至少占用两个字符的宽度,并且等号总是靠左对齐。
7.内置数据类型
- 数值数据类型:int、bool、float、complex
- 序列数据类型:不可变(str、tuple、bytes)和可变(list、bytearray)
- 集合数据类型:set、frozenset
- 字典数据类型:dict。例如:{1: "one", 2: "two"}
1)数值类型
① int
>>> int(), int(123), int('456'), int(1.23) #输出:(0, 123, 456, 1)
>>> int('FF', 16), int('100', 2) #输出:(255, 4)
② float
③ complex
>>> c = complex(4, 5)
>>> c #输出:(4+5j)
属性/方法 | 说明 | 示例 |
real | 复数的实部 | >>> (1+2j).real #结果:1.0 |
imag | 复数的虚部 | >>> (1+2j).imag #结果:2.0 |
conjugate() | 共轭复数 | >>> (1+2j).conjugate() #结果:(1-2j) |
2)算术运算符
3)位运算符
4)数制转换函数
5)random模块
8.Python序列数据
- 数组:将数据存储在一个或多个数组中,通过索引下标访问并处理数组的元素
- 序列数据类型:元组(tuple)、列表(list)、字符串(str)和字节数据(bytes和bytearray)
1)元组也称之为定值表,用于存储值固定不变的值表
2)列表也称之为表,用于存储其值可变的表
3)字符串是包括若干字符的序列数据,支持序列数据的基本操作
4)字节序列数据是包括若干字节的序列
5)序列的索引访问操作
6)序列的切片操作
s [ i : j ] 表示取下标 [ i , j )的数
s [ : ] 表示取所有的数
s [ : j ] 表示取前 j 的数
s [ :: j ] 表示输出所有间隔 j 的数
s [ :: -1 ] 表示反转
del s[3] 表示删除下标为3的数
7)list对象的方法
假设表中的示例基于 a = [1,3,2]
8)tuple对象创建元组
9)str数据类型(字符串)
Python中没有独立的字符数据类型,字符即长度为1的字符串
Python内置数据类型str,用于字符串处理
- str对象的值为字符系列
- str对象(字符串)是不可变对象
- 使用单引号或双引号括起来的内容,是字符串字面量
10)字节序列
- 字节序列(bytes和bytearray)是由8位字节数据组成的序列数据类型,即0<=x<256的整数序列
- Python内置的字节序列数据类型包括:bytes(不可变对象)、bytearray(可变对象)和memoryview
11)字典(映射)
- 字典(dict,或映射map)是一组键/值对的数据结构。每个键对应于一个值。
- 在字典中,键不能重复。根据键可以查询到值
- 字典的键只能使用不可变的对象,但字典的值可以使用不可变或可变的对象
9.输入输出和文件
1)命令行参数
- 通过列表sys.argv访问命令行参数
- argv[0]为Python脚本名,argv[1]为第1个参数,argv[2]为第2个参数
2)标准输入和标准输出函数
- input函数的格式:input()
- print函数的格式
3)文件和文件对象
- 通过内置函数open可创建或打开文件对象
- 通过文件对象的实例方法write/writelines,可以写入字符串到文本文件
- 通过文件对象的实例方法read/readline,可以读取文本文件的内容
- 文件读写完成后,应该使用close方法关闭文件
4)with语句
- 实现上下文管理协议的对象
- 文件对象支持使用with语句,确保打开的文件自动关闭
5)文本文件的写入和读取
6)二进制文件的读取和写入
7)CSV文件格式的读取和写入
import csv
def writecsv1(csvfilepath): #使用writer对象将数据写入csv文件headers = ['学号', '姓名', '性别', '班级', '数据库应用课程设计', '移动互联网应用开发实践', '计算机组成原理', '科技金融概论', '多媒体技术', '人工智能基础及应用']rows = [('1111111', '张三', '男', '软件工程', '88', '90', '97', '84', '90', '89'),('1111112', '李四', '男', '软件工程, '88', '90', '97', '84', '90', '89'),('1111113', '王五', '男', '软件工程', '88', '90', '97', '84', '90', '89'),('1111114', '李明', '男', '软件工程', '88', '90', '97', '84', '90', '89'),('1111115', '小亮', '男', '软件工程', '88', '90', '97', '84', '90', '89'),('1111116', '丽丽', '女', '软件工程', '88', '90', '97', '84', '90', '89'),]with open(csvfilepath,'w', newline='') as f: #打开文件f_csv = csv.writer(f) #创建csv.writer对象f_csv.writerow(headers) #写入1行(标题)f_csv.writerows(rows) #写入多行(数据)
def readcsv1(csvfilepath): #使用reader对象读取csv文件数据with open(csvfilepath,'r' ,newline='') as f: #打开文件f_csv = csv.reader(f) #创建csv.reader对象headers = next(f_csv) #标题print(headers) #打印标题(列表)for row in f_csv: #循环打印各行(列表)print(row)csvfilepath = './data/course.csv' #csv文件存放路径
writecsv1(csvfilepath) #调用写入函数
readcsv1(csvfilepath) #调用读取函数
10.程序的错误
1)语法错误
语法错误是指其源代码中拼写语法错误,这些错误导致Python编译器无法把Python源代码转换为字节码,故也称之为编译错误
2)运行时错误
运行时错误是在:
- 程序中没有导入相关的模块(例如,import random)时,解释器将在运行时抛出NameError错误信息
- 程序中包括零除运算,解释器将在运行时抛出ZeroDivisionError错误信息
- 程序中试图打开不存在的文件,解释器将在运行时抛出FileNotFoundError错误信息
3)逻辑错误
逻辑错误是程序可以执行(程序运行本身不报错),但执行结果不正确。对于逻辑错误,Python解释器无能为力,需要读者根据结果来调试判断
4)异常处理
- 通过try语句来定义代码块,以运行可能抛出异常的代码;
- 通过except语句,可以捕获特定的异常并执行相应的处理;
- 通过finally语句,可以保证即使产生异常(处理失败),也可以在事后清理资源等
- finally块 始终在执行完 try和except块 之后执行,而与是否引发异常或者是否找到与异常类型匹配的except块无关
- finally块用于清理在try块中执行的操作,如释放其占有的资源(如文件流、数据库连接和图形句柄),而不用等待由运行库中的垃圾回收器来完成对象
11.Python函数分类
(1)内置函数。Python语言内置了若干常用的函数,例如abs()、len()等等,在程序中可以直接使用
(2)标准库函数。Python语言安装程序同时会安装若干标准库,例如math、random等等。通过import语句,可以导入标准库,然后使用其中定义的函数
(3)第三方库函数。Python社区提供了许多其他高质量的库,如Python图像库等等。下载安装这些库后,通过import语句,可以导入库,然后使用其中定义的函数
(4)用户自定义函数。本章将详细讨论函数的定义和调用方法
1)Lamda表达式/匿名函数
Lambda是一种简便的、在同一行中定义函数的方法。lambda实际上生成一个函数对象,即匿名函数
2)位置参数和命名参数
- 函数调用时,实参默认按位置顺序传递形参。按位置传递的参数称之为位置参数。
- 函数调用时,也可以通过名称(关键字)指定传入的参数,例如:my_max1(a=1, b=2); my_max1(b=2, a=1)
- 按名称指定传入的参数称为命名参数,也称之为关键字参数。
- 使用关键字参数具有三个优点:
- 参数按名称意义明确;
- 传递的参数与顺序无关;
- 如果有多个可选参数,则可以选择指定某个参数值
- 在带星号的参数后面声明的参数强制为命名参数,如果这些参数没有默认值,且调用时必须使用命名参数赋值,则会引发错误
- 如果不需要带星号的参数,只需要强制命名参数,则可以简单地使用一个星号,如def total(initial=5, *, vegetables)
3)可变参数(单星参数和双星参数)
例子:
def my_function(*args, **kwargs): print("单星参数:", args) # 输出为一个元组 print("双星参数:", kwargs) # 输出为一个字典 # 调用函数
my_function(1, 2, 3, name="Alice", age=30)
输出:
单星参数: (1, 2, 3) #元组形式
双星参数: {'name': 'Alice', 'age': 30} #字典形式:key:value
12.类和对象
1)类、对象
2)属性
- 通过 self.变量名 定义的属性
- 类属性:类本身的变量
- 私有属性和公有属性
两个下划线开头,但是不以两个下划线结束的属性是私有的(private),其他为公共的(public)
- @property装饰器
3)静态方法(@staticmethod)
- 声明属于与类的对象实例无关的方法
- 静态方法不对特定实例进行操作,在静态方法中访问对象实例会导致错误
- 静态方法通过装饰器@staticmethod来定义
- 静态方法一般通过类名来访问,也可以通过对象实例来调用
4)类方法(@classmethod)
- 允许声明属于类本身的方法,即类方法
- 类方法不对特定实例进行操作,在类方法中访问对象实例属性会导致错误
- 类方法通过装饰器@classmethod来定义,第一个形式参数必须为类对象本身,通常为cls
- 类方法一般通过类名来访问,也可通过对象实例来调用
5)__init__方法(构造函数)
__init__方法即构造函数(构造方法),用于执行类的实例的初始化工作。创建完对象后调用,初始化当前对象的实例,无返回值
6)__new__方法
__new__方法是一个类方法,创建对象时调用,返回当前对象的一个实例,一般无需重载该方法
7)__del__方法(析构函数)
- __del__方法即析构函数(析构方法),用于实现销毁类的实例所需的操作,如释放对象占用的非托管资源(例如:打开的文件、网络连接等)
- 默认情况下,当对象不再被使用时,__del__方法运行,由于Python解释器实现自动垃圾回收,即无法保证这个方法究竟在什么时候运行
- 通过del语句,可以强制销毁一个对象实例,从而保证调用对象实例的__del__方法
8)私有方法与公有方法
- 两个下划线开头,但不以两个下划线结束的方法是私有的(private),其他为公共的(public)
- 以双下划线开始和结束的方法是Python的专有特殊方法。不能直接访问私有方法,但可以在其他方法中访问
9)继承
13.模块化编程
1)概念
- 如果程序中包含多个可以复用的函数或类,则通常把相关的函数和类分组包含在单独的模块(module)中。这些提供计算功能的模块称之为模块(或函数模块),导入并使用这些模块的程序,则称之为客户端程序
- 把计算任务分离成不同模块的程序设计方法,称之为模块化编程(modular programming)。使用模块,可以将计算任务分解为大小合理的子任务,并实现代码的重用功能
2)模块的API
模块和客户端之间遵循的契约称之为API((Application Programming Interface,应用程序编程接口)
API用于描述模块中提供的函数的功能和调用方法