BUAA-Python-Note
6.27
解释型语言
- Python 作为解释型语言,在执行过程中通过解释器逐行解释每一行源代码,执行速度要慢于编译型语言(C语言等),但编译时间更快、平台间的可移植性更好
常用内置函数
input()
input([prompt])
:prompt
内容作为提示信息显示在控制台中,引导用户输入,默认读入的类型为str
类型
通常情形下需要进行格式转换,可以使用 <type>(input())
进行转换, type
是转换的目标格式类型
一行读入多个由空格等分隔符读入的信息可以用 spilt()
进行分割,如:
a, b = input().spilt() |
type()
函数可以提供输入变量的类型,可以 print
查看
print()
常用输出函数,当输出多个内容时使用 ,
进行分隔,在控制台中会通过空格进行分隔,并输出在同一行内,输出结束后默认换行
格式化输出方法:
- 使用
%
符作为占位符:
字符串内类似C语言写入占位符,在字符串结束后直接追加 %(varName1, varName2)
进行补充,括在一个 %
符号后
school = "BUAA" |
str.format()
函数:
通过大括号作为占位符,调用 str
类型的 format()
方法,可以用数字表示占位的变量顺序
school = "BUAA" |
- f-string:
Python 3.6 后添加的格式化方法
school = "BUAA" |
代码结构
- block & indentation:block 是代码块,在 Python 中以缩进(indentation)表示一个代码块,通常缩进为一个 tab
- module:一个单独的
.py
文件,可以通过import
的方式进行引入 - package:多个 module 所在的文件夹,package 必定包含
__init__.py
文件
运算符
- / :除法,返回为浮点型
- // :整数除法,返回除法向下取整后的整数结果
- % :取模,对负数而言可以带公式: $x - x\ //\ y * y$
- ** : 乘方运算,支持指数为负的情况
- Python 的浮点数比较会自动控制精度,通常在 $10^{-8}$ 内即判断两数相等/不等
- Bitwise Operation - 位运算
&|~
:按位与或非 - Logic Operation - 逻辑运算
and or not
:逻辑与或非
要注意的是,逻辑运算中的返回值:举例 x and y
,当 x
为真时,则会直接返回 y
,例如 1 and 4
则会直接返回 4
作为结果,并且 Python 逻辑运算也满足短路效应
字符串操作
- Python 中不包含字符类型,单个字符也会被视为字符串;正向索引时从 0 开始,反向索引则从 -1 开始
- 切片:便捷取出某些字符序列,
str[a:b:c]
意为下标从 a 开始到 b 结束,以间隔为 c 取出字符返回一个字符串;特别的str[::-1]
代表反转字符串,其中 a、b 的正负可以混用,切片方向由 c 决定 - 常用的一些函数:
len()
- 长度;isdigit()
- 全数字;isalpha
- 全字母;startwith()
- 以特定字符开头
6.29
布尔类型
任何数据类型都可以转换为布尔类型,并且任何非空的数据几乎都会被判断为 True
:
- 非零数字类型
- 非空字符串
- 非空容器
常用容器
list - 列表
列表使用方括号创建,构造方式如下:
list1 = [] |
列表是有序可重复的,可以通过索引(下标)获取列表内容。值得注意的是,对一个 str
类型的数据使用 list()
进行包裹,会按字符将其切分并置入列表中
查询操作
同时列表的元素可以为任何类型,也就是说 list1 = [[1, 2, 3], [1], []]
这样一个列表也是合法的
在访问列表时可以使用下标进行索引(正负索引均可),同时也可以采用切片获取列表的子列表
in
关键字可以查找列表中是否包含待查找的元素:
if element in list1: |
修改操作
可以对索引出的列表元素进行直接修改,这样不会改变列表元素的数量
list1[0] = "new element" |
添加操作可以使用 append
、insert
或 extend
几个函数
list1.append("new element") # 追加至列表末尾 |
其中 extend
方法不限制参数的元素类型(列表、元组、集合、字典等均可)
删除操作可以使用 remove
、pop
、clear
:
list1.remove("removed") # 删除指定内容的元素 |
循环操作
对列表的循环有时可以用列表推导式进行替换:
list2 = [x if x == "target" else "target" for x in list1] |
这个操作会遍历所有的元素,并将等于 target 的元素直接置入 list2,遍历到其余元素时,每个元素都会向列表插入一个 target 元素。列表表达式可以简化对列表的 for 循环操作
排序操作
使用 sort
函数进行排序:
list1.sort() # 字典序排序,默认升序 |
关于第四项: python3 中不再支持使用比较函数 cmp 进行 sort 地比较,所以如若自定义函数控制排序顺序,可以使用 cmp_to_key
函数进行转化,从而在 key 字段使用,需要在代码使用前进行引入
from functools import cmp_to_key |
tuple - 元组
元组是一个有序、不可更改的容器,类似 const
tuple1 = tuple() |
在通过 ()
创建单一元素的元组时,需要多加一个逗号进行分隔,否则会自动转型为其他数据类型。可以通过下标对元组进行访问
修改操作
元组创建后不可更改,但是可以令两个元组使用 +
运算符组合(类似 extend),但是不允许对元素进行删除
所以实在想改的话可以先通过 list(tuple1)
变化为列表类型,随后对元素进行操作,最后再用 tuple()
将列表还原为元组
set - 集合
集合是一个无序容器,因此不允许同时出现两个相同的元素,使用 {}
进行标识,同时不能使用下标进行索引(毕竟无序)
修改操作
set1.add(element) # 添加一个元素 |
discard
方法若删除不存在的元素时不会发生报错,使用 remove
则会,所以建议使用 discard
dictionary - 字典
字典类似于 java 中的 map 容器,通过键值对进行索引,key 不允许重复。在 python 3.7 及其之后,字典是一个有序容器,在此之前是无序的。其访问通过下标索引,下标为 key 值
dict1 = {key1: value1, key2: value2} |
修改操作
更改已有的键值对可以使用两种方法:
dict1[key] = newValue |
添加新的键值对同理,也是使用上面两个方法
删除时对 key 进行删除:
dict1.pop(key) |
7.5
函数
函数使用 def
关键字进行声明,参数数量可以选择变长参数表进行处理
def func1(*tuple) |
使用一个星号可以把调用时所有的参数转化为一个元组,两个星号则是字典,第二种情况要求调用时必须写出 argname=parameter
的显式参数,否则字典就没有 key 用了(
7.9
lambda 函数
lambda
函数是一个单行的便捷函数,它可以接受若干参数,但只能进行一行表达式的执行
func = lambda arg0, arg1 : expression # 声明 |
可以通过 lambda 函数完成一些简单的函数功能
类与对象
类通过 class
关键字定义,创建对象时不需要使用 new
。
class Sleep: |
继承与其他 oop 语言类似,使用 super
进行引用(super.__init__()
)
Python 允许多重继承,并且方法的继承顺序按照 C3 linearization 进行标定,继承顺序可以通过 class.mro()
查看
日期库 - datetime
datetime 库通过创建一个变量来保存运行时的日期信息:
import datetime |
可以通过 strftime
方法对日期进行格式化输出,格式取决于字符串 <Directive>
JSON 解析 - json
Python 内置了简单的 json 解析库:json。json 库能实现 json 字符串和字典的双向转化。
import json |
7.17
异常处理
异常处理流程
在 python 中使用 try-except-finally
块表示异常的捕获与处理,同时也可以尝试捕获不同类型的异常,进入不同的处理分支,如下例:
try: |
最后使用的 Exception
指代所有异常,也就是说如果发生了除前两种异常外的异常时,会进入这个分支最后转入 finally
内。
异常的触发
除了捕获原本定义的异常类型外,我们也可以通过 raise
关键字主动触发异常并申请程序处理。也可以定义一个新的异常类,如下例:
class NewException(Exception): |
正则表达式
引入
正则表达式可以通过引入 re
软件包实现
正则函数
常用的函数如下:
res1 = re.findall([字符串 | 数组等容器], src) |
Match 对象
当通过 search
或 sub
方法匹配后,会返回一个 Match 对象,它包含了这次匹配所用到的相关信息,常用的方法 or 属性共三个:
matcher.span() # 匹配项所在的字符下标范围,为元组形式 |