Python知识
我体会到的变化
- 没有
i++、i--的语法糖 - 严格缩进,
:和缩进代表作用域 - 变量不用也不能初始化类型声明(动态类型)
- 变量本身没有固定类型,类型属于值(对象),而不是变量名。
- 同一个变量可以在程序运行过程中绑定到不同类型的对象。
- 不用写
;和() - 没有 NULL 而是 None
- 无穷不是 INT_MIN 和 INT_MAX 而是 inf 和 -inf(infinite)
- 三目运算符
<结果1> if <条件> else <结果2>条件为真返回结果 1 - 没有
!来取反,而是not - 交换没有
swap()函数,而是a, b = b, a用元组整体赋值,交换元组内部元素指向 - 没有
else if,而是elif - 可以连等赋初值
a = b = 1 - python 的除法默认浮点计算,用
//才是整除 - 排序方法为
sorted() nums1 = nums2不能给外部数组整个赋值,要用切片nums[:] = res0 <= x < n and 0 <= y < m可以直接写范围,不用分开写- 没有
->,都是直接用.来访问成员,所有变量本质上都是对象的引用 - 类中只有用
self.val声明的val才能成为属性,所有属性调用也要加self. - 类的实例方法第一个参数必须是
self - 在[a, b]中生成随机整数
randint(a, b),引入from random import randint
基础知识
C++/Java 是静态类型语言 + 编译期绑定,先完整编译整个文件,然后运行。
Python 是动态类型 + 运行时绑定,逐行解释执行,执行到 def 才创建函数对象
Python 在初始化变量时不需要(也不能)显式声明类型。这是 Python 作为动态类型语言(dynamically typed language)的核心特性之一。Python 会在运行时自动推断并绑定变量的类型,你只需要写 变量名 = 值 即可。
1
2
3a = 42 # a 是 int
a = "now a string" # 现在 a 是 str
a = [1, 2, 3] # 现在 a 是 listPython 没有 C++ 的“值传递”或“引用传递”语法。所有参数传递都是 “传对象引用”(Pass-by-object-reference):
Python 中所有变量都是“引用”(类似 C++ 的指针,但更安全)。
赋值 a = b:若 b 是可变对象(如 list),修改 a 会影响 b。
排序方法
1 | |
列表(List)(栈)
1 | |
二维列表
1 | |
list可以直接充当栈
1 | |
列表推导式
把“循环 + 条件 + 表达式”压缩成一行代码
1 | |
for 循环
遍历列表
1
2
3nums = [1, 2, 3]
for x in nums:
print(x) # 1, 2, 3遍历字符串
1
2
3s = "abc"
for c in s:
print(c) # 'a', 'b', 'c'遍历范围(range)
类似 C++ 的 for (int i = 0; i < n; i++)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# for (int i = 0; i < 5; ++i)
for i in range(5):
print(i) # 0,1,2,3,4
# for (int i = 1; i <= 5; ++i)
for i in range(1, 6):
print(i) # 1,2,3,4,5
# for (int i = 0; i < 10; i += 2)
for i in range(0, 10, 2):
print(i) # 0,2,4,6,8
# 如果不需要索引,只注重循环次数可以用`_`
# 循环 n 次
for _ in range(n):
print(i)用索引的方式
1
2
3
4
5
6
7
8
9
10for i in range(len(nums)):
nums[i] = 0
# 倒序遍历
# range()就相当于 for (int i = n - 1, i != -1. i--)
# 第二个参数是到 -1 时停止,第三个是每次 i += -1
for i in range(len(nums) - 1, -1 ,-1):
if nums[i] == val:
nums.pop(i)
return len(nums)同时获取索引和值:
enumerate()(枚举)1
2
3
4
5
6
7
8nums = [10, 20, 30]
for i, x in enumerate(nums):
print(i, x)
# 输出: 0 10, 1 20, 2 30
# 从指定索引开始
for i, x in enumerate(nums, start=1):
print(i, x) # 1 10, 2 20, 3 30多维列表遍历
1
2
3
4
5
6
7
8matrix = [[1,2], [3,4]]
# 展开所有元素
for row in matrix:
for x in row:
print(x) # 1,2,3,4
# 列表推导式写法
[x for row in matrix for x in row]多维列表创建
1
2
3# for _ in 的意义就是只强调循环次数,不强调索引
# 这就是标准创建多维数组方式,重复创建m次长为n的数组,
matrix = [[0]*n for _ in range(m)]
元组
也叫只读列表,不像对(pair)只能存两个,元组可以存多个元素,比如 a = (1, 2, 3, 5)
不可变序列,常用于坐标、键值对等
1 | |
字典(哈希表)
键必须是可哈希的(不可变类型)
值可以是任意类型
1 | |
例子
1 | |
集合(set)
自动去重(唯一性)、无序
1 | |
队列(queue)
1 | |
双端队列(deque)
1 | |
字符串(str)
不可变!拼接大量字符串用 list + join
1 | |
堆(heap)
1 | |
函数
1 | |
变量作用域
- 外部声明的变量,内部是可以直接访问值的,但是不能修改
- 函数内未被修饰的变量都是只属于这个函数的,假设内外部有一个变量m,如果内部再赋值
m = 1,这会在内部创建一个新的变量,外部的m不会被修改 - 想要修改外部变量,要么用
global修饰,或者用nonlocal修饰,指定这个变量的作用域 - 要么这个length改成一个可变对象,外部声明用
length = [0],内部使用用length[0],可变对象比如列表,字典,set,dict,在函数中的修改也是全局的lst[0] = 1
1 | |
如果要修改外部变量,用 global 现在函数里声明
1 | |
不定长参数,如果一个函数不确定接收的参数个数,可用 *args
args 是 “arguments” 的缩写,意思是 “参数” 或 “实参”
还有一种包裹关键字的**kwargs
1 | |
特殊方法
被双下划线包围的方法__xxx__,被称为特殊方法,也常被叫做魔术方法
他是在特定场景下自动调用的钩子函数,用于定义类的行为
对象创建与初始化
__new__(cls, …) 真正创建对象的静态方法(在__init__之前调用),通常用于控制实例创建(如单例模式)。__init__(self, …) 初始化已创建的对象(最常用)。__del__(self) 析构方法,在对象被销毁前调用(不保证一定会被调用,依赖垃圾回收机制)。比如定义一个节点类,类似于 C++里面的结构体,python 的结构体和类都是用 class
1
2
3
4
5
6
7class TreeNode:
# 给每个属性赋初值
def __init__(self, val=0, left=None, right=None):
# python类的属性不需要声明,直接赋值就行
self.val = val
self.left = left
self.right = right别的等用到再看吧
DFS 模板(递归)
1 | |
1 | |
BFS 模板(用 deque)
1 | |
1 | |
定义链表节点类
1 | |
双向链表节点类
1 | |
acm模式
- map转成int列表
nums = list(map(int, line.split())) - 去掉换行符,开头结尾的换行符
s.strip() - 按,分割
s.split(',')
a+b(1)
模板,输入a和b,输出a+b
1 | |
提取成函数
1 | |
a+b(2)
这次第一个输入的是组数,写下来输入才是之前的数据
用readline先把第一个数读走,然后依这个数作为循环次数
1 | |
python项目
py环境配置
去py官网下一个最新的稳定版,然后设置系统变量,pycharm的py解释器也指定为这个就行
pip会绑定一个py版本,之后换的时候要重新设置,不然用的还是旧版
系统变量里面旧的也要更新
venv文件夹
每个项目运行前都该创建venv文件夹,作为虚拟环境,这是根据python版本来的python -m venv venv
打包
【使用 PyInstaller】
py -m PyInstaller --onefile --name bili-music-list --paths src src\bili_music_list\cli.py
打包GUIpy -m PyInstaller --onefile --name bili-music-list-gui --paths src src\bili_music_list\gui.py