函数

函数的作用:方便我们重复使用相同的一段程序。

将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而不需要重复敲所有的语句。

def square_sum(a,b):
    c = a**2 + b**2
    return c

square_sum(3,4)
函数格式

定义函数:

这个函数的功能是求两个数的平方和。


关键字:def  后面跟上函数名:square_sum

这个关键字通知python:我在定义一个名叫square_sum函数。


括号中的a, b是函数的参数,是对函数的输入。参数可以有多个,也可以完全没有(但括号要保留)。

c = a**2 + b**2        # 这一句是函数内部进行的运算


return c               # 返回c的值,也就是输出的功能。Python的函数允许不返回值,也就是不用return。


return可以返回多个值,以逗号分隔。相当于返回一个tuple(定值表)。


return a,b,c          # 相当于 return (a,b,c)

return并不是必须的,当没有return, 或者return后面没有返回值时,函数将自动返回None。None是Python中的一个特别的数据类型,用来表示什么都没有

 

调用函数与传参:

定义过函数后,就可以在后面程序中使用这一函数

 

案例1:求两个数的最大公约数

首先来看看笨方法

def maxCommon(a, b):
    for i in range(1, b + 1):  # 两数的最大公因数最大为较小的数,所以我们遍历从1到较小的数(为什么b+1:掐头去尾)

        if a % i == 0 and b % i == 0:  # 如果a和b除以i余数都为0,那么i就是a和b的公因数
            mx = i
            # 将i赋值给变量mx,因为i会从1到b,所以只要满足条件的i,都会对mx赋值
            # 新值会替代旧值,所以最后返回的是最大公因数
    return mx

print(maxCommon(36, 21))  # 输出结果为:3
笨方法

 

这种笨方法我们称之为“穷举法”,既然有笨办法,那就有聪明的办法!

接下来我们就来看聪名的办法:欧几里得算法碾转相除法),叫欧几里得算法显得高大上,碾转相除法贴切的多。

def modUntil(a, b):
    while b:
        a, b = b, a % b   # 循环,序列赋值
    return a

print(modUntil(36, 21))  # 3
欧几里得算法

 

这是什么鬼?代码怎么可以这么简洁?怎么就循环一直除一直除就可以得到最大公因数了?还除的是余数?

容老夫给你娓娓道来。

假设x,y有一最大公因数z,x和y都可以被z整除,那么对任意整数m和n,mx+ny也可以被z整除。

现在有x / y = q 余数为 w,那么x = qy + w,可知 x -qy = w,结合上一行可知 w 可以被z整除,也就是说,x除以y的余数可以被他俩的最大公因数整除。

循环到最后,a的值为上一循环时的余数,b的值为0。

 

是不是涨见识了?在欧几里得算法的基础上,有没有受到启发,有没有想到其它算法?

我们再来看下一种算法:尼考曼彻斯法碾转相减法、更相减损术),如果你想到的也是这种算法,那么恭喜你,你的思维可以和尼考曼彻斯比肩了。

def deUntil(a, b):
    while a != b:
        if a > b:
            a = a - b
        else:
            b = b - a
    return b
print(deUntil(36,21))
尼考曼彻斯法

 

不会又一脸懵逼了吧?碾转相除的道理还记得吗?两者一个道理,既然能除就能减,多减几次,剩下的等同于余数

最大公约数的算法会了,那么最小公倍数就简单了

 

案例2:求两个数的最小公倍数

将两个数相乘再除以最大公约数就是最小公倍数,方法很简单:

 

def maxCommon(a, b):
    for i in range(1, b + 1):  # 两数的最大公因数最大为较小的数,所以我们遍历从1到较小的数(为什么b+1:掐头去尾)

        if a % i == 0 and b % i == 0:  # 如果a和b除以i余数都为0,那么i就是a和b的公因数
            mx = i
            # 将i赋值给变量mx,因为i会从1到b,所以只要满足条件的i,都会对mx赋值
            # 新值会替代旧值,所以最后返回的是最大公因数
    return mx

def lcm(a, b):
    return a * b / maxCommon(a, b)


print(maxCommon(36, 21))  # 输出结果为:3
print(lcm(4,6))
最小公倍数

 

递归调用:

  在函数内部调用函数本身

经典案例:

def test(num):
    if num == 1:
        return 1

    temp = test(num - 1)
    return num + temp
print(test(num))
递归求和

 

 

总结:

def function_name(a,b,c):
    statement
    return something  # return不是必须的

函数的目的: 提高程序的重复可用性。

return     None

通过位置,传递参数。

基本数据类型的参数:值传递

表作为参数:指针传递

练习:

写一个判断闰年的函数,参数为年、月、日。若是是闰年,返回True

原文地址:https://www.cnblogs.com/shudu/p/11524503.html