一、函数的理解
首先,我们使用函数的目的,或者说函数的作用是:增加代码的重复使用,减少代码的重复编写。
其次,函数的注释是在函数名的下方一行使用三引号。
了解了这些我们接着往下看。
二、函数的定义与调用
1、函数定义:
声明一个函数,封装一个调用:def 函数名():
2、函数调用:
执行一个函数,使用一个函数:函数名
三、函数的形参与实参
1、形参:
函数声明时,出现在小括号中,多个形参使用逗号分隔开。
形参没有具体值,需要接受实参。
2、实参
函数调用时,出现在小括号中,多个形参使用逗号分隔开。
实参有具体值,传递给形参。
四、函数的返回值
实参将具体值传递给形参,经过函数内部的计算,将结果返回,函数执行结束。
注意:1、如果没有写return,返回为None
2、函数执行到return,后续代码不在继续执行
3、return后可以跟多个值,返回的是一个元组
判断一个是否为质数代码为:
# 三、封装函数:可以判断一个数是否是质数
def get_n(n):
for i in range(2,n):
if n%i==0:
return False
else:
return True
# print(get_n(9))
# print(get_n(7))
while True:
n=int(input("请输入一个数:"))
print(get_n(n))
# 无限循环判断
五、函数的参数类型
1、位置参数
按照位置依次赋值
2、默认参数
拥有默认值,如果赋予新值,则使用新值,否则使用默认值,默认参数后不能存在非默认参数
3、关键字参数
通过形参名给形参赋值
4、可变参数
(1)、可变字典参数
接受任意多个关键字参数,关键字不在形参中,扩展关键字参数:**kwargs
(2)、可变列表参数
可以接受任意多个参数,后方不能再出现位置参数,扩展位置参数:*arges
六、函数的作用域
1、变量的作用域:
声明一个变量,在声明以后的代码区域才可以使用,这就是变量的作用域。
此外,在一个循环外部尽量不要使用循环内部定义的变量。
2、函数的作用域:
函数内部定义的局部变量 作用域就是函数内部。
函数外部不能使用。
3、此外
函数内部可以直接获取函数外部定义的变量
函数内部修改全局变量用global
函数内部修改外部函数的局部变量用nonlcal
a=10 #声明一个变量,作用域在其之后
b=20
c=30
def fun1():
d=0 #函数内声明一个变量
print(a) #直接用函数外的变量
global b
b=50 #全局改变变量b为50
print(a,b)
fun1()
print(a,b,c) #d是函数内部变量 函数外部不能使用
七、递归函数
所谓递归函数:就是自已调用自己的函数。
需要注意的是:递归函数的效率较低,随着递归深度的增加,需要维护很大的函数调用栈,开销太大。
递归函数实例:
求阶乘和:如5的阶乘和为:5!+4!+3!+2!+1!
def get_mul_sum(n):
if n==1:
return 1
else:
return get_mul(n) +get_mul_sum(n-1)
def get_mul(n):
if n==1:
return 1
else:
return n*get_mul(n-1)
print(get_mul_sum(5))
八、匿名函数
匿名函数就是没有名字的函数,关键字为lambdar,且只能编写一行。
附:匿名函数仅供参考,作者自己也不擅长
lambdar a,b:a+b
九、装饰器
装饰器的目的是:不改变函数原有实现,给函数添加新功能。
本质:闭包函数:1、外部函数嵌套内部函数
2、外部函数把内部函数返回
3、内部函数获取外部函数局部变量
实例:求冒泡排序所用时间:
上面是加入的装饰器,下面是它的应用,经过装饰器,我们就可以在不改变原有函数的情况下增加新的功能。
def cost_time(f):
def calc():
stat=time.time()
f()
end=time.time()
print(f.__name__,f"花费时间{end-stat}")
return calc
@cost_time
def fun1():
l=[i for i in range(1,1000)]
for i in range(len(l)-1):
for j in range(i+1,len(l)):
if l[j] < l[i]:
temp = l[i]
l[i] = l[j]
l[j] = temp
print(l)
fun1()
第二个函数为冒泡排序,感兴趣的可以关注后续