python100天之day6

函数

引例:

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!(MN)!M!,(M=7, N=3)
问题分析:
(应用隔板法)求有多少组正整数解,可以看成如下情形:

x x ∣ x x x ∣ x ∣ x x x x | x x x | x | x x xxxxxxxx

8 个 苹 果 , 分 为 4 份 , 总 共 有 7 个 位 置 , 可 放 入 三 个 隔 板 , 分 成 4 份 , 一 共 有 C 7 3 种 分 法 8个苹果,分为4份,总共有7个位置,可放入三个隔板,分成4份,一共有C_7^3种分法 8474C73
可以用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))

越努力越幸运!!!

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值