目录
一、函数是什么
- 一个程序由一个个任务组成;函数就是代表一个任务或者一个功能。
- 函数是代码复用的通用机制。
二、函数的分类:
(1)内置函数
我们前面使用的str()、list()、len()等这些都是内置函数,我们可以拿来直接使用。
(2)标准库函数
我们可以通过import语句导入库,然后使用其中定义的函数
(3)第三方库函数
Python社区也提供了很多高质量的库。下载安装这些库后,也是通过import语句导入,然后可以使用这些第三方库的函数
(4)用户自定义函数
用户自己定义的函数,显然也是开发中适应用户自身需求定义的函数。
三、函数的创建
定义函数的语法如下:
def 函数名 ([参数列表]) :
函数体
[return xx]
要点:
- 我们使用def来定义函数,然后就是一个空格和函数名称;
Python执行def时,会创建一个函数对象,并绑定到函数名变量上。
- 参数列表
- 圆括号内是形式参数列表,有多个参数则使用逗号隔开
- 形式参数不需要声明类型,也不需要指定函数返回值类型
- 无参数,也必须保留空的圆括号
- 实参列表必须与形参列表一一对应
- return返回值
- 如果函数体中包含return语句,则结束函数执行并返回值;
- 如果函数体中不包含return语句,则返回None值。
- 调用函数之前,必须要先定义函数,即先调用def创建函数对象
- 内置函数对象会自动创建
- 标准库和第三方库函数,通过import导入模块时,会执行模块中的def语句
四、函数的返回值
return返回值要点:
- 如果函数体中包含return语句,则结束函数执行并返回值;
- 如果函数体中不包含return语句,则返回None值。
- 要返回多个返回值,使用列表、元组、字典、集合将多个值“存起来”即可。
主要写一下第三点
看代码:
def fun (num): #定义的函数
odd=[] #储存奇数
even=[] #储存偶数
for i in num: #历遍num这个列表
if i % 2: #判断这个数是否是奇数
odd.append(i)
else:
even.append(i)
return odd,even #返回的值是这俩个列表
print(fun([25,215,486,159,19964516,496,156,56464,468864,]))
看图:
看到最后输出的结果,可以看到,结果返回的是俩个值,返回的是元组。
五、函数的参数定义
函数的参数定义有俩种,一种是按顺序由实参到形参,另外一种第一个用实参,第二个用默认值
(1)第一种按顺序
def fun(a=10,b=20):
print(a,b)
print(fun(100,200))
结果:
(2) 第二种,第一个用实参,第二个用默认值
def fun(a=10,b=20):
print(a,b)
print(fun(100))
结果为:
可以看到,实参没有传入b的值,那么b用的是形参的值。
六、函数的个数可变的位置参数
(1)个数可变的位置参数
- 定义函数,无法确定先传递的位置实参的个数时,使用可变的位置存数
- 使用 * 定义个数可变的位置参数
- 结果为元组
代码为:
def fun(*args):
print(args)
fun(10)
fun(10,20,30)
结果为:
(2)个数可变的关键字参数
- 定义函数,无法确定先传递的关键字位置实参的个数时,使用可变的关键字参数
- 使用 * *定义个数可变的关键字参数
- 结果为字典
代码:
def fun(**args):
print(args)
fun(a=10)
fun(a=10,b=20,c=30)
结果为:
这俩个是不一样的,大家使用的时候要多注意!!
七、函数变量作用的作用域
全局变量:
- 在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块结束。
- 全局变量降低了函数的通用性和可读性。应尽量避免全局变量的使用。
- 全局变量一般做常量使用。
- 函数内要改变全局变量的值,使用global声明一下
局部变量的查询和访问速度比全局变量快,优先考虑使用,尤其是在循环的时候。
在特别强调效率的地方或者循环次数较多的地方,可以通过将全局变量转为局部变量提高运行速度。
全局变量是要覆盖局部变量的,下面展示的全局变量
x=100
y=0
def fun (x,y):
x=100
print(x)
y=x+y
return x,y
print(x)
print(y)
结果:展现的是全局变量
下面开一下,展现的局部变量:
局部变量:
- 在函数体中(包含形式参数)声明的变量。
- 局部变量的引用比全局变量快,优先考虑使用。
- 如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量
代码:
x=100
y=200
def fun (x,y):
x=100
print(x)
y=x+y
return x,y
print(fun(100,200))
下面展现的就是局部变量:
八、递归函数
递归函数指的是:自己调用自己的函数,在函数体内部直接或间接的自己调用自己。递归类似于大家中学数学学习过的“数学归纳法”。 每个递归函数必须包含两个部分:
- 终止条件
表示递归什么时候结束。一般用于返回值,不再调用自己。 - 递归步骤
把第n步的值和第n-1步相关联。
递归函数由于会创建大量的函数对象、过量的消耗内存和运算能力。在处理大量数据时,谨慎使用。
具体的使用就是计算阶乘
代码:
def fac(x):
if x== 1:
return 1
else:
return x*fac(x-1)
print(fac(5))
这儿的算法就是
思想:
递归他是一层一层的去计算,比如5!=5*4*3*2*1
那么就会有5*fac(4),在这儿不知道fac(4)是多少,那就计算5*4*fac(3)
但是这儿也不知道fac(3)是多少,那就接着计算5*4*3fac(2),但是这儿也不知道fac(2)是多少
就计算fac(1),而1的话本身就是一,那么就是5*4*3*2*fac(1),最后fac(1)是1,则又一层一层的返回,最后便是5*4*3*2*1
(2)斐波那契实例
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
这个我们要怎么写呢
首先的是他肯定是递归,先定义一个函数
然后可以发现,前俩项是,1 ,1
那么后面的就是前俩项相加之和
这样就好写多了
看代码:
#斐波纳妾
for i in range(1,10): #这是用数列的方法写出n取不同的值时,斐波那契数列的不同值
n=i
def naqie(n):
if n==1: #定义第一项
return 1
if n==2: #定义第二项
return 1
else: #最后返回的值是用递归,后一项加前一项的和
return naqie(n-1)+naqie(n-2)
print(naqie(n))
代码结果如下:
原创不易,各位读者大大,动动发财的小手,点点赞!!!