一、定义一个函数

用 def 关键字定义函数,冒号后缩进的部分就是函数体。

def greet(name):
    print("你好," + name)

greet("建建")   # 你好,建建

二、参数的种类

位置参数与默认参数

def power(base, exp=2):
    return base ** exp

print(power(3))       # 9,exp 用默认值
print(power(3, 3))    # 27

关键字参数

调用时指定参数名,顺序就可以打乱,可读性也更好。

def profile(name, age):
    print(name, age)

profile(age=22, name="建建")   # 建建 22

不定长参数 *args / **kwargs

def total(*args):
    return sum(args)

print(total(1, 2, 3, 4))   # 10

def show(**kwargs):
    for k, v in kwargs.items():
        print(k, "=", v)

show(name="建建", city="成都")

三、返回值

用 return 返回结果;没有 return 时函数默认返回 None。函数可以返回多个值,其实返回的是一个元组。

def min_max(nums):
    return min(nums), max(nums)

low, high = min_max([3, 1, 8, 2])
print(low, high)   # 1 8

四、lambda 匿名函数

lambda 适合写只有一行的简单函数,常配合排序、过滤一起用。

square = lambda x: x * x
print(square(5))   # 25

people = [("建建", 22), ("小明", 19)]
people.sort(key=lambda item: item[1])
print(people)      # [('小明', 19), ('建建', 22)]

五、作用域:局部与全局

函数内部定义的变量是局部变量,只在函数内有效;函数外部的是全局变量。函数内可以直接读取全局变量,但要修改它需要 global。

count = 0

def add():
    global count
    count += 1

add()
add()
print(count)   # 2
Python 查找变量遵循 LEGB 规则:Local(局部)→ Enclosing(闭包)→ Global(全局)→ Built-in(内置)。记住这个顺序,作用域问题基本都能想明白。

六、小结