文章目录
(一)函数的基本概念
(1)函数的定义
函数是随时可以执行的代码,可以封装一些随时可以使用的代码程序,提高代码的复用性。在写程序时我们用def来定义函数,后面接上函数的名字。下面举个小例子方便理解:
import random
print('*'*20)
print('欢迎使用猜数字小程序')
print('现在给您提供一个猜数字的小游戏')
a = int(input('请您给出该答案的开始范围:'))
b = int(input('请您给出该答案的结束范围:'))
num = random.randint(a,b) #随机生成a-b之间的数
i = 1
while i<=10:
x = int(input('请输入您猜的数:'))
if x>num:
print('太大了哦,要小一点')
elif x<num:
print('太小了哦,要大一点')
else:
print('恭喜您猜对啦')
break
print(f'当前还有{10-i}次机会,继续加油')
i+=1
else:
print('游戏结束,不好意思您次数已经用完')
这是一个猜数字的小游戏代码,当我们运行时能够执行一次,但是如果我们想要再玩一次的时候该怎么办呢?这时我们就可以定义一个函数def fun () 注意:小括号里是放参数或不放参数的地方,参数后面会讲。
def fun():
import random
print('*'*20)
print('欢迎使用猜数字小程序')
print('现在给您提供一个猜数字的小游戏')
a = int(input('请您给出该答案的开始范围:'))
b = int(input('请您给出该答案的结束范围:'))
num = random.randint(a,b) #随机生成a-b之间的数
i = 1
while i<=10:
x = int(input('请输入您猜的数:'))
if x>num:
print('太大了哦,要小一点')
elif x<num:
print('太小了哦,要大一点')
else:
print('恭喜您猜对啦')
break
print(f'当前还有{10-i}次机会,继续加油')
i+=1
else:
print('游戏结束,不好意思您次数已经用完')
此时函数就已经定义完成。
(2)函数的调用
函数定义完,使用时是需要自己调用的。调用的方法是函数名加上(),比如fun()
这里的函数又分为内置函数和自定义函数。比如上面的例子就属于自定义函数,而id() len() print() type()这种属于是内置函数。
注意:函数名不要和系统内置函数名重复。
当我们定义完函数后,只要我们需要用到函数里面的代码,就可以直接引用函数。
(二)函数参数及作用域
(1)函数的参数
参数指的是还没有赋值的变量,等待函数调用时传入值。参数是不规定数据类型的,传入什么类型它就是什么类型。
def num(a):
print(a*2)
这里可以观察到print只是一个打印语句,是没有任何返回的,所以用变量接收不到内容。那么当我们想要使用接收内容后的变量该怎么办呢?此时就要用到return返回值,用于在函数中返回最终数据。
def num(a):
return a*2
return不能返回赋值语句,是在函数中最后一个执行的语句,后面的内容不会再执行。
(2)参数类型
1.必备参数
必备参数指只要定义了参数就必须要传入对应值,否则就会报错。
2.默认参数
有传入值就接收对应的值,没有就是用默认值。
3.不定长参数
参数个数未知,传入多少就接收多少。用*args(元组的不定长)和**kwargs(字典的不定长)接收,这里的args和kwargs是规范性写法,也可以自定义。字典的不定长通过键值对的方式给入。一定要先传入元组的不定长,之后再传字典的不定长。整体顺序是,优先必备参数,其次默认参数,剩下是不定长参数。
def num(*args,**kwargs):
print(f'我的爱好是{args},我还对{kwargs}感兴趣。')
(3)函数的作用域
函数相当于一个封闭空间,不能修改函数外面的变量,如需要修改,则要提前声明,关键词是global。
num = 10 #全局变量 定义在外部的变量,定义在外部的变量,函数内是不能修改的,修改需要提前声明
def func():
global num #声明全局变量
num+=1
print(num)
闭包:内部函数是不可以直接在外面使用的,如果需要使用,要把它返回出去。也就是外层函数返回内层函数的函数体。
def func():
money = 100 #定义在内部的是局部变量
def f1():
print(money)
def f2():
print(money)
return f1,f2 #f1,f2加小括号是对结果的调用,不加是得到整个函数
这里是接收变量里的函数体,在把元组里的内容接收出来(拆包),这样就可以对局部变量进行使用。
当然,如果想要修改局部变量也需要提前声明,关键词是nonlocal。
def func():
money = 100
def f1():
nonlocal money #声明局部变量
money-=99 #在内层函数不可以直接修改外层函数的值,如需修改,声明局部变量
print(money)
def f2():
print(money)
return f1,f2 #返回内层函数的函数体,f1,f2加小括号是对结果的调用,不加是得到整个函数
看函数作用域的时候还要考虑这个数据是不是可变类型。
不可变类型: 数值、int、float、bool、str、tuple
可变:list、dict、set
如果是可变类型不需要考虑作用域,如果是不可变类型,需要考虑作用域,即看是需要修改全局还是局部变量,用global和nonlocal声明。
(三)递归函数和匿名函数
(1)递归函数
当我们需要重复使用函数时,除了循环,还可以用递归函数,比如下面的阶乘运算。
def func(n):
if n<=1:
return 1 #递归函数也需要结束条件
else:
print(n)
return n * func(n-1) #函数自身调用自己
(2)匿名函数
没有名字的函数,单独使用没有意义,往往结合其他函数去运行。
li = [1,2,6,4,'a','b']
li.sort(key=lambda x:str(x)) #利用匿名函数对列表的数据进行处理
print(li)
这段程序执行过程是:列表调用排序方法的时候会依次把列表里的元素放进来进行排序。