函数
引例:
x
1
+
x
2
+
x
3
+
x
4
=
8
求
有
多
少
组
正
整
数
解
?
x_1 + x_2 + x_3 + x_4 = 8求有多少组正整数解?
x1+x2+x3+x4=8求有多少组正整数解?
事实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案。
C
M
N
=
M
!
N
!
(
M
−
N
)
!
,
(M=7, N=3)
C_M^N =\frac{M!}{N!(M-N)!}, \text{(M=7, N=3)}
CMN=N!(M−N)!M!,(M=7, N=3)
问题分析:
(应用隔板法)求有多少组正整数解,可以看成如下情形:
x x ∣ x x x ∣ x ∣ x x x x | x x x | x | x x xx∣xxx∣x∣xx
8
个
苹
果
,
分
为
4
份
,
总
共
有
7
个
位
置
,
可
放
入
三
个
隔
板
,
分
成
4
份
,
一
共
有
C
7
3
种
分
法
8个苹果,分为4份,总共有7个位置,可放入三个隔板,分成4份,一共有C_7^3种分法
8个苹果,分为4份,总共有7个位置,可放入三个隔板,分成4份,一共有C73种分法
可以用Python的程序来计算出这个值,代码如下所示。
M=int(input('请输入一个数M:'))
N=int(input('请输入一个数N:'))
FM=1
for i in range(1,M+1):
FM*=i
FN=1
for i in range(1,N+1):
FN*=i
FMN=1
for i in range(1,M-N+1):
FMN*=i
print(FM//(FN*FMN))
不知道大家是否注意到,在上面的代码中,我们一共做了3次求阶乘,但代码中只有参数在变。
函数的作用
编程大师Martin Fowler先生曾经说过:“代码有很多种坏味道,重复是最坏的一种!”,要写出高质量的代码首先要解决的就是重复代码的问题。对于上面的代码来说,我们可以将计算阶乘的功能封装到一个称之为“函数”的功能模块中,在需要计算阶乘的地方,我们只需要“调用”这个“函数”就可以了。
定义函数
- 用def关键字来定义函数,和变量一样每个函数也有一个响亮的名字,而且命名规则跟变量的命名规则是一致的。
- 在函数名后面的圆括号中可以放置传递给函数的参数,这一点和数学上的函数非常相似,程序中函数的参数就相当于是数学上说的函数的自变量。
- 函数执行完成后我们可以通过return关键字来返回一个值,这相当于数学上说的函数的因变量。(注意return与for属于同一缩进)
面请编写一个函数来求阶乘
"""
求阶乘
1.def关键字
2.函数名
3.参数
4.return
"""
def fac(num):
result=1
for i in range(1,num+1):
result*=i
return result
函数参数
默认参数
from random import randint
def roll_dice(n=1):
"""摇色子的累计和"""
total = 0
for _ in range(n):
total += randint(1, 6)
return total
# 如果没有指定参数那么使用默认值摇两颗色子
print(roll_dice())
# 摇三颗色子
print(roll_dice(3))
上面的例子中(n=2)就是我们的默认参数,如果你不输入参数的话,python会默认你输入的参数为2
位置参数
我们定义一个三个数相乘的函数:
"""
三个数相乘
"""
def multip(a,b,c):
return a*b*c
# 传递参数时可以不按照设定的顺序进行传递
print(multip(c=50, a=100, b=200))
可变参数
优化三个数相乘的函数:
# 在参数名前面的*表示args是一个可变参数
def multip(*args):
total = 1
for val in args:
total *= val
return total
# 在调用multip函数时可以传入0个或多个参数
print(multip(1))
print(multip(1, 2))
print(multip(1, 2, 3))
print(multip(1, 3, 5, 7, 9))