一、函数基础
编程方法
典型的编程方法有面向过程、面向对象和函数式编程。
面向过程是把编程的重点放在实现过程上,分析出结局问题所需的步骤过程,然后通过语句来一一定义实现。
面向对象是把构成问题的事务分界成若干个对象,然后定义出每个对象在解决问题步骤中具备的属性和行为。
函数式编程是一种编程范式,主要思想是把运算过程尽量定义成一系列函数来进行调用(更多内容会在下面章节展开)。
函数的概念
编程语言中对函数的定义是:函数是逻辑结构化和过程化的一种编程方法。实际应用时是把一组语句的集合(代码块)通过函数名进行封装,以便在程序中其他位置灵活调用。
如何定义及使用函数
Python中定义函数的方法如下:
def test(x):
"""description"""
x += 1
return x
说明:
def: 定义函数的关键字
test: 函数名
() 用于定义参数(形参,参数非必需但括号必需得有)
"""description""" 函数附加说明,非必需,但强烈建议添加以提高代码可读性
x += 1 泛指代码块或程序处理逻辑
return 定义函数的返回值,返回函数中全部逻辑的执行结果并结束函数的执行
关于return的返回值:
作用:
返回函数中全部逻辑的执行结果并结束函数的执行
返回值存在以下情况:
(1) 没有显式定义,返回None
(2) 定义了一个返回值,返回定义的值
(3) 定义了多个函数返回值,返回一个以所有返回值为元素的元组
最后,函数的返回值可以是任意对象,字符串、函数等均可以作为函数的返回值。
定义函数的目的是便于其他地方可以调用,那么定义后如何使用函数呢?
调用函数方法: 函数名(传入的参数)
还是来几个例子:
def func0(a):
a += 1
print('This is func0') # 此处没有显式定义返回值
def func1(x):
x += 1
return x
def func2():
return 'Hello, world', ('Python', 'PHP', [1, 2, 3, ], func0(2)) # 把函数作为返回值
print(func0(0))
print(func1(1))
print(func2())
输出结果:
This is func0
None
2
This is func0
('Hello, world', ('Python', 'PHP', [1, 2, 3], None))
使用函数的好处
使用函数有以下四个典型的好处:
1. 提高代码的重用性,避免代码的重复冗余
2. 保持一致性,相同的过程执行相同的逻辑
3. 可扩展性好,函数中的代码块可根据需要灵活扩展
4. 可维护性高,一旦需要改变逻辑时只需要修改函数中的代码块,一处修改后调用的地方都同步更新
二、函数的参数及其传入方法
定义函数的目的是便于在程序的其他地方调用,而对于很多函数或执行逻辑来讲,不同的输入往往会导致截然不同的输出,因此函数是需要能接收输入的参数的。函数中的参数有以下两类:
形参:即形式参数,在定义函数时引入的参数,只有在函数被调用时才会存在并为其分配内存空间
实参:调用函数时实际传入的参数,即执行函数定义的逻辑时给定的输入,占用内存空间。调用函数时实参的值会根据一定的规则传递给形参来执行函数中定义的逻辑过程。
那么有把实参传给形参有哪些规则或者传入方法呢?
- 位置参数传入
位置参数传入是一种最简单的参数传入方式,传入是实参与形参的相对位置一对一对应。
def get_list(x, y): # 定义两个形参
return [x, y]
z = get_list(1, 2) # 调用函数并传入两个实参
print(z)
输出:
[1, 2] # 输出结果表明传入的实参通过位置的对应关系传递给了形参
注意:位置参数传入时实参的个数与形参的个数必须严格一致,多一个或少一个都会报错。
def get_list(x, y):
return [x, y]
z = get_list(1) # 传入的实参比形参少了一个
print(z)
报错信息:
Traceback (most recent call last):
File "****", line 27, in <module>
z = get_list(1) # 传入的实参比形参少了一个
TypeError: get_list() missing 1 required positional argument: 'y'
============我是分割线===========
def get_list(x, y):
return [x, y]
u = get_list(1, 2, 3) # 传入的实参比形参多了一个
print(u)
报错信息:
Traceback (most recent call last):
File "****", line 27