Python学习笔记

Python学习笔记

小叶子

封面作者:Taizo

请先阅读JavaScript学习笔记或同时学习相关基础课程

⭐基础

Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言, 运行速度慢但是可以调很快的 C/C++, 语法简洁, 易读易写, 适合快速开发, 已经成为了 国民语言

安装运行

  • 官网 下载安装包并安装
  • 命令行输入 python --version 查看版本并确认安装成功
  • 下载 VSCode 并安装 Python 插件, 右键 运行 Python 运行代码
  • 也可以用 PyCharmIDE 进行开发(免费的社区版或学校买的专业版)

注释

1
2
3
4
5
6
# 单行注释
'''
多行注释
多行注释
多行注释
'''

变量

  • 变量名只能包含字母、数字和下划线, 且不能以数字开头
  • 推荐使用小写字母和下划线组合, 如 my_name
  • Python 是弱类型语言, 不需要声明变量类型
  • 要查看变量类型, 可以使用 type() 函数
  • 注意布尔值是 TrueFalse, 首字母大写; 实质是数字 10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 基本数据类型
age = 18 # 整数
years = 1.5 # 浮点数
num = 1 + 2j # 复数
name = "xiaoyezi" # 字符串
home = 'China' # 字符串
intro = '''I'm a student
I'm 18 years old''' # 多行字符串
is_student = True # 布尔值
none = None # 空值

# 复杂数据类型
my_list = [1, 2, 3] # 列表, 类似数组
my_tuple = (1, 2, 3) # 元组, 不可变列表
my_dict = {'name': 'xiaoyezi', 'age': 18} # 字典, 键值对, 与 JS 的 Map 类似
my_set = {1, 2, 3} # 集合, 不重复元素, 与 JS 的 Set 类似

# 字符串可以当作列表来操作
print(name[0]) # x
print(name[1:3]) # ia
print(len(name)) # 8

运算符

  • 除法运算符 / 总是返回一个浮点数
  • == 用于比较两个对象的值是否相等, is 用于比较两个对象的引用是否相等(内存地址相等)
  • bool(0/''/[]/{}/()/None) 返回 False, 其他返回 True
  • 三元运算符: a if condition else b
运算符描述运算符描述
+-
*/
//整除(忽略余数)%取余
**not逻辑非
and逻辑与or逻辑或
==等于!=不等于
>大于<小于
>=大于等于<=小于等于
is是(同一对象)

输入输出

1
2
3
4
5
6
7
# 输入
name = input("请输入你的名字: ")
age = int(input("请输入你的年龄: ")) # 输入的是字符串, 需要转换成整数

# 输出
print("你的名字是: " + name + ", 你的年龄是: " + str(age)) # 字符串拼接
print(f"你的名字是: {name}, 你的年龄是: {age}") # 格式化输出

列表操作

  • i0 开始, 负数表示倒数第几个元素
  • 列表可以直接相加, 相当于 extend 方法
方法描述
lis[i]获取列表中的第 i 个元素
lis[i:j]获取列表中的第 ij-1 个元素
不写 i 表示从头开始, 不写 j 表示到末尾
lis[i:j:k]获取列表中的第 ij-1 个元素, 步长为 k
lis[::2] 表示获取所有偶数位的元素
lis[::-1] 表示倒序
del lis[i]删除列表中的第 i 个元素
x in lis判断 x 是否在列表中
len(lis)返回列表中元素的个数
li.index(x)返回列表中第一个值为 x 的元素的索引
lis.append(x)在列表末尾添加一个元素
lis.extend(iterable)在列表末尾一次性追加另一个序列中的多个值
lis.insert(i, x)在指定位置插入一个元素
lis.remove(x)移除列表中第一个值为 x 的元素
lis.pop()移除列表中的最后一个元素, 并返回该元素的值
lis.pop(i)移除列表中的第 i 个元素, 并返回该元素的值

如果你学过 JavaScript, 那元组可以理解为 Object.freeze(arr)

解构赋值

1
2
3
4
5
6
7
8
9
# 列表解构赋值
lis = ['xiaoyezi', 18, 'male']
name, age, gender = lis
print(name) # xiaoyezi
print(age) # 18
print(gender) # male

# 交换两个变量的值
a, b = b, a

字典操作

  • 字典是无序的, 所以不能用索引来获取值
  • key 不能重复, 可以是字符串、整数、浮点数、元组(不可变的变量)
  • 可迭代对象是指可以使用 for...in 循环的对象, 可以使用 list() 函数转换为列表
  • 要添加一个 key-value 对, 可以直接 dic[key] = value, 也可以使用 update 方法
方法描述
dic[key]获取字典中 key 对应的值
del dic[key]删除字典中的 key-value
key in dic判断 key 是否在字典中
dic.keys()返回字典中所有 key 的可迭代对象
dic.values()返回字典中所有 value 的可迭代对象
dic.items()返回字典中所有 key-value 对的可迭代对象
dic.get(key[, default])获取 key 对应的值, 如果 key 不存在则返回 default
dic.setdefault(key[, default])如果 key 不存在则设置 keydefault
dic.update({key: value})更新字典中的 key-value

