在写 Python 程序的时候,如果你发现自己不停地在写重复的代码,那说明你需要函数来帮你省事了。
参考文章: Python 函数 | 简单一点学习 easyeasy.me
目录
- 什么是函数?
- 为什么要用函数?
- 如何定义函数(def 语法)
- 函数参数的各种花样(位置参数、默认值、可变参数)
- 函数的返回值
- 变量作用域(局部变量 vs 全局变量)
- 匿名函数 lambda
- 函数作为参数传递
- 嵌套函数和闭包
- 装饰器(进阶)
- 实战:写几个有用的函数
1. 什么是函数?
函数就是把一段代码封装起来,给它起个名字,以后想用的时候直接调用名字就行。
比如你写了个计算两个数相加的功能:
def add(a, b):
return a + b
你只要写好一次,之后用 add(3, 4)
就能得到 7
。
2. 为什么要用函数?
几个原因:
- 复用性高:写一次,用多次;
- 代码更清晰:每段代码都表达一个明确功能;
- 方便维护:改一个地方,所有地方都生效;
- 避免重复:不复制粘贴,写得更优雅。
3. 如何定义函数(def 语法)
用 def
关键词来定义函数:
def greet(name):
print("Hello,", name)
调用方法:
greet("Tom") # 输出:Hello, Tom
注意:
- 函数名尽量见名知意;
- 函数体缩进(4 空格)是必须的;
return
可以返回值,也可以没有。
4. 函数参数的各种花样
Python 的函数参数可以有很多种写法,主要有这些:
📌 位置参数
最常见的,就是你传几个值,函数就按顺序接收。
def say_hello(name, age):
print(f"{name} is {age} years old.")
📌 默认参数
有些参数可以不传,给它设置一个默认值。
def greet(name="Guest"):
print("Hi", name)
📌 可变参数 *args
接收任意数量的位置参数(会变成元组):
def add_all(*numbers):
return sum(numbers)
add_all(1, 2, 3, 4) # 结果是 10
📌 关键字参数 **kwargs
接收任意数量的键值对参数(会变成字典):
def print_info(**kwargs):
for key, value in kwargs.items():
print(key, ":", value)
print_info(name="Alice", age=20)
5. 函数的返回值
用 return
把值返回出去:
def double(x):
return x * 2
result = double(5) # result 是 10
如果不写 return
,函数默认返回 None
。
可以返回多个值(其实是个元组):
def calc(a, b):
return a + b, a * b
s, p = calc(2, 3)
6. 变量作用域(局部变量 vs 全局变量)
局部变量(local)
只在函数内部能用:
def test():
x = 10 # x 是局部变量
全局变量(global)
在整个文件中都能用的变量:
x = 5
def change():
global x
x = 10
注意:不要滥用全局变量,会让代码难维护。
7. 匿名函数 lambda
lambda 是一种简洁写法,适合只用一次的小函数:
double = lambda x: x * 2
print(double(4)) # 输出 8
常见用法是搭配 map
、filter
等函数。
8. 函数作为参数传递
Python 中,函数本身也是“值”,可以当参数传:
def apply(f, x):
return f(x)
print(apply(lambda x: x**2, 5)) # 输出 25
9. 嵌套函数和闭包
函数里可以再定义函数:
def outer(msg):
def inner():
print("Message:", msg)
return inner
f = outer("Hi")
f() # 输出 Message: Hi
这种结构叫“闭包”,可以记住外层函数的变量。
10. 装饰器(进阶)
装饰器是个“函数改造器”,用来给函数加功能而不改源码,后续文章我会专门讲解装饰器如何定义与使用:
def logger(func):
def wrapper(*args, **kwargs):
print("Calling", func.__name__)
return func(*args, **kwargs)
return wrapper
@logger
def greet(name):
print("Hello", name)
greet("Bob")
运行结果:
Calling greet
Hello Bob
11. 实战:写几个有用的函数
统计一个字符串中某个字符出现的次数
def count_char(s, ch):
return s.count(ch)
判断一个数是不是素数
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n**0.5)+1):
if n % i == 0:
return False
return True
生成一个斐波那契数列
def fib(n):
seq = [0, 1]
for i in range(2, n):
seq.append(seq[-1] + seq[-2])
return seq[:n]