函数
Max Zhang Lv4

函数

在编程中,函数是一段可重复使用的代码块,它可以接受输入参数,处理数据,然后返回输出。函数可以提高代码的复用性和可读性。也就是说,函数是一种封装,它将一些代码封装在一起,然后通过调用函数来执行这些代码。

但并不是一味的封装,函数的设计应该遵循高内聚低耦合的原则,不能看似相同的代码就封装成函数。

定义函数

在 Python 中,使用 def 关键字来定义函数,语法如下:

1
2
3
4
def function_name(parameters):
# function body
print("Hello World")
return expression

其中:

  • def 是定义函数的关键字。
  • function_name 是函数的名称,命名规则和变量一样。
  • parameters 是函数的参数,可以有多个参数,也可以没有参数。
  • function body 是函数的主体,包括一些代码块。
  • return 是函数的返回值,可以有也可以没有。

调用函数

定义函数之后,就可以通过函数名来调用函数,语法如下:

1
function_name(arguments)

函数参数

函数参数指函数的输入,可以有多个参数,也可以没有参数。参数分为形参和实参。

形参:定义函数时,函数名后面的变量,用来接收调用函数时传递的参数。

实参:调用函数时,传递给函数的参数。

形参和实参只是名称上的区别,相当于在函数调用前声明了一个变量 1(实参),然后调用一个函数时,把这个变量 1 的值赋给了函数内部的变量 2(形参)。

那么当我们在函数内部修改形参的值时,实参的值会不会改变呢?

不可变类型与可变类型

对于不可变类型(数字、字符串、元组),函数内部修改形参的值,实参的值不会改变。

对于可变类型(列表、字典、集合),函数内部修改形参的值,实参的值会改变。

1
2
3
4
5
6
7
8
9
10
11
12

def func_1(param_1: str, param_2: dict):
param_1 = "hello"
param_2["name"] = "Tom"

name = "world"
info = {"name": "Jerry"}

func_1(name, info)

print(name) # world
print(info) # {'name': 'Tom'}

在上面的例子中,name 是字符串类型,info 是字典类型。在函数内部修改形参的值时,name 的值没有改变,info 的值改变了。

这是因为 python 中的变量是一个指针,然后将这个指针传递给函数,所以形参和实参指向的是同一个内存地址。在赋值时,param_1 重新指向了一个新的内存地址,而 param_2 指向的内存地址没有改变,只是修改了内存地址中的值。而实参的 name 和 info 指向的内存地址没有改变。也就是说,当在函数内部修改可变类型的地址时,实参的值也不会改变。

1
2
3
4
5
6
7
8
9
10
11
def func_2(param_1: str, param_2: dict):
param_1 = "hello"
param_2 = {"name": "Tom"}

name = "world"
info = {"name": "Jerry"}

func_2(name, info)

print(name) # world
print(info) # {'name': 'Jerry'}

在上面的例子中,param_2 重新指向了一个新的内存地址,所以实参的值没有改变。

函数返回值

函数的返回值是函数的输出,可以有也可以没有。如果没有返回值,函数默认返回 None

1
2
3
4
5
def func_3():
print("Hello World")

result = func_3()
print(result) # None

匿名函数

在 Python 中,使用 lambda 关键字来创建匿名函数,语法如下:

1
lambda parameters: expression

其中:

  • lambda 是创建匿名函数的关键字。
  • parameters 是函数的参数。
  • expression 是函数的返回值。

匿名函数的特点:

  • 匿名函数没有名称。
  • 匿名函数只能包含一个表达式。
  • 匿名函数的返回值是表达式的结果。
1
2
add = lambda x, y: x + y
print(add(1, 2)) # 3

不过在实际开发中,匿名函数的使用频率并不高,因为匿名函数只能包含一个表达式,所以它的功能比较单一,而且可读性不高。

内置函数

Python 中有很多内置函数,可以直接使用,无需导入模块。常用的内置函数有:

  • print():打印输出。
  • input():接收用户输入。
  • len():返回对象的长度。
  • type():返回对象的类型。
  • int():将一个字符串或数字转换为整数。
  • float():将一个字符串或数字转换为浮点数。
  • str():将一个对象转换为字符串。
  • list():将一个对象转换为列表。
  • dict():将一个对象转换为字典。
  • tuple():将一个对象转换为元组。
  • set():将一个对象转换为集合。
  • range():生成一个整数序列。
 评论
评论插件加载失败
正在加载评论插件