集合操作

方法描述
set()创建一个空集合
set(iterable)从可迭代对象创建一个集合
set.add(x)添加元素到集合, 如果元素已存在, 则不进行任何操作
set.remove(x)移除集合中的元素, 如果元素不存在, 则会发生错误
setA & setB取两个集合的交集
setA | setB取两个集合的并集
setA - setB取两个集合的补集
setA ^ setB取两个集合的对称差集(不同时存在的元素)
setA <= setB判断 setA 是否是 setB 的子集
setA >= setB判断 setA 是否是 setB 的超集
x in set判断 x 是否在集合中
len(set)返回集合中元素的个数
set.copy()复制一个集合(浅拷贝), 返回复制后的集合

控制语句

  • 缩进是 Python 语法的一部分, 缩进不一致会报错
  • range([start, ]end[, step]) 生成一个整数序列, 不包括 end, 默认 start0, step1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# if...elif...else
if age < 12:
print('小学生')
elif age < 18:
print('中学生')
else:
print('大学生')

# for...in
for i in range(5): # 0 1 2 3 4
print(i)
for i in dic: # 遍历字典
print(dic[i])

# while
i = 0
while i < 5:
print(i)
i += 1

# break/continue
for i in range(5):
if i == 3:
break # 跳出循环
if i == 2:
continue # 跳过本次循环
print(i)

i = 0
while i < 5:
if i == 3:
break # 跳出循环
if i == 2:
i += 1
continue # 跳过本次循环
print(i)
i += 1

可迭代对象

  • 可迭代对象是指可以使用 for...in 循环的对象
  • 可以使用 iter() 函数转换为迭代器
  • 迭代器可以使用 next() 函数获取下一个值
  • list() 函数可以将可迭代对象或迭代器转换为列表
1
2
3
4
5
6
7
8
9
10
11
# 可迭代对象
lis = [1, 2, 3]
dic = {'name': 'xiaoyezi', 'age': 18}
# 迭代器
lis_iter = iter(lis)
dic_iter = iter(dic)
# 获取下一个值
print(next(lis_iter)) # 1
print(next(lis_iter)) # 2
print(next(lis_iter)) # 3
print(next(list_iter)) # StopIteration

错误处理

1
2
3
4
5
6
7
8
try: # try 代码块用于捕获异常
raise Exception('错误') # 抛出异常
except Exception as e: # except 代码块用于处理异常
print(e)
else: # else 代码块用于没有异常时执行
pass # pass 语句表示什么都不做
finally: # finally 代码块用于无论是否发生异常都会执行
print('最后执行')
raise 可以抛出的异常描述
Exception('msg')常规错误的基类
AttributeError('msg')对象没有这个属性
OSError('msg')操作系统产生的异常
IndexError('msg')索引超出序列范围
KeyError('msg')字典中没有这个键
NameError('msg')未声明/初始化对象
SyntaxError('msg')语法错误
TypeError('msg')操作或函数应用于不适当类型的对象
ValueError('msg')传入无效的参数

文件操作

  • 在文件操作中, with open() as f 语句可以自动关闭文件, 不需要手动调用 f.close()
  • open('path', 'mode'[, encoding='utf-8']) 函数用于打开文件
  • mode 可以是 r(只读)、w(只写)、a(追加)、b(二进制文件)、r+/w+/a+(读写)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 打开文件
with open('demo.txt', 'a', encoding='utf-8') as f:
# 写入文件
f.write('Hello, world!\n')
# writelines() 用于将列表中的字符串写入文件
f.writelines(['Hello, world!\n', 'Hello, world!\n'])
# 读取文件
content = f.read() # 读取整个文件
content = f.readline() # 读取一行
content = f.readlines() # 读取所有行, 返回一个列表
# json.dumps() 用于将字典转换为字符串
f.write(json.dumps(dic) + '\n')
# 读取文件并转换为字典
content = json.loads(f.read())

函数

  • *** 相当于 JavaScript 中的 ...(展开运算符), 不过 * 是展开为元组, ** 是展开为字典
  • 函数可以返回多个值, 用逗号隔开(括号选加), 返回的是一个元组
  • 函数有自己的作用域, 内部变量不能被外部访问
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 定义函数
def add(arg1, arg2=1):
return arg1 + arg2

# 调用函数
num1 = 1
num2 = 2
print(add(num1, num2)) # 3
# 用 形参=实参 的方式调用函数, 可以不按照顺序传参
print(add(arg2=num2, arg1=num1)) # 3

# 可变参数
# 将多个参数收集到一个元组中
def add(*args):
print(args) # (1, 2, 3)
sum = 0
for i in args:
sum += i
return sum
print(add(1, 2, 3)) # 6

# 关键字参数
# 将多个关键字参数收集到一个字典中
def add(**kwargs):
print(kwargs) # {'a': 1, 'b': 2, 'c': 3}
sum = 0
for i in kwargs:
sum += kwargs[i]
return sum
print(add(a=1, b=2, c=3)) # 6

