day10 函数
函数
一、函数的定义与调用
定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":"。
def 是固定的,不能变,必须是连续的def三个字母,不能分开
空格 为了将def关键字和函数名分开,必须空(四声),当然你可以空2格、3格或者你想空多少都行,但正常人还是空1格。
函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并能表达函数功能
括号:是必须加的,先别问为啥要有括号,总之加上括号就对了!
注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性。
调用:就是 函数名() 要记得加上括号
二、函数的返回值
def 函数(): return ret = 函数() print(ret)
没有返回值:
不写return == return None
只写一个return == return None
return的作用:1.返回一个值2.终止一个函数的继续
返回一个值:
可以返回任意的数据类型,返回什么就接收什么
返回多个值:
用一个变量接收返回值,接收到的是一个元组
返回值用多个变量接收,那么返回值的个数应该和接收变量的个数完全一致
三、函数的参数
def my_len(lst): # 参数:接收参数,形式参数,形参 count = 0 for i in lst: count += 1 return count len_count = my_len([1,2,3]) # 参数:传参数/传参,实际参数,实参 print(len_count)
写一个函数,接收参数一个列表或者字符串
如果这个列表或者字符串的长度大于2就返回True否则返回False
def foo(x): if len(x) > 2: return True else: return False print(foo([1,2,3]))
参数
形参和实参
传参数可以传任意的数据类型,并且传什么接收什么
站在传参数的角度上看问题:一共有两种传参的方式
第一种:按照位置传参数
第二种:按照关键字传参数
def f(para): print(para) f(1)
传多个参数:多个参数分别可以使用任意数据类型
def f2(arg1,arg2): # 站在接收、形参的角度上:位置参数 print(arg1) print(arg2) f2(arg2=1,arg1='abc') # 按照关键字传参数 f2('abc',arg2=[1,2])
按照关键字传参数和按照位置传参数是可以混用的
但是,首先传按位置的,再传按关键字的
按照位置传完该接收的参数只能接收一个值,不接收或者重复接收都不行
形参
位置参数
数量必须与实参数量一致 ==> 必须传的参数
def classmate(name,sex='男'): print('姓名:%s,性别:%s' %(name,sex)) classmate('尤悦') classmate('曹超') classmate('张建超') classmate('晓梅','女')
默认参数:
默认参数是可以不传的参数
在不传参数的情况下可以使用默认的值
如果传了,就会使用传的值
魔性的用法:默认参数尽量避免使用可变数据类型
def func(l = []): l.append(1) print(l) func() # [1] func() # [1,1] func() # [1,1,1]
动态参数
*args:接收所有按照位置传的参数,接收到的是参数组成的元组
**kwargs:接收所有按照关键字传的参数,接收到的是参数组成的字典
所有的参数的顺序:位置参数,*args,默认参数,**kwargs
def func(a,b,c,*args,key = 'key'): # 在参数前面加个*,这个参数就变成动态参数了 print(a,b,c) print(key) print(args) # 使用时,所有接收过来的参数都被组织成一个元组的形式 func(2,4,4,5,'abc',[1,3],key='qqxing') def func(a,*args,key='qqxing',**kwargs): print('a:',a) print('args:',args) print('key:',key) print('kwargs:',kwargs) # func(5) func(5,6,7,key='xiaoxiaosu',b='hahaha',c='hehehe') def my_sum(*args): sum_2 = 0 for i in args: sum_2 += i return sum_2 print(my_sum(1,2,3,2))
魔性的用法
在调用函数的时候,可以打散:*l、**dic
def func(*args): print(args) # (1, 2, 3) l = [1,2,3] func(*l) # 按顺序打散 def func(**kwargs): print(kwargs) # {'b': 2, 'a': 1} dic = {'a':1,'b':2} func(**dic) 在调用函数的时候,可以打散:*l、**dic
四、函数的名字
第一类对象的概念:
函数名可以赋值
可以作为一个数据结构的元素
可以作为一个函数的参数
可以作为一个函数的返回值
def func(): print('in func') return 10 def func2(): print('in func2') return 20 print(func) f = func print(f) f() l = [func,func2] for i in l: i() def func(): print('in func') return 10 def func2(arg): print(arg) return arg func2(func) f = func2(func) print(f) f()