python 学习笔记
因为已经有 c++ 的语法基础,这里我只记录与之不同的地方。
1 变量、输入输出
-
变量若未赋值,则没有定义;
-
变量可以通过逗号分隔实现多重赋值,比如
a, b = 1, 2分别使得a = 1,b = 2,这个过程是同时进行的,也就是说,可以不用中间变量而实现交换变量; -
print多元素输出时,默认在中间加入空格,即sep = ' '(separator),其次,任意输出结束末尾默认换行,即end = '\n',也可以通过print(..., sep = '...', end = '...')自行调整; -
最常见的场景是输入一行数作为列表:
arr = list(map(int, input().split())),需要注意的是,input()默认返回字符串
2.1 类型及其成员函数
常见的类型中,可分为可变和不可变(即只能整体重新赋值)两种,可修改的类型有:list tuple dict set,其余的 bool int float str NoneType 为不可变;
- list(列表,可变有序序列)
| 函数 | 说明 |
|---|---|
L.append(x) |
在末尾添加元素 x |
L.extend(t) |
将可迭代对象 t 的所有元素追加到 L |
L.insert(i, x) |
在索引 i 处插入 x ,后面的元素位置都向右移一位 |
L.pop(i) |
移除并返回索引 i 处的元素(若不填,则默认末尾) |
L.remove(x) |
移除第一个值为 x 的元素 |
L.index(x) |
返回 x 第一次出现的索引 |
L.count(x) |
统计 x 在列表中出现的次数 |
L.sort() |
原地升序排序 |
L.reverse() |
原地反转列表 |
L.copy() |
返回列表的浅拷贝 |
L.clear() |
移除所有元素 |
- tuple(元组,不可变有序序列)
继承 list 的非修改操作;
- str(不可变文本序列)
| 函数 | 说明 |
|---|---|
S.split(sep=None, maxsplit=-1) |
按分隔符和分隔次数拆分为列表,默认按检索到的任意空白不限次拆分 |
S.join(iterable) |
用 S 连接可迭代对象中的字符串,必须是字符 |
S.strip() |
去除首尾空白(或指定字符) |
S.upper() / S.lower() |
转大写/小写 |
S.replace(old, new) |
替换 S 中的子串 |
S.find(sub) |
返回 sub 首次出现的索引,找不到返回 -1 |
S.count(sub) |
统计 sub 出现次数 |
S.format(...) |
格式化字符串,例如s = "姓名:{name},年龄:{age}".format(name="张三", age=25) |
-
dict(字典,键值映射)
-
set(集合,无序不重复元素集)
2.2 内置函数
- 类型转换与构造
| 函数 | 用法 |
|---|---|
int(x) |
将字符串或数字转为整数 |
float(x) |
转为浮点数 |
str(x) |
转为字符串表示 |
list(iterable) |
从可迭代对象创建列表 |
tuple(iterable) |
创建元组 |
set(iterable) |
创建集合(自动去重) |
- 数学与数值
| 函数 | 用法 |
|---|---|
abs(x) |
绝对值 / 复数模 |
round(x, n) |
对 x 四舍五入到 n 位小数 |
sum(iterable) |
求和 |
max(iterable) / min(iterable) |
最大值 / 最小值 |
pow(x, y) |
x ** y |
divmod(a, b) |
同时返回 (a // b, a % b) ,即商和余数组成的元组 |
- 迭代与序列处理
| 函数 | 用法 |
|---|---|
len(x) |
返回容器长度 |
range(start, stop, step) |
生成整数序列 |
enumerate(iterable, start=0) |
返回 (索引, 元素) 对,常用于 for 循环 |
sorted(iterable, key=None, reverse=False) |
对所有可迭代对象,返回排序后的新列表,默认升序,key 即比较函数,可以是长度 len,可以是绝对值 abs,也可以手写 |
reversed(seq) |
返回逆序迭代器 |
3 运算符
-
/总是返回浮点类型,即使是刚好整除; -
//表示向下取整; -
**表示乘方,向右结合,例如 a ** b ** c 即 a ** (b ** c); -
%的结果符号与除数相同,这个与 c++ 的逻辑是相反的; -
@实现矩阵乘法; -
混合类型运算(int, float),会自动把整数转换为浮点数,即自动向更宽的类型提升;
数值类型层级:bool -> int -> float -> complex(a + bi)
-
python 没有自增运算符;
-
x if condition y即三目运算符,x 为条件为真的返回值; -
python 的比较运算符多了
isnot is,是身份测试,is和==的区别即前者为判断是否是同一对象,更严苛,后者仅判断值; -
andornot即逻辑运算符; -
成员访问运算符多了
innot in,即成员测试; -
:=即赋值运算符,用于在表达式内赋值,比如可以一边赋值一边判断;
4.1 字符串
-
""``两者都可以表示字符串; -
\可以进行转义,比如\`可以输出`,如果不希望前置\的字符转义为特殊字符,只是输出原始字符串,可以写作r"..."( r 即 raw);
| 转义序列 | 含义 |
|---|---|
\\ |
反斜杠 \ |
\' |
单引号 ' |
\" |
双引号 " |
\a |
ASCII 响铃 BEL |
\b |
ASCII 退格 BS |
\f |
ASCII 换页 FF |
\n |
ASCII 换行 LF |
\r |
ASCII 回车 CR |
\t |
ASCII 水平制表 TAB |
\v |
ASCII 垂直制表 VT |
-
字符串可以用
+合并,用*重复; -
相邻多个单独字符串
"1" "2" ... "n"会自动合并为一个字符串“123...n”; -
字符串支持两种查询方式:一是索引(index),
str[0]表示从左往右第一位,str[-1]表示从右往左第一位,之后以此类推;二是切片(slice),str[l,r]表示字符串 \([l, r)\) 这个左闭右开区间上的字符;
4.2 列表
-
列表(list)
arr = [..., ..., ..., ...]即数组概念,同样支持字符串类似操作,但它是可变对象,即可以通过索引或切片更改元素; -
像
b = a这样的赋值操作并不是复制列表,而是将二者都指向同一个列表,即若修改其中一个,另一个也会同时改变,若仅仅需要复制列表的值,可以用b = a.copy(); -
一般输出 list 类型会默认带上标准格式
[, , ,]来表示它是列表,如果想要只输出数据,可以用*进行解包print(*arr); -
赋值
[]可以让对象清空;
5.1 控制流语句
-
elif是else if的缩写; -
for和 c++ 不同的是,它不给予用户定义迭代步骤和结束条件的能力,而仅仅是在列表或字符串等任意序列的元素上迭代,即,它迭代的是元素值,例如for i in str:;其次,这里借用一下 c++ 中拷贝和引用(要用&)的概念,在此,i 相当于一个拷贝元素,对它进行操作不会改变原序列的元素; -
range()默认用于生成等差数列,例如for i in range(len(str))即for (int i = 0; i < str.size(); i ++);当然,它也可以像 c++ 的 for 一样控制参数,range(start, stop, step); -
enumerate()可以用于任何可迭代对象, 参数包括enumerate(arr, start)start 默认为 0 并省略,且这里的 start 是将第 0 项直接映射为第 start 项,而不是说从 start 项开始; -
for...else或while...else语句可以理解为 no-break 语句,只要对应的循环正常执行完(包括 continue),就会触发执行; -
pass是一个空操作语句。由于 python 是用缩进来组织代码块,且冒号后面至少要有一条语句,便可以用此使语法完整; -
match...case类似 swith 语句,满足条件后续便不会执行,其中case _:即前面所有条件都不满足时执行,_称为通配符,必定会匹配成功; -
del ...语句即删除,可以按索引而不是按值从一个列表移除条目;
5.2 函数
- 用
def来声明一个函数,不用写返回类型、参数类型,无返回值时,默认为None(这是一个独立的类型,可以直接令 a = None 来表达);其次,它不会强制检查类型,也就是说,你可以这么写:
点击查看代码
def add(a, b):
return a + b
c = add(1, 2)
d = add('a', 'b')
print(c) # 3
print(d) # ab
-
若对象类型可变,在函数内修改会影响外部,但在函数内给对象重新赋值,则只改变局部名字绑定,不影响外部变量;
-
传参分两种:按位置和按关键字。默认是两种都行。按位置即传入参数按顺序赋个对应的变量,按关键字则可以通过
x = ...来直接指定赋予; -
传参有几点特点:一是定义的参数一定要有对象,可以是之前已经指向对象,也可以在函数 () 内指向对象;二是调用函数改参数可以不用都写、都改;三是有两个记号
/*,例如f(a, b, /, c, d, *, e, f)中 a, b 只能按位置, e, f 只能按关键字,c, d 都可以;

浙公网安备 33010602011771号