python 学习笔记

因为已经有 c++ 的语法基础,这里我只记录与之不同的地方。


1 变量、输入输出

  1. 变量若未赋值,则没有定义;

  2. 变量可以通过逗号分隔实现多重赋值,比如 a, b = 1, 2 分别使得 a = 1 ,b = 2 ,这个过程是同时进行的,也就是说,可以不用中间变量而实现交换变量;

  3. print 多元素输出时,默认在中间加入空格,即 sep = ' ' (separator),其次,任意输出结束末尾默认换行,即 end = '\n',也可以通过 print(..., sep = '...', end = '...') 自行调整;

  4. 最常见的场景是输入一行数作为列表: arr = list(map(int, input().split())) ,需要注意的是,input() 默认返回字符串


2.1 类型及其成员函数

常见的类型中,可分为可变和不可变(即只能整体重新赋值)两种,可修改的类型有:list tuple dict set,其余的 bool int float str NoneType 为不可变;

  1. 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() 移除所有元素
  1. tuple(元组,不可变有序序列)

继承 list 的非修改操作;

  1. 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)
  1. dict(字典,键值映射)

  2. set(集合,无序不重复元素集)


2.2 内置函数

  1. 类型转换与构造
函数 用法
int(x) 将字符串或数字转为整数
float(x) 转为浮点数
str(x) 转为字符串表示
list(iterable) 从可迭代对象创建列表
tuple(iterable) 创建元组
set(iterable) 创建集合(自动去重)
  1. 数学与数值
函数 用法
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) ,即商和余数组成的元组
  1. 迭代与序列处理
函数 用法
len(x) 返回容器长度
range(start, stop, step) 生成整数序列
enumerate(iterable, start=0) 返回 (索引, 元素) 对,常用于 for 循环
sorted(iterable, key=None, reverse=False) 对所有可迭代对象,返回排序后的新列表,默认升序,key 即比较函数,可以是长度 len,可以是绝对值 abs,也可以手写
reversed(seq) 返回逆序迭代器

3 运算符

  1. / 总是返回浮点类型,即使是刚好整除;

  2. // 表示向下取整;

  3. ** 表示乘方,向右结合,例如 a ** b ** c 即 a ** (b ** c);

  4. % 的结果符号与除数相同,这个与 c++ 的逻辑是相反的;

  5. @ 实现矩阵乘法;

  6. 混合类型运算(int, float),会自动把整数转换为浮点数,即自动向更宽的类型提升;

数值类型层级:bool -> int -> float -> complex(a + bi)

  1. python 没有自增运算符;

  2. x if condition y 即三目运算符,x 为条件为真的返回值;

  3. python 的比较运算符多了 is not is ,是身份测试,is 和 == 的区别即前者为判断是否是同一对象,更严苛,后者仅判断值;

  4. and or not 即逻辑运算符;

  5. 成员访问运算符多了 in not in ,即成员测试;

  6. := 即赋值运算符,用于在表达式内赋值,比如可以一边赋值一边判断;


4.1 字符串

  1. "" `` 两者都可以表示字符串;

  2. \ 可以进行转义,比如 \` 可以输出 `,如果不希望前置 \ 的字符转义为特殊字符,只是输出原始字符串,可以写作 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. 相邻多个单独字符串 "1" "2" ... "n" 会自动合并为一个字符串 “123...n” ;

  3. 字符串支持两种查询方式:一是索引(index),str[0] 表示从左往右第一位,str[-1] 表示从右往左第一位,之后以此类推;二是切片(slice),str[l,r] 表示字符串 \([l, r)\) 这个左闭右开区间上的字符;


4.2 列表

  1. 列表(list)arr = [..., ..., ..., ...] 即数组概念,同样支持字符串类似操作,但它是可变对象,即可以通过索引或切片更改元素;

  2. 像 b = a 这样的赋值操作并不是复制列表,而是将二者都指向同一个列表,即若修改其中一个,另一个也会同时改变,若仅仅需要复制列表的值,可以用 b = a.copy();

  3. 一般输出 list 类型会默认带上标准格式 [, , ,] 来表示它是列表,如果想要只输出数据,可以用 * 进行解包 print(*arr) ;

  4. 赋值 [] 可以让对象清空;


5.1 控制流语句

  1. elif 是 else if 的缩写;

  2. for 和 c++ 不同的是,它不给予用户定义迭代步骤和结束条件的能力,而仅仅是在列表或字符串等任意序列的元素上迭代,即,它迭代的是元素值,例如 for i in str: ;其次,这里借用一下 c++ 中拷贝和引用(要用 &)的概念,在此,i 相当于一个拷贝元素,对它进行操作不会改变原序列的元素;

  3. range() 默认用于生成等差数列,例如 for i in range(len(str)) 即 for (int i = 0; i < str.size(); i ++) ;当然,它也可以像 c++ 的 for 一样控制参数,range(start, stop, step) ;

  4. enumerate() 可以用于任何可迭代对象, 参数包括 enumerate(arr, start) start 默认为 0 并省略,且这里的 start 是将第 0 项直接映射为第 start 项,而不是说从 start 项开始;

  5. for...else 或 while...else 语句可以理解为 no-break 语句,只要对应的循环正常执行完(包括 continue),就会触发执行;

  6. pass 是一个空操作语句。由于 python 是用缩进来组织代码块,且冒号后面至少要有一条语句,便可以用此使语法完整;

  7. match...case 类似 swith 语句,满足条件后续便不会执行,其中 case _: 即前面所有条件都不满足时执行, _ 称为通配符,必定会匹配成功;

  8. del ... 语句即删除,可以按索引而不是按值从一个列表移除条目;


5.2 函数

  1. 用 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
  1. 若对象类型可变,在函数内修改会影响外部,但在函数内给对象重新赋值,则只改变局部名字绑定,不影响外部变量;

  2. 传参分两种:按位置和按关键字。默认是两种都行。按位置即传入参数按顺序赋个对应的变量,按关键字则可以通过 x = ... 来直接指定赋予;

  3. 传参有几点特点:一是定义的参数一定要有对象,可以是之前已经指向对象,也可以在函数 () 内指向对象;二是调用函数改参数可以不用都写、都改;三是有两个记号 / *,例如 f(a, b, /, c, d, *, e, f) 中 a, b 只能按位置, e, f 只能按关键字,c, d 都可以;

posted @ 2026-09-19 13:17  Zhang_Wenjie  阅读(9)  评论(0)    收藏  举报