函数初识:
s = '12345'
def my_len():
i = 0
for k in s:
i += 1
print(i)
my_len()
my_len() #重复调用
问题:
1.只能打印s的长度
2.通过i = my_len() 返回none,发现函数没有返回长度,只是单纯的打印
解决:增加返回值
s = '12345'
def my_len():
i = 0
for k in s:
i += 1
return i #给苹果
my_len()
length = my_len() #要苹果
print(length)
返回值的三种情况:
1.没有返回值
-不写return 程序会在最后默认return None
-只写return,程序遇到return就不会运行后面的程序了。结束一个函数的继续。
-写return None和只写return功能一样
2.返回一个值
-可以返回任何数据类型
-只要返回了就可以接受到
-如果在一个程序中有多个return,那么只执行一个
3.返回多个值
-有多少个返回值用多少个变量接收,不能多也不能少。return 1,2,3 a,b,c = fun()
-用一个变量接收多个返回值,会返回一个元组
元组、list、dict是可以解包的:
1.a,b,c = (1,2,3)
2.a,b,c = [1,2,3]
3.a,b,c = {1:1,2:2,3:3}
参数:
1.ret = my_len(s) #传递参数;传参;实际参数;实参
2.def my_len(s): #形式参数,形参;接收参数
3.两个函数可以互相调用
def f1(i):
for k in i:
print(k)
def f2(i):
f1(i)
for y in i:
print(k)
f2([1,2,3,4]) #函数的嵌套调用
参数:
1.一个参数
2.两个参数 def my_len(a,b)
站在参数的角度上:
1.按照位置传参
2.按照关键字传参
3.混着用可以:但是必须先按照位置传参,再按照关键字传参
4.不能给同一个变量传多个值
站在形参的角度上:
1.位置参数:必须传,而且有几个参数就传几个值
2.默认参数:可以不传,如果不传就是默认的参数,如果传了就用传了
3.动态参数:args是习惯,可以无限多的增加参数,但是*args不能收到关键字传递的参数,*args必须再*kwargs之前
4.顺序:-位置参数,-*args,-默认参数, -**kwargs
动态参数1:可以接收任意多个参数
def sum(*args): #args只是一个变量名,*不可变
print(args) #元组用for循环调用
sum(1,2)
sum(1,2,3)
sum(1,2,,3,4) #接收的是按照位置传参的值,组织成一个元组
动态参数2:可以传入无限多个关键词参数
def func(**kwargs):
print(kwargs)
fun(a=1,b=2,c=3)
fun(a=1,b=2)
fun(a=1) #接收的是按照关键字传参的值,组织成一个字典
两个动态参数结合,可以接收所有的值
def func(*args,**kwargs):
print(args,kwargs)
func(1,2,3,a=1,b=3) #先传位置参数,再传关键字参数
def func(a,b,*args,sex='man',**kwargs):
print(a,b,args,sex='man',kwargs)
func(1,3,4,sex='man',a=1,b=2)
def func(*args): #站在形参的角度上,给变量加上*,就是组合所有传来的值
print(args)
a = [1,2,3,4,5]
func(*a)
#效果等于func(1,2,3,4,5)
#站在实参的角度上,给一个序列加上*,就是将这个序列按照顺序打散
def func(**kwargs):
print(kwargs)
d = {'a':1,'b':2}
func(**d)
效果等于func(a=1,b=2)
函数的注释:
def func():
'''
这个函数实现了什么功能
参数1:
参数2:
return:是字符串或者是列表的长度
'''
pass
函数的陷阱:
如果默认参数的值是一个可变数据类型,那么每一次调用函数的时候,如果不传值就公用这个数据类型的资源。
def qqxing(i=[]):
i.append(i)
qqxing()
qqxing([1])
qqxing()
def qqxing(k,a={}):
a[k] = 'v'
print(a)
qqxing(1)
qqxing(2)
qqxing(3)