Python基础

Python介绍

解释型、简单、应用广泛

列表list

列表最适合存放一组有顺序、可重复、可修改的数据。

number_list = [1, 3, 5, 7, 9]
mixed_list = ["tom", 18, True, 9.9]

浅拷贝与深拷贝

注意:浅拷贝只复制第一层,嵌套对象仍然共享引用

元组tuple

point = (10, 20)
# 元组不可变,适合表示一组固定数据。

字典dict

phone_book = {"Tom": 123, "Jerry": 456, "Kim": 789}

集合set

  • {3, 5} 是一个集合
  • {} 不是空集合,而是空字典
  • 真正的空集合要写成 set()
unique_numbers = {1, 2, 3, 4, 5}

全局变量和局部变量

num = 10

def fun() -> None:
    num = 100
    print("函数内部的 num:", num)

fun()
print("函数外部的 num:", num)
#函数内部的 num: 100
#函数外部的 num: 10

*args 和 **kwargs

  • *args 用来接收额外的位置参数,接收后是元组
  • **kwargs 用来接收额外的关键字参数,接收后是字典
def collect_scores(*scores: int, **metadata: str) -> None:
    print("scores:", scores)
    print("metadata:", metadata)

collect_scores(90, 95, 88, student="tom", course="python")
#scores: (90, 95, 88)
#metadata: {'student': 'tom', 'course': 'python'}

* 和 ** 在调用处拆包

values = (1, 2, 4)
items = [11, 15, 23]

show_args(*values, **data)

lambda 表达式

add = lambda a, b: a + b
print(add(1, 2))  # 3

脚本入口写法

__name__ == "__main__" 是什么?

def main() -> None:
    print("run script")

if __name__ == "__main__":
    main()

作用:直接运行当前文件时执行 main(),被别的文件导入时不执行。

写文件

with open("output.txt", "w") as file:
    file.write("Hello, world!")

匿名函数、map、filter

mapfilter 常和 lambda 一起用:

numbers = [2, 22, 8, 12, 27]

# filter:筛出大于 3 的项
greater_items = list(filter(lambda item: item > 20, numbers))

# map:每项乘 2
doubled = list(map(lambda item: item * 2, greater_items))

print(greater_items)
print(doubled)

装饰器

# ========== 1. 定义装饰器 ==========
def my_decorator(func):
    def wrapper():
        print(">>> 函数执行前")
        func()              # 调用原始函数
        print("<<< 函数执行后")
    return wrapper

# ========== 2. 使用装饰器 ==========
@my_decorator
def say_hello():
    print("Hello, World!")

# ========== 3. 调用 ==========
say_hello()

带参数的装饰器本质上是在简单装饰器外面再包一层函数,用来接收参数。

推导式表达式

列表推导式

# 列表推导式生成列表,用0~4的数字分别乘以2
numbers = [i * 2 for i in range(5)]
print(numbers) #[0, 2, 4, 6, 8]

字典推导式

scores = {"tom": 80, "alex": 90, "rose": 85}
new_scores = {name: score + 5 for name, score in scores.items()}
print(new_scores) #{'tom': 85, 'alex': 95, 'rose': 90}

生成器表达式

numbers = [i * 2 for i in range(5)]   # 列表推导式
generator = (i * 2 for i in range(5)) # 生成器表达式
# 使用 next() 获取生成器的下一个值
print(next(generator)) # 输出 0
print(next(generator)) # 输出 2
print(next(generator)) # 输出 4

面向对象

Python支持多继承,多个父类有相同函数时,子类用super()调用父类的函数,只执行先继承的。
Python没有接口,所以实现多态也不用约束,是鸭子类型多态

NumPy

d 维度,ndarray n维数组

matrix = np.array([
    [1, 2, 3],
    [4, 5, 6],
])

print(matrix.shape)  # (2, 3)
print(matrix.ndim)   # 2

Pandas

DataFrame 是 Pandas 最核心的数据结构,可以理解为“带行列标签的二维表格”。

import pandas as pd

scores = [
    [88, 91, 95],
    [76, 85, 82],
]

df = pd.DataFrame(
    scores,
    index=["张三", "李四"],
    columns=["语文", "英语", "数学"],
)
print(df)
#打印
"""
    语文  英语  数学
张三  88  91  95
李四  76  85  82
""" 
# 从 CSV 文件读取数据
# df = pd.read_csv("sales.csv")

lociloc

Pandas 中两个特别重要的定位方式是:

  • loc:按标签取值
  • iloc:按位置取值
import pandas as pd

df = pd.DataFrame({
    "name": ["Alice", "Bob", "Cindy"],
    "score": [88, 92, 79],
}, index=["a", "b", "c"])

print(df.loc["b", "score"])  
# 按标签取值:取行index赋值的标签为 b、列标签为 score 的单元格,结果是 92
print(df.iloc[1, 1])  
# 按位置取值:取第 2 行、第 2 列的单元格,结果也是 92