# 匿名函数
lambda arg1, arg2: arg1 + arg2
# 一般用作回调函数或立即执行函数
(lambda arg1, arg2: arg1 + arg2)(1, 2) # 3

模块

1
2
3
4
5
6
7
8
9
10
11
# 导入模块
import math
import random
# 导入模块中的函数
from math import sqrt
from random import randint
# 可以对模块或函数起别名
import math as m
from math import sqrt as s
# 查看模块中的所有函数
print(dir(math))

Python 的模块就是一个 .py 文件, 可以包含函数、类、变量等; 模块名就是文件名去掉 .py 后缀; 本地的 .py 文件优先级高于系统的模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 定义类
class Person:
# 实例属性
name = '小叶子'
# 构造函数
def __init__(self, age):
self.age = age
# 实例方法
def say(self): # 第一个参数必须是 self
print(f'我叫{name}, 我今年{self.age}岁')

# 创建实例
p = Person(18)
p.say() # 我叫小叶子, 我今年18岁

继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 定义父类
class Animal:
def __init__(self, name):
self.name = name
def run(self):
print(f'{self.name} is running')

# 定义子类
class Dog(Animal):
def __init__(self, name, age):
super().__init__(name) # 调用父类的构造函数
self.age = age
def bark(self):
print(f'{self.name} is barking')

# 创建实例
d = Dog('旺财', 3)
d.run() # 旺财 is running
d.bark() # 旺财 is barking

可以在子类中重写父类的方法, 也可以在子类中调用父类的方法 super().method()

多重继承

1
2
3
4
5
6
7
8
9
10
11
12
13
class Animal:
def __init__(self, name):
self.name = name

class Person:
def __init__(self, age):
self.age = age

class Student(Animal, Person):
def __init__(self, name, age, grade):
Animal.__init__(self, name)
Person.__init__(self, age)
self.grade = grade

类型注解

Python 是一种动态类型语言, 不需要声明变量类型, 但是可以使用类型注解来提高代码的可读性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 变量
name: str = 'xiaoyezi'
age: int = 18
# 函数
def add(arg1: int, arg2: int) -> int:
return arg1 + arg2
# 多种可能的类型(Python 3.10+)
def func(arg: int | str) -> int | str:
return arg
# 类
class Person:
name: str
age: int
def __init__(self, name: str, age: int):
self.name = name
self.age = age

语法类似于 TypeScript, 但是似乎没有类型检查?

生成器

  • 生成器是一种特殊的迭代器, 可以使用 yield 关键字来生成值
  • 生成器可以使用 next() 函数获取下一个值
  • 生成器可以使用 for...in 循环来遍历值
  • 生成器可以使用 list() 函数将其转换为列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 生成器
def gen():
yield 1
yield 2
yield 3
g = gen()
print(next(g)) # 1
print(next(g)) # 2
print(next(g)) # 3
print(next(g)) # StopIteration
# 生成器表达式
g = (i for i in range(5))
print(next(g)) # 0
print(next(g)) # 1
print(next(g)) # 2
print(next(g)) # 3
print(next(g)) # 4
print(next(g)) # StopIteration
# for...in 循环
for i in g:
print(i) # 1 2 3
# 转换为列表
print(list(g)) # [1, 2, 3]

⭐进阶

pip

pipPython 的包管理工具, 用于安装、卸载、升级 Python

命令描述
pip install --upgrade pip升级 pip
pip install package[==version]安装包
pip uninstall package卸载包
pip install --upgrade package升级包
pip list查看已安装的包
pip show package查看包的信息
pip search package搜索包
pip freeze > requirements.txt导出已安装的包到文件
pip install -r requirements.txt从文件安装包

不同于 npm, pip 安装的包是全局的, 不会安装到项目目录下

pyinstaller

pyinstaller 是一个用于将 Python 代码打包成可执行文件的工具

命令描述
-F/--onefile打包成单个可执行文件
-D/--onedir打包成一个目录(默认)
-w/--noconsole/--windowed运行时不显示控制台(Windows
--icon=icon.ico指定图标文件(Windows
--name=app/-n app指定可执行文件的名称
--out=dist/-o dist指定输出目录
1
2
3
4
5
6
# 安装
pip install pyinstaller
# 打包
pyinstaller -F main.py
# 常见设置
pyinstaller -F -w --icon=favicon.ico -n leaf main.py

🚧PsychoPy

PsychoPy 是一个用于心理学实验的 Python 库, 相比于 jsPsych, 它的计时精度更高

1
2
# 安装
pip install psychopy
  • 标题: Python学习笔记
  • 作者: 小叶子
  • 创建于 : 2024-03-13 11:51:10
  • 更新于 : 2024-05-20 15:13:42
  • 链接: https://blog.leafyee.xyz/2024/03/13/Python学习笔记/
  • 版权声明: 版权所有 © 小叶子,禁止转载。
评论