这一节我们将会把Python应用在解答一些更复杂一点的数学知识上。通过用这些有趣而实用的案例,来加深大家对使用模块的理解,以及掌握轻松使用数十个模块的秘技。

递归函数

递归函数求阶乘

我们可以在函数内部调用其他函数,而如果一个函数在它内部调用自身这个函数,那么这个函数就是递归函数。我们来看递归函数在求阶乘方面的应用。

使用VS Code新建一个lesson4文件夹,并在里面新建一个python文件比如lesson4.py,把下面的代码输入到文件里之后执行。

1
2
3
4
5
6
deffactorial(n):
ifn==1:
return1
else:
returnn*factorial(n-1)
print(factorial(6))

大家要读懂递归函数的逻辑,我们可以像多米诺骨牌的方式来推演:

如果n等于1,就返回1,也就是1的阶乘为1;

如果n=2,即factorial(2),就返回2*factorial(1),也就是返回2*1,也就是2的阶乘为2;

如果n=3,即factorial(3),就返回3*factorial(3-1),即3*2!

依次类推,n的阶乘=n*(n-1)!,这就是递归函数的妙用啦。

递归函数求斐波纳契数列

首先我们先要弄清楚什么是斐波那契数列,斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55…这个数列从第3项开始,每一项都等于前两项之和。

使用VS Code在lesson4文件夹里面新建一个python文件比如lesson4-1.py,把下面的代码输入到文件里之后执行。

1
2
3
4
5
deffib(n):
ifn==1orn==2:
return1
returnfib(n-1)+fib(n-2)
print(fib(20))

大家可以根据上面的推演方式来理解Python编程是如何用递归函数来求解斐波那契数列的。

调用外部python文件的函数

我们把上面求阶乘的函数写成一个独立的文件,比如f使用VS Code在lesson4文件夹里面新建Python文件fact.py,然后输入以下代码:

1
2
3
4
5
deffactorial(n):
ifn==1:
return1
else:
returnn*factorial(n-1)
之后在同一文件目录也就是lesson4文件夹下新建一个python文件,如lesson4-2.py,写入以下代码,
1
2
3
#这里的fact是文件名,factorial是函数名
fromfactimportfactorial
print(factorial(6))

执行lesson4-2.py查看结果。也就是我们可以用from 文件名 import 函数名,来调用Python外部文件的函数,这样大家是不是对模块和库的引入有了进一步的认识?

调用外部文件的函数:把上面斐波那契数列的案例也写成两个文件来执行。将功能完备且以后会反复调用的函数独立写成一个Python文件,这是一个非常重要的编程思想。模块化、组件化在编程世界里无处不在。

range函数

range() 函数也是Python的内置函数,可创建一个整数列表,一般用在 for 循环中。首先我们来了解一下range函数的语法。

很多人问调用函数的时候为什么有的数据类型是整型,有的是list数据类型,有的又是一个参数,而有的却是多个参数,这个我该怎么判断啊?答案就在技术文档的说明里面,所以大家要擅于查阅技术文档的语法。如果看不懂技术文档,可以百度搜索一些案例来促进自己理解。

1

range(start,stop[,step])

start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);

stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5

step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)

我们来通过实际案例理解range()函数,比如range(20,100,11),按照range()函数的理解就是从20开始到100结束,间隔为11的整数有哪些。那这个[, step]是啥意思呢?这个括号[]表示里面的参数非必须的意思,也就是你也可以不写,默认为1.

1
2
fortinrange(20,100,11):
print(t)
大家可以在编辑器里试一下,那我们不写后面的11看一下效果:
1
2
fortinrange(20,100):
print(t)
打印九九乘法表
1
2
3
4
5
#前面已经说过for in语句是用于列表List类型或字符串类型,而range()函数刚好可以建立一个整数列表
foriinrange(1,10):
forjinrange(1,i+1):
print('{}x{}={}\t'.format(i,j,i*j),end='')
print()

打印语句中,大括号及其里面的字符 (称作格式化字段) 将会被 .format() 中的参数替换,而\t这个是转义字符,就是按一下Tab

statistics模块

statistics模块是Python的内置模块之一,提供了一些统计学的函数,比如平均值mean()函数、中位数median()函数、方差pvariance()函数、标准差pstdev()等函数。我们来看下具体案例:

求平均数,就是N个数相加再除以N

1
2
3
4
5
6
#引入模块
importstatistics
#调用statistics的mean函数,mean函数的参数是一个list列表类型
t=statistics.mean([1,2,4])
print(t)

求中位数:

百度中位数说明:对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。

1
2
3
4
5
6
#引入模块
importstatistics
#调用statistics的median函数,median函数的参数是一个list列表类型
t=statistics.median([1,2,7])
print(t)
random模块

random模块主要用于生成一个随机数。生成随机数这个场景我们生活中遇到最多的就是抽奖,还有就是游戏里刷出来的一些野怪也是随机的。

首先我们用import引入random模块,这样我们就可以调用random模块里的所有函数啦。比如random.randint()函数,random.random()函数等。


importrandom
# 产生 1 到 10 的一个整数型随机数
print(random.randint(1,10))
# 产生 0 到 1 之间的随机浮点数
print(random.random())
# 产生 1.1 到 5.4 之间的随机浮点数,区间可以不是整数
print(random.uniform(1.1,5.4))
# 生成从1到100的间隔为2的随机整数
print(random.randrange(1,100,2))
# 将序列a中的元素顺序打乱
a=[1,3,5,6,7]
random.shuffle(a)
print(a)

Python有那么多的函数、模块、库,这里面涉及的函数恐怕有数万之多,通过前面的学习,你是否了解了掌握这些函数的秘技?没错,那就是查阅技术文档。学习技术千万不要死记硬背,而是要善于查阅技术文档。

年会抽奖号码:年会抽奖需要从1到100进行摇号,请写一个摇号的代码

通过技术文档拓展:random的shuffle函数是干嘛用的?random还有sample和choice函数,我们的学习文档里面没有介绍过,你知道该怎么查他们的使用方法么