函数也叫方法,它封装了一定的功能,减少了重复代码的编写,提升代码的复用。
1.函数目的
Python函数的主要目的是减少代码冗余,增加程序的可扩展性和维护性,提高应用的模块性和代码的重复利用率,避免重复编写代码,保持代码的一致性,方便修改,更易于扩展。
Python中的函数概念是实现程序模块化和可维护性的关键。通过将程序分解为多个函数,可以使得代码更加易于理解和测试。具体包括:
- 减少代码冗余:通过将重复的代码块封装成函数,可以在多个地方重复调用该函数,而不是复制粘贴相同的代码,从而减少了代码的冗余。
- 增加程序的可扩展性和维护性:当需要对程序进行修改或扩展时,只需要修改函数的定义,而不需要修改所有调用该函数的地方,提高了程序的维护性。
- 提高应用的模块性:函数可以作为独立的模块,将相关的功能封装在一起,使得程序的结构更加清晰和易于管理。
- 提高代码的重复利用率:通过编写可重用的函数,可以在多个地方使用相同的代码逻辑,避免了重复编写相同的代码。
- 避免重复编写代码:函数的编写使得代码更容易理解、测试和维护。
- 保持代码的一致性:使用函数可以方便地修改代码的行为,同时保持代码的一致性和可扩展性。
2.函数定义
函数定义以关键字def
开始,后面接函数名称和圆括号,之后是圆括号内的参数列表,圆括号后是冒号。之后是缩进的函数体,包含执行语句。函数可以有返回值,通过return
语句返回。
def hello() :
print("Hello World!")
hello()
'''
运行结果为
Hello World!
'''
def max_num(a, b):
if a > b:
return a
else:
return b
print(max_num(4, 5))
'''
运行结果为
5
'''
3.函数声明
在函数体中加一个文本注释,为函数声明,用''' '''。
def max_num(a, b):
'''
:param a: 第一个数a
:param b:第二个数b
:return:a大返回a b大返回b
'''
if a > b:
return a
else:
return b
4.函数调用
在Python中,函数的调用非常直接,只需要函数名后跟上圆括号,如果函数需要参数,则在圆括号内指明参数。
# 定义函数
def printme( str ):
# 打印任何传入的字符串
print (str)
return
# 调用函数
printme("我要调用用户自定义函数!")
printme("再次调用同一函数")
'''
运行结果为:
我要调用用户自定义函数!
再次调用同一函数
'''
5.函数形参
Python中的形参(形式参数)是函数定义中的参数,它们在函数被调用时接收实际的值(实参)。
形参的类型
- 常规形参:仅包含参数名称,没有默认值,调用时必须提供实际值。例如,
def func(x, y): pass
中,x
和y
是常规形参。 - 默认值形参:在定义时可以指定一个默认值,这样在函数调用时如果省略该参数,将使用默认值。例如,
def func(x, y, z=0): pass
中,z
是一个默认值形参,如果调用时不提供z
的值,它将默认为0。 - 可变长度形参:使用
*args
和==**kwargs
可以接收任意数量的位置参数和关键字参数。例如,def func(*args, **==kwargs): pass
可以接收任意数量和类型的参数。
形参的主要作用是在函数内部提供一个占位符,用于在函数执行时接收从函数外部传入的实际数据。这些数据通过函数调用时提供的实参传递进来,并在函数体内进行操作。
形参的特点
-
命名规则:形参的名称遵循 Python 的标识符命名规则,通常使用有意义的名称来描述参数的作用。
-
数据类型:在函数定义中,形参可以指定数据类型,但 Python 是动态类型语言,通常不需要显式指定数据类型。
-
默认值:可以为形参指定默认值,在函数调用时,如果没有提供对应形参的实参,则使用默认值。
-
顺序:形参可以按位置传递,也可以按关键字传递
注意确保函数定义中的形参名称与函数体内部使用的变量名不会与全局变量或其他函数中的变量名冲突。
6.函数实参
Python函数的实参是指在调用函数时传递给函数的参数。这些参数可以是常量、变量、表达式或函数,它们在函数调用时必须具有确定的值,以便将这些值传递给形参。实参的功能是数据传送,在函数调用中,实参的值被传递给函数的形参。这个过程可以看作是一种赋值操作,其中实参的值被赋给相应的形参,使得函数在执行时可以使用这些值。然而,需要注意的是,形参和实参是独立的变量。当实参的值传递给形参时,它们在内存中是独立的。修改形参的值不会影响实参的值,因为它们是两个不同的变量。
参数传递的方式可以是按值传递或按引用传递,这取决于编程语言的特性。在Python中,实际上是按对象引用传递的,而不是按引用传递。这意味着对象的引用被传递给函数的形参,形参和实参引用同一个对象。当传递可变对象(如列表或字典)时,对形参对象的修改会影响实参。
此外,Python中的函数参数可以是位置参数、关键词参数或带有默认值的参数。位置参数强调参数传递的位置要一一对应,而关键词参数允许通过键=值的形式指定参数,这使函数调用更加清晰且不需要考虑参数的顺序。带有默认值的参数在函数定义时为某些参数指定默认值,这样在函数调用时可以不传入这些参数,使用默认值。
7.函数返回值
在Python中,函数的返回值用于表示函数的结果。你可以使用return
语句来指定函数的返回值。如果函数执行完毕没有return
语句,默认返回None
。
def greet(name):
print(f"Hello, {name}!")
# 没有return语句,默认返回None
result = greet("Bob")
print(result)
# 输出: None 不返回任何值(返回None)
def no_return():
print("This function does not return anything.")
return
result = no_return()
print(result)
# 输出: None 使用return不带任何值(相当于返回None
def add(x, y):
return x + y
result = add(5, 3)
print(result)
# 输出: 8 返回单个值
def get_info():
name = "CSDN"
age = 18
return name, age
name, age = get_info()
print(name) # 输出: CSDN
print(age) # 输出: 18
# 返回多个值
需要注意的是,当函数执行了return,那么函数将会直接结束,返回return返回的值,和break不一样的是,break只能结束当前循环,return直接结束整个函数,无论接下来还有多少内容。
8.函数的参数类型
参数类型:
默认参数:调用没有传值则使用默认值,传值则使用传递的值。
def printinfo(name, age=35):
# "打印任何传入的字符串"
print("名字: ", name)
print("年龄: ", age)
return
# 调用printinfo函数
printinfo(age=50, name="CSDN")
print("------------------------")
printinfo(name="CSDN")
'''
执行结果为:
名字: CSDN
年龄: 50
------------------------
名字: CSDN
年龄: 35
'''
位置参数:按照位置依次顺序赋值。
def max_num(a, b):
if a > b:
return a
else:
return b
print(max_num(9, 11)) # 此时9和11按照顺序位置依次赋值a为9,b为11
'''
执行结果为:
11
'''
关键字参数:通过指明关键字表明要将值赋予哪个,形参关键字参数允许在函数调用时使用参数名称来指定参数值,这种方式可以使函数调用更加清晰和易读,特别是当函数有多个参数且它们具有相同的数据类型或默认值时。
def max_num(a, b=10):
if a > b:
print(a)
else:
print(b)
max_num(b=9, a=11) # 此时9赋值给了关键字b,11赋值给了关键字a
'''
执行结果为:
11
'''
可变参数:
Python支持两种类型的可变参数:位置可变参数和关键字可变参数。位置可变参数使用星号(*)表示,可以接受任意数量的位置参数,并将它们打包成一个元组供函数内部使用。关键字可变参数则允许传入任意数量的关键字参数,并将它们打包成一个字典供函数内部使用。
元组参数:用 *args 声明,属于元组类型,可以接受任意个数实参。
字典参数:用 **kwargs 声明,属于字典类型,可以接受除了形参关键字参数以外的其他关键字
def wake_up(time, *args, info="要迟到了", **kwargs):
print(time)
print(args)
print(info)
print(kwargs)
wake_up(10, "小王", "小李", "小张", msg="上班啦")
# msg=""是形参中未定义的关键字,此时它属于**kwargs
'''
执行结果为:
10
('小王', '小李', '小张')
要迟到了
{'msg': '上班啦'}
'''
9.匿名函数
Python中的匿名函数,也称为lambda函数,是一种没有名字的函数。它们用于定义简单的、能够在一行内表示的函数,通常用于需要一个简单函数来执行一些基本操作的情况。
Lambda函数的主要用途:
-
作为参数传递给其他函数:Lambda函数常用于将简单的逻辑作为参数传递给高阶函数,如
map()
、filter()
等。例如,使用Lambda函数和map()
函数可以将列表中的每个元素都平方,或者使用Lambda函数和filter()
函数筛选出列表中的偶数。 -
在高阶函数中使用:Lambda函数可以用于定义一个自定义的排序规则,例如按照学生的成绩进行排序。
-
创建简单的匿名函数:Lambda函数可以用于求两个数的和、一个数的平方等基本操作。
Lambda函数的语法是lambda参数 : 返回值
,其中lambda
是保留字,用于定义匿名函数。Lambda函数的函数体只是一个表达式,该表达式的计算结果即为该lambda的返回值。Lambda函数的特点是简洁、高效,非常适合用于那些简单的、不需要复杂逻辑的函数定义。
此外,Lambda函数的应用不仅限于上述场景,它们还可以用于多条件判断、多返回值等复杂情况,尽管在多返回值的情况下会遇到一些限制。例如,尝试直接返回两个值时,会遇到错误,因为匿名函数的返回值在不加修饰的情况下无法直接返回两个或多个值。这体现了匿名函数与有名函数的区别,匿名函数在得到第一个返回值时就会释放变量的内存,无法得到第二个返回值
lambda 函数的语法只包含一个语句。
ambda [arg1 [,arg2,.....argn]]:expression
sum = lambda arg1, arg2: arg1 + arg2
# 调用sum函数
print("相加后的值为 : ", sum(10, 20))
print("相加后的值为 : ", sum(20, 20))
'''
执行结果为:
相加后的值为 : 30
相加后的值为 : 40
'''
10.注意事项:
-
函数是组织和重用代码的方式。
-
函数定义时,需要指定函数名和参数列表,参数是可选的。
-
函数通过
return
语句返回值。 -
函数可以有文档字符串,用于说明函数的功能和参数。
-
函数可以有默认参数,调用时可不提供该参数。
-
函数参数也可以是可变参数,用
*
打包成元组。 -
函数可以有关键字参数,用
**
打包成字典。 -
函数可以同时使用默认参数、可变参数和关键字参数。
-
局部变量是函数内部定义的,全局变量是在函数外部定义的。
-
变量查找顺序是局部变量 > 全局变量 > 内置变量。