明天该休息了,家人们多出去走走
-
函数目的: 函数的目的是执行特定的任务或操作。它可以接受输入(参数),处理这些输入并返回结果,或者在执行过程中直接影响程序的状态或输出。
-
函数定义: 函数定义指的是在代码中创建函数的过程。在Python中,使用
def
关键字来定义函数,后跟函数名、参数列表和冒号,然后是函数体。def my_function(parameter1, parameter2): # 函数体 pass
-
函数声明: 函数声明和函数定义通常是指同一个概念,即在代码中声明并定义函数的过程。
-
函数调用: 函数调用是指在程序中使用函数的过程,以执行函数体内的操作。调用函数时,使用函数名加上括号,并传递所需的参数(如果有的话)。
result = my_function(value1, value2)
-
函数形参: 函数形参是在函数定义时列出的参数名称,用于接受调用函数时传递的实际参数值。形参在函数体内充当局部变量。
def greet(name): print(f"Hello, {name}!") # 这里的 name 是形参 greet("Alice")
-
函数实参: 函数实参是在调用函数时传递给函数的具体数值或变量。实参的值会赋给函数定义中的形参。
def add_numbers(a, b): return a + b # 这里的 3 和 4 是实参 result = add_numbers(3, 4)
-
函数返回值: 函数返回值是函数执行完成后返回给调用者的结果。在Python中,使用
return
语句来返回值。如果函数没有显式使用return
,则默认返回None
。pythonCopy Code
def multiply(a, b): return a * b result = multiply(5, 6) # 返回值是 30
-
函数的参数类型: 在Python中,函数的参数类型是动态的,意味着不需要提前声明参数的类型。函数可以接受任意类型的参数,包括基本类型(如整数、浮点数)、序列类型(如列表、元组)和字典等。
def process_data(data_list): # 处理数据的函数体 pass # data_list 可以是任意类型的序列 process_data([1, 2, 3])
Python 是一种动态类型语言,这意味着函数的参数类型不是在定义函数时指定的,而是在运行时确定的。这种灵活性使得Python在处理各种数据类型和场景时非常便利。
9. 变量的作用域(global 与 nonlocal)
-
全局作用域(Global Scope): 在Python中,定义在模块文件顶层的变量拥有全局作用域,可以在整个模块的任何地方访问。
x = 10 # 全局变量 def foo(): print(x) # 可以访问全局变量 x foo()
-
局部作用域(Local Scope): 在函数内部定义的变量属于局部作用域,只能在函数内部访问。
def foo(): y = 20 # 局部变量 print(y) foo() # print(y) # 这里会报错,y 是 foo 函数的局部变量
-
global 关键字: 如果在函数内部需要修改全局变量的值,可以使用
global
关键字声明变量。x
= 10 # 全局变量 def foo(): global x x = 20 # 修改全局变量 x 的值 foo() print(x) # 输出 20
-
nonlocal 关键字:
nonlocal
关键字用于在嵌套函数中访问并修改嵌套作用域(非全局、非局部)中的变量。def outer(): x = 10 # outer 函数的局部变量 def inner(): nonlocal x x = 20 # 修改 outer 函数的局部变量 x 的值 inner() print(x) # 输出 20 outer()
10. 递归函数
递归函数是指在函数定义中调用自身的函数。递归通常用于解决可以被分解为相同问题的子问题的情况,比如数学上的阶乘或者数据结构的遍历。
def factorial(n): if n == 0: return 1 else: return n * factorial(n-1)
result = factorial(5) # 计算 5 的阶乘 print(result) # 输出 120
递归函数需要有结束条件(base case),否则会导致无限递归,最终导致栈溢出。
11. 匿名函数(Lambda 函数)
匿名函数是一种没有函数名的函数,通常用于需要一个简单函数的地方。在Python中,使用 lambda
关键字来创建匿名函数。
# lambda 函数用于求平方 square = lambda x: x**2 print(square(5)) # 输出 25
匿名函数通常用于函数式编程的场景,例如作为参数传递给高阶函数(如 map
、filter
)或者简化代码中的一些小函数。
12. 闭包(Closure)
闭包指的是延伸了作用域的函数,它可以访问定义体之外定义的非全局变量。通常情况下,闭包允许函数访问其创建时作用域内的变量,即使这些变量在函数调用时不可见。
def outer_func(x):
def inner_func(y): return x + y
return inner_func
closure = outer_func(5)
print(closure(3)) # 输出 8
在这个例子中,inner_func
就是一个闭包,它可以访问外部函数 outer_func
的变量 x
。
13. 装饰器(Decorator)
装饰器是一种特殊的函数,用于修改其他函数的行为。装饰器在不修改函数源代码的情况下,提供了一种方便的方式来包装、扩展或修改函数或方法的功能。
def my_decorator(func):
def wrapper(): print("Something is happening before the function is called.")
func()
print("Something is happening after the function is called.")
return wrapper @my_decorator def say_hello():
print("Hello!") say_hello()
在这个例子中,my_decorator
是一个装饰器函数,它接受一个函数作为参数,并返回一个包装函数 wrapper
。通过 @my_decorator
,我们可以将装饰器应用到 say_hello
函数上,从而改变其行为。