一、函数

1.1 定义与调用

def 关键字定义函数,不需要声明返回类型:

1
2
3
4
5
6
def greet(name):
"""这是一个文档字符串(docstring),描述函数功能。"""
return f"Hello, {name}!"

print(greet("Python")) # Hello, Python!
print(greet.__doc__) # 查看文档字符串

1.2 参数类型

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
# 位置参数 + 默认参数
def greet(name, greeting="Hello"):
return f"{greeting}, {name}!"

print(greet("小明")) # Hello, 小明!
print(greet("小明", greeting="你好")) # 你好, 小明!

# 关键字参数(调用时指定参数名,顺序可以任意)
print(greet(greeting="Hi", name="小红")) # Hi, 小红!

# 可变参数 *args(数量不定,打包为元组)
def sum_all(*numbers):
return sum(numbers)

print(sum_all(1, 2, 3)) # 6
print(sum_all(1, 2, 3, 4, 5)) # 15

# 关键字可变参数 **kwargs(打包为字典)
def print_info(**info):
for key, value in info.items():
print(f"{key}: {value}")

print_info(name="小明", age=22)
# name: 小明
# age: 22

1.3 参数顺序

完整顺序:**位置参数 → *args → 关键字参数 → kwargs

1
2
3
4
5
6
7
8
9
10
11
def func(a, b, *args, c=10, d=20, **kwargs):
print(f"a={a}, b={b}")
print(f"args={args}")
print(f"c={c}, d={d}")
print(f"kwargs={kwargs}")

func(1, 2, 3, 4, 5, c=100, name="test", age=22)
# a=1, b=2
# args=(3, 4, 5)
# c=100, d=20
# kwargs={'name': 'test', 'age': 22}

1.4 lambda 匿名函数

一行代码的小函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 普通函数
def square(x):
return x ** 2

# lambda 写法
square = lambda x: x ** 2

# 常用场景:配合 map / filter / sorted
numbers = [1, 2, 3, 4, 5]
squares = list(map(lambda x: x ** 2, numbers)) # [1, 4, 9, 16, 25]
evens = list(filter(lambda x: x % 2 == 0, numbers)) # [2, 4]

pairs = [(1, 'b'), (2, 'a'), (3, 'c')]
sorted_pairs = sorted(pairs, key=lambda p: p[1]) # 按第二个元素排序

二、面向对象

2.1 类与对象

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
class Student:
# 类变量(所有对象共享)
school = "华北水利水电大学"

# 构造方法
def __init__(self, name, age):
self.name = name # 实例变量
self.age = age
self._private = 0 # 约定:单下划线表示"私有"(约定,非强制)
self.__secret = "hidden" # 双下划线会触发名称改写(name mangling)

# 实例方法
def study(self):
print(f"{self.name} 正在学习")

# 魔法方法:定义对象的字符串表示
def __str__(self):
return f"Student(name={self.name}, age={self.age})"

# 魔法方法:供调试使用的表示
def __repr__(self):
return f"Student({self.name!r}, {self.age!r})"


# 创建对象
s1 = Student("小明", 22)
s2 = Student("小红", 21)

print(s1.school) # 华北水利水电大学
s1.study() # 小明 正在学习
print(s1) # Student(name=小明, age=22)

2.2 常用魔法方法

方法 用途 示例
__init__ 构造方法 obj = MyClass()
__str__ print(obj) 时的显示 str(obj)
__repr__ 调试显示(交互环境) repr(obj)
__len__ 长度 len(obj)
__eq__ 等于比较 obj1 == obj2
__lt__ 小于比较 obj1 < obj2
__getitem__ 索引访问 obj[0]
__enter__/__exit__ 上下文管理器 with obj:

2.3 继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Animal:
def __init__(self, name):
self.name = name

def eat(self):
print(f"{self.name} 在吃东西")


class Dog(Animal):
def __init__(self, name, breed):
super().__init__(name) # 调用父类构造方法
self.breed = breed

def eat(self): # 重写父类方法
print(f"{self.name} 在啃骨头")

def bark(self):
print(f"{self.name} 汪汪叫")


dog = Dog("旺财", "金毛")
dog.eat() # 旺财 在啃骨头 —— 调用重写后的版本
dog.bark() # 旺财 汪汪叫

Python 支持多继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A:
def method(self):
print("A.method")

class B:
def method(self):
print("B.method")

class C(A, B): # 多继承,MRO 决定查找顺序
pass

c = C()
c.method() # A.method(按 C -> A -> B 的顺序查找)
print(C.__mro__) # 查看方法解析顺序

三、装饰器

@ 语法,在不修改原函数的前提下增加功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 定义装饰器
def timer(func):
import time
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
elapsed = time.time() - start
print(f"{func.__name__} 耗时 {elapsed:.4f}s")
return result
return wrapper

# 使用装饰器
@timer
def slow_function():
import time
time.sleep(0.1)
return "done"

result = slow_function()
# 输出:slow_function 耗时 0.1002s

四、上下文管理器

with 语句自动管理资源(打开/关闭、加锁/解锁):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 文件操作
with open("test.txt", "w", encoding="utf-8") as f:
f.write("Hello")
# 自动关闭,即使发生异常也不会忘记 close

# 自定义上下文管理器
class MyContext:
def __enter__(self):
print("进入上下文")
return self

def __exit__(self, exc_type, exc_val, exc_tb):
print("退出上下文")

with MyContext() as ctx:
print("执行操作")
# 进入上下文
# 执行操作
# 退出上下文

五、与 Java 的关键对比

概念 Java Python
构造方法名 与类同名 __init__
访问控制 private/protected/public 约定(下划线)
方法重载 支持(按参数数量/类型) 不支持(后定义覆盖前定义)
多继承 不支持(用接口) 支持
this/self this(隐式) self(显式,约定)
接口 interface 用抽象基类或鸭子类型
静态方法 static @staticmethod
抽象方法 abstract @abstractmethod

本系列导航

  • (一)变量与数据类型
  • (二)流程控制
  • (三)函数与面向对象 ← 当前