终于来到函数了,最近我也是很辛苦啊,每天都得熬夜,眼睛上都起小痘痘了,害,年轻嘛,冲冲冲!!!
当有一个功能需要重复的使用,我们可以利用函数去调用,
函数就是将代码封装,之后去使用。
函数的目的就是减少重复代码,提高代码的复用性。
一:函数的关键词:def
后跟函数名,取得原则与变量一致,最后调用函数的时候输入函数名加括号即可
def hello():
print('哈哈哈')
#调用函数
hello()
结果:
哈哈哈
二:函数的参数:
包括:必备参数,默认参数,不定长参数(字典不定长参数,元组不定长参数)
为什么要参数?
举一个简单的例子:
在计算的时候如果函数内部是固定的数字那么每次更换数字都会造成麻烦,因此函数需要参数。
1:必备参数
def num(x):
print(x+x)
x(5)
在函数名后的括号里加入参数
调用函数时,用函数名加参数的赋值
结果:
10
这里的x就是必备参数,在掉用的时候必须传值!
2:默认参数
def num(x,y=10):
print(x+y)
num(5)
由于y是默认参数,默认为10.在调用时可以不传值
结果
15
当然也可以传值来代替原本的默认参数,是非常灵活的!!!
def num(x,y=10):
print(x+y)
num(5,20)
此时20就传给了y
结果为:
25
3:不定长参数
元组不定长,有多种写法(*args,*brgs,*crgs,*drgs)标准写法:*args,
不是一定要传入值,也可以传入多个值
def num(*args):
print(args)
num()
num(55,66,'人')
num([55,'列表'])
num({'name':'字典'})
可以输出字典,可以输出列表,可以传入任意量的值,因为它是元组,所以输出的结果加小括号
结果为:
()
(55, 66, '人')
([55, '列表'],)
({'name': '字典'},)
字典不定长 (**kwargs)
def num(**kwargs)
可以不传值,也可以传入多个值。
传入字典格式:(键名=值)
def num(**kwargs):
print(kwargs)
num(name='小华')
这里的传值方式是固定的,必须采用键名=’值‘的方式
4综合:
def num(x,y=10,*args,**kwargs):
print(x)
print(y)
print(args)
print(kwargs)
num(10,5,54,60,20,a=8,v='hello')
10传给x
5传给y
54,60,20传给了*args
其余的字典型传给了**kwargs
不允许在字典不定长后传入不符合字典不定长格式的数字
结果:
10
5
(54, 60, 20)
{'a': 8, 'v': 'hello'}
一个小项目(for 的九九乘法表)
for a in range(1,10):
for b in range(1,a+1):
print('%s*%s=%2s'%(b,a,a*b),end=' ')
print('\n')
如果我们想打出八八乘法表只需要改变一个参数即可,套入函数,只需要把原来的9换成参数x即可
def mu(x):
for a in range(1,x):
for b in range(1,a+1):
print('%s*%s=%2s'%(b,a,a*b),end=' ')
print('\n')
mu(9)
三:函数返回值
return的作用:返回值,结束函数
def num(x,y)-> int:#是一个整数型(与return返回的值是一种类型)
print(x)#一开始没有赋值则都是必备参数
def num(x,y):
print(x)
print(y)
return x+y
print(5)
num(5,6)
结果:
5
6
此时的return后面的得出的值已经赋给了num(5,6),只有在交互模式下能看到num(5,6)的值,我们也发现,return后面没有打印,所以return还有返回函数值的作用。
return可以返回任意的内容
四:函数加括号不加括号
不加括号:
def num(x):
print(x)
print(num)
输出的是函数本身:
<function num at 0x0000019AFBED2598>
加括号:
def num(x):
print(x)
num(5)
输出的是执行之后的结果,表示调用。
五:函数的拆包
定义一个变量
a={'b':'2','c'=3}
def num(**kwargs):
print(kwargs)
num(**a)
输出结果为:
{'b': '2', 'c': 3}
六:函数作用域
函数外定义的变量,就是全局变量,在函数里是可以用的,在函数里不可以修改不可变对象,如数字,元组,字符串,可以修改字典,集合。
函数里定义的变量函数外不可以用,为局部变量。
1:定义外的变量可以用在函数内
a=5
def num():
print(a)
num()
结果:
5
2:列表可修改
li=[1,2]
def num():
li.append(7)
print(li)
输出结果为:
[1, 2, 7]
3:字典可修改
dic={1:2}
def num():
dic[2]=3
print(dic)
num()
输出结果为:
{1: 2, 2: 3}
4:数字不可改(没有定义a)
a=5
def num():
a=a+1
print(a)
num()
则会报错
5:函数内外可以定义相同的变量名
x=100
def num()
x=200
print(x)
print(x)
num()
print(x)
输出值为:
100
200
100
6:声明全局变量:global
a=100
def num():
global a
a=a+1
print(a)
num()
在global下,a就变为了全局变量
输出结果为
101
7:要用的变量不是全局变量,不能用global,得用nonlocal
def fun():
x=100
print(x)
def num():
nonlocal x
print(x)
num()
fun()
在函数里定义的x就是局部变量,所以得用nonlocal
输出结果为:
100
100
8:函数里面嵌套的函数不可以直接调用。
9:函数的闭包,外层函数返回内层函数体。
因为内层的额函数无法调用,所以用闭包的方式调用内部函数
比如拿简单的游戏升级来说明
def hero():
lv=1
def up():
nonlocal lv
lv +=1
print(lv)
return lv
def down():
nonlocal lv
lv -=1
print(lv)
return lv
return up,down
a,b=hero()#依次赋给了up和down
a()
b()
a()
a()
因为我们最终返回的是我们的内部函数名,所以我们赋值a,b给外函数名的时候,其实就是依次将a,b赋给了内部函数名的up和down
输入a()是,就会执行内部up的指令
输出结果为:
2
1
2
3
七:函数的递归
当我们想实现5+4+3+2+1时可以使用递归
def num(x):
if x==1:
return 1
else:
return x+num(x-1)
a=num(5)
print(a)
输出结果为:
15
八:匿名函数
没有函数名,所以没有定义def的过程,采用的是lambda
自带return
s=lambda x:x+1
print(s(2))
这个x+1自动返回到s
s就相当于前面的变量名,冒号后就是要执行的程序。
输出结果为
3
九:过滤器函数,filter
li=[i for i in range(1,101,2]#此时我们想取0-50内的数
def num(x):
if x<50:
return x
f= filter(num,li)#内部输入的是定义的名字,然后加列表名
print(list(f))
输出结果为:
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48]
十:匿名函数与过滤器的结合
仔细看!!!!!!!
li=[i for i in range(0,101,2)]
f=filter(lambda x:x<50,li)
print(list(f))
结果为:
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48]
十一:map函数,统一计算
方法一:
利用
li=[i for i in range(0,101,2)]
def num(x):
x=x*10
print(x)
for i in li:
num(i)
方法二:
利用for
li=[i for i in range(0,101,2)]
def num(x):
x=x*10
print(x)
list(map(num,li))
十二:map和filter的结合
li=[i for i in range(1,101)]
m=list(map(lambda x:x*10,li))
print(m)