函数是一段具有特定功能的、可重用的语句组,通过函数名来表示和调用。
# 定义一个对整数n求阶乘的函数
def fact(n):
s = 1
for i in range(1, n+1):
s *= i
return s
函数定义后不能直接运行,需要调用才能运行,函数调用方式:
<函数名>(<实际赋值参数列表>)
# 定义一个对整数n求阶乘的函数
def fact(n):
s = 1
for i in range(1, n+1):
s *= i
return s
print("值是:", fact(10))
输出:
值是: 3628800
1. 函数类型
可选参数要放置在必选参数的后面,即定义函数时,先给出所有非可选参数,然后再分别列出每个可选参数及对应的默认值。
函数的参数在定义时可以指定默认值,当函数被调用时,如果没有传入对应的参数值,则使用函数定义时的默认值替代。
def fact(n, *c):
s = 1
for i in range(1, n+1):
s *= i
for item in c:
s *= item
return s
print(fact(4)) 输出:24
print(fact(4, 2)) 输出:48
print(fact(4, 2, 5)) 输出:240
print(fact(4, 2, 5, 3)) 输出:720
max(), min()的参数就是可变参数,在函数定义时参数就是设定为不确定的 *b方式
def add(x, y):
z = x + y
print(add(2, 3))
输出:
None # 没有return保留字,输出None
def add(x, y):
z = x + y
return
print(add(2, 3))
输出:
None # 有return保留字,但没有列返回值,输出None
def multiply(x, y = 10):
z = x * y # z是函数内部的局部变量
return z
s = multiply(99, 2)
print(s)
print(z)
输出:
198
Traceback (most recent call last):
File "C:/Users/520/PycharmProjects/pythonProject1/exercise.py", line 6, in <module>
print(z)
NameError: name 'z' is not defined
n = 2 # n是全局变量
def multiply(x, y = 10):
global n # 声明全局变量n
n = x * y # 声明全局变量n
return x * y * n # 使用全局变量n
s = multiply(5, 3)
print("s的值是:", s)
print("n的值是:", n)
输出:
s的值是: 225
n的值是: 15
如果未使用保留字global声明,即使名称相同,也不是全局变量,程序将其作为局部变量处理:
n = 2 # n是全局变量
def multiply(x, y = 10):
n = x * y # n变量名相同,没有声明为全局变量,直接使用,是局部变量
return x * y * n
s = multiply(5, 3)
print("s的值是:", s)
print("n的值是:", n)
输出:
s的值是: 225
n的值是: 2 #不改变外部全局变量的值
匿名函数(lambda函数):lambda函数是一种快速定义单行的最小函数,是从Lisp借用来的,可以用在任何需要函数的地方。
lambda函数与def函数的区别:
f = lambda x, y: x + y # 定义一个lambda函数f,进行加法运算
print(f(10, 15))
输出: 25
f = lambda: "lambda函数" # lambda函数可以没有参数
print(f())
输出:lambda函数
可以把编写的代码当做一种资源,并且对这种资源进一步抽象,实现代码的抽象化。代码抽象化指的是使用函数等方法对代码赋予更高级别的定义。对同一份代码在需要时被重复使用就构成了代码复用,而代码复用是需要将代码进行抽象才能达到的效果。
在不同的程序设计语言中,都有代码复用的相关功能。一般来说,我们使用函数和对象这两种方法来实现代码复用。可以认为这两种方法是实现代码复用的方法,也可以认为这两种方法是对代码进行抽象的不同级别。函数能够命名一段代码,在代码层面建立初步抽象,但这种抽象级别比较低,因为它只是将代码变成了一个功能组。对象通过属性和方法,能够将一组变量甚至一组函数进一步进行抽象。
在代码复用的基础上,我们可以开展模块化设计。模块化设计是基于一种逻辑的设计思维,它的含义是通过封装函数或对象将程序划分为模块以及模块之间的表达。
– 紧耦合:尽可能合理划分功能块,功能块内部耦合紧密
– 松耦合:模块间关系尽可能简单,功能块之间耦合度低
– 紧耦合的缺点在于更新一个模块可能导致其他模块变化,复用较困难;松耦合一般基于消息或协议时间,系统间交互简单。
– 松耦合代表了模块化,从系统观点来看,松耦合是总体设计原则
一般来说,完成特定功能或被经常复用的一组语句应该采用函数来封装,并尽可能减少函数间参数和返回值的数量。
一般编写程序时,通过函数来将一段代码与代码的其他部分分开,那么函数的输入参数和返回值就是这段函数与其他代码之间的交流通道,这样的交流通道越少越清晰,那么定义的函数复用可能性就越高。所以在模块化设计过程中,对于模块内部,也就是函数内部,尽可能的紧耦合,它们之间通过局部变量可以进行大量的数据传输。但是在模块之间,也就是函数与函数之间要尽可能减少它们的传递参数和返回值,让它们之间以松耦合的形式进行组织,这样每一个函数才有可能被更多的函数调用,它的代码才能更多的被复用。
PS. source, python123.io