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

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