函数
在编程中,函数是一段可重复使用的代码块,它可以接受输入参数,处理数据,然后返回输出。函数可以提高代码的复用性和可读性。也就是说,函数是一种封装,它将一些代码封装在一起,然后通过调用函数来执行这些代码。
但并不是一味的封装,函数的设计应该遵循高内聚低耦合的原则,不能看似相同的代码就封装成函数。
定义函数
在 Python 中,使用 def
关键字来定义函数,语法如下:
1 | def function_name(parameters): |
其中:
def
是定义函数的关键字。function_name
是函数的名称,命名规则和变量一样。parameters
是函数的参数,可以有多个参数,也可以没有参数。function body
是函数的主体,包括一些代码块。return
是函数的返回值,可以有也可以没有。
调用函数
定义函数之后,就可以通过函数名来调用函数,语法如下:
1 | function_name(arguments) |
函数参数
函数参数指函数的输入,可以有多个参数,也可以没有参数。参数分为形参和实参。
形参:定义函数时,函数名后面的变量,用来接收调用函数时传递的参数。
实参:调用函数时,传递给函数的参数。
形参和实参只是名称上的区别,相当于在函数调用前声明了一个变量 1(实参),然后调用一个函数时,把这个变量 1 的值赋给了函数内部的变量 2(形参)。
那么当我们在函数内部修改形参的值时,实参的值会不会改变呢?
不可变类型与可变类型
对于不可变类型(数字、字符串、元组),函数内部修改形参的值,实参的值不会改变。
对于可变类型(列表、字典、集合),函数内部修改形参的值,实参的值会改变。
1 |
|
在上面的例子中,name
是字符串类型,info
是字典类型。在函数内部修改形参的值时,name
的值没有改变,info
的值改变了。
这是因为 python 中的变量是一个指针,然后将这个指针传递给函数,所以形参和实参指向的是同一个内存地址。在赋值时,param_1
重新指向了一个新的内存地址,而 param_2
指向的内存地址没有改变,只是修改了内存地址中的值。而实参的 name 和 info 指向的内存地址没有改变。也就是说,当在函数内部修改可变类型的地址时,实参的值也不会改变。
1 | def func_2(param_1: str, param_2: dict): |
在上面的例子中,param_2
重新指向了一个新的内存地址,所以实参的值没有改变。
函数返回值
函数的返回值是函数的输出,可以有也可以没有。如果没有返回值,函数默认返回 None
。
1 | def func_3(): |
匿名函数
在 Python 中,使用 lambda
关键字来创建匿名函数,语法如下:
1 | lambda parameters: expression |
其中:
lambda
是创建匿名函数的关键字。parameters
是函数的参数。expression
是函数的返回值。
匿名函数的特点:
- 匿名函数没有名称。
- 匿名函数只能包含一个表达式。
- 匿名函数的返回值是表达式的结果。
1 | add = lambda x, y: x + y |
不过在实际开发中,匿名函数的使用频率并不高,因为匿名函数只能包含一个表达式,所以它的功能比较单一,而且可读性不高。
内置函数
Python 中有很多内置函数,可以直接使用,无需导入模块。常用的内置函数有:
print()
:打印输出。input()
:接收用户输入。len()
:返回对象的长度。type()
:返回对象的类型。int()
:将一个字符串或数字转换为整数。float()
:将一个字符串或数字转换为浮点数。str()
:将一个对象转换为字符串。list()
:将一个对象转换为列表。dict()
:将一个对象转换为字典。tuple()
:将一个对象转换为元组。set()
:将一个对象转换为集合。range()
:生成一个整数序列。