1. 函数目的
函数的目的是将一段代码封装起来,以便在其他地方重复使用,提高代码的复用性和可维护性。同时,函数还可以将复杂的操作分解为简单的步骤,使得代码更加清晰易懂。
2. 函数定义
在Python中,使用def
关键字来定义函数。函数定义的一般形式为:
def 函数名(参数列表):
# 函数体
return 返回值
其中,函数名
是自定义的,用于标识函数;参数列表
是传递给函数的值或变量名列表,可以没有;函数体
是函数被调用时执行的代码块;return
语句用于返回函数执行的结果,也可以没有。
3. 函数声明(在Python中不太适用此术语)
在Python中,我们通常不说“函数声明”,因为def
关键字已经完成了函数的定义和声明。在其他一些编程语言中,函数声明指的是函数原型或仅声明函数的存在而不定义其体。
4. 函数调用
函数定义完成后,可以通过函数名加圆括号(可包含实参)的形式来调用函数。例如:
result = 函数名(参数1, 参数2, ...)
5. 函数形参
形参(形式参数)是函数定义时括号内的参数,用于接收调用函数时传递的实参值。
6. 函数实参
实参(实际参数)是调用函数时传递给函数的值或变量。
7. 函数返回值
函数可以通过return
语句返回一个值给调用者。如果函数没有return
语句或执行了return
但没有指定返回值,则默认返回None
。
8. 函数的参数类型
Python是动态类型语言,函数的参数不需要指定类型。Python解释器会根据传递给函数的值自动确定参数的类型。
def sleep(n,m,a,*args,s,info="1234",**kwargs):
'''
:param n: 位置参数,按位置依次赋值
:param m: 位置参数,按位置依次赋值
:param a: 位置参数,按位置依次赋值
:param args: 可变元组参数,前面位置参数传递完后,接收之后所有的位置参数
:param info: 默认参数 没有传递值则按默认值进行
:param s:关键字赋值 给指定变量赋值
:param kwargs: 接受除形参中出现的关键字参数以外的所有以关键字形式赋值的实参,以字典的形式存储
:return:
'''
print(n,m,a,args,s,info,kwargs)
print(n)#输出1
print(m)#输出2.2
print(a)#输出3
print(args)#输出(3,3,4,5)
print(s)#输出4
print(info)#输出1234
print(kwargs)#输出{'f': 4, 'g': 6, 'j': 9}
sleep(1,2.2,3,3,3,4,5,s=4,f=4,g=6,j=9)
9. 变量的作用与(global与nonlocal)
在Python中,变量的作用域决定了变量的可见性和生命周期。了解全局变量(global)和非局部变量(nonlocal)对于编写复杂和可维护的代码至关重要。
9.1 全局变量
全局变量是在函数外部定义的变量,它们在程序的整个执行过程中都是可见的。如果在函数内部需要修改全局变量的值,需要使用global
关键字来声明该变量是全局的。
x = 10 # 全局变量
def func():
global x # 声明x是全局变量
x = 20
func()
print(x) # 输出: 20
9.2非局部变量
非局部变量是嵌套函数中的概念。当一个函数内部定义了另一个函数,并且内部函数需要修改外部函数(但不是全局作用域)中的变量时,就需要使用nonlocal
关键字来声明这个变量。
def outer():
x = "local"
def inner():
nonlocal x # 声明x是非局部变量
x = "nonlocal"
inner()
print(x) # 输出: nonlocal
outer()
10. 递归函数
递归函数是一种在函数体内调用自身的函数。递归函数常用于解决可以分解为更小相似问题的问题,如阶乘、树的遍历、图的搜索等。
递归函数需要满足两个基本条件:
- 基准情形(Base Case):这是递归的终止条件,即递归函数不再调用自身的情况。
- 递归步骤(Recursive Step):这是函数体中将问题分解为更小问题的步骤,这些更小的问题通过递归调用解决。
示例:计算阶乘
def factorial(n):
# 基准情形
if n == 0:
return 1
# 递归步骤
else:
return n * factorial(n-1)
print(factorial(5)) # 输出: 120
11.匿名函数
匿名函数是没有名称的函数,Python中使用lambda
关键字来创建匿名函数。lambda
函数可以接受任意数量的参数,但只能有一个表达式。其基本语法为:
lambda 参数列表: 表达式
例如,一个计算两个数之和的lambda
函数可以表示为:
add = lambda x, y: x + y
这个lambda
函数可以被赋值给变量add
,然后通过add(1, 2)
来调用,返回结果为3。
12. 闭包
闭包(Closure)是函数式编程中的一个重要概念,它指的是一个函数记住了其外部作用域中的变量,并且这些变量在函数被调用时仍然可用。在Python中,闭包是通过嵌套函数实现的,其中内部函数引用了外部函数的局部变量。
def outer_function(text):
def inner_function():
print(text)
return inner_function # 注意这里返回的是函数对象,而不是函数的调用结果
# 使用闭包
my_closure = outer_function("Hello, world!")
my_closure() # 输出: Hello, world!
在这个例子中,outer_function
是一个外部函数,它接受一个参数 text
并定义了一个内部函数 inner_function
。inner_function
使用了 text
变量,但 text
并不是 inner_function
的参数,而是来自其外部作用域(即 outer_function
的作用域)。当 outer_function
被调用时,它返回了 inner_function
函数对象本身,而不是调用 inner_function
的结果。这样,我们就创建了一个闭包,它记住了 text
变量的值,即使 outer_function
的执行已经结束。
13. 装饰器
装饰器(Decorator)是Python中一种高级功能,它允许你在不修改原有函数代码的情况下,给函数增加新的功能。装饰器本质上是一个函数,它接受一个函数作为参数并返回一个新的函数。
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()
# 输出:
# Something is happening before the function is called.
# Hello!
# Something is happening after the function is called.
在这个例子中,my_decorator
是一个装饰器函数,它接受一个函数 func
作为参数,并返回一个新的函数 wrapper
。wrapper
函数在调用原始函数 func
前后执行了一些额外的操作(在这个例子中是打印一些文本)。通过 @my_decorator
语法,我们告诉Python将 say_hello
函数作为参数传递给 my_decorator
装饰器,并用 my_decorator
返回的新函数(即 wrapper
)替换原来的 say_hello
函数。因此,当调用 say_hello()
时,实际上调用的是 wrapper()
函数。