一、函数的定义
- def 关键字,定义一个函数
-
my_len 函数名(书写规则与变量名一样)
-
def与函数名中间一个空格。
-
def与函数名中间一个空格。
-
函数名():加冒号
-
函数体
-
my_len()#函数的执行:函数名+()
函数是从上到下依次执行,将函数名加载到内存,函数体放到一个临时存储空间,见到函数名执行。
# li=[1,2,2,4,6,7,4,5] # def my_len(): # count=0 # for i in li: # count+=1 # my_len()
二、函数的返回值
return
1.在函数中遇到return结束函数。
def fun(): print(111) return print(222) a=fun() print(a)
执行结果:
111
None
2.将值返回给函数的调用者。
1)无return 返回None
2)只写renturn None。
3)return 一个值,该值是什么就直接返回给函数的调用者,函数名()
def mylen(): s1='hello world' length=0 for i in s1: length=length+1 return length str_len=mylen() print('str_len: %s'%str_len) 执行结果: str_len: 11
4)return多个值,将多个值放到一个元组里,返回给函数的调用者
def fun(): return 1,2,[3,4],'guo' print(222) a=fun() print(a) 执行结果: (1, 2, [3, 4], 'guo')
三、函数的参数
1.实参
1)位置传参:按顺序一一对应。
def func(a,b,c): print(a) print(b) print(c) func(1,2,3) 1 2 3
#写一个函数功能比大小 def max_min(a,b): if a>b: return a else: return b print(max_min(100,20)) #可以用三元运算符来写: def max_min(a,b): return a if a > b else b print(max_min(100,20))
2)关键字传参:不按顺序,按关键字一一对应。
def max_min(a,b): return a if a > b else b print(max_min(b=200,a=100)) 200
3)位置和关键字混合传参:关键字参数在最后,位置一一对应。
def fun(a,b,c,d): print(a) print(b) print(c) print(d) fun(1,2,c=3,d=4) fun(a=1,b=2,3,4)#关键字参数在前面会报错
2.形参
1)位置传参:按顺序一一对应。
def func(a,b,c): print(a) print(b) print(c) func('ssdd',3,4) ssdd 3 4
2)默认参数:传参则覆盖,不传则默认,默认参数在位置参数后面。
def func(a,b=22): print(a,b) func(11,33) #11 33 传参则覆盖原来的22 def func(a,b=22): print(a,b) func(11) #11 22 不传参默认原来的参数
3.动态参数(万能参数)
*args接收的是实参对应的所有位置参数,并将其放在元组中。
def func(*args): print(args) func(1,2,3,4,5,6) 执行结果: (1, 2, 3, 4, 5, 6)
**kwargs将所有的关键字参数(无实参对应的关键字参数)放到一个字典中。
def func(a,b,c,**kwargs): print(kwargs) func(1,2,r=4,b1=5,c1=6,c=7) 执行结果: {'c1': 6, 'r': 4, 'b1': 5}
形参的最终顺序:位置参数,*args,默认参数,**kwargs.
def func(a,b,c,*args,d='男',**kwargs): print(a) print(b) print(c) print(args) print(d) print(kwargs) func(1,2,3,4,5,6,7,d='女',v=8,m=9,f=22) 执行结果: 1 2 3 (4, 5, 6, 7) 女 {'m': 9, 'v': 8, 'f': 22}
*的魔法运用:
1.在函数的调用执行时:
*+可迭代对象,代表打散list,tuple,str,dict(键),将元素一一添加到args。
**+字典,代表打散,将所有键值对放到一个kwargs字典里。
def func(*args): print(args) l1=[1,2,3,] l2=[1,2,3,22,33,44] tu=(1,2,3) func(*'fgjjkkll') func(*l1,*l2) #函数的调用 func(*tu) func(*{'name':'guo','age':'18'})#键添加到args 执行结果: ('f', 'g', 'j', 'j', 'k', 'k', 'l', 'l') (1, 2, 3, 1, 2, 3, 22, 33, 44) (1, 2, 3) ('age', 'name')
def func(**kwargs): print(kwargs) dic1={'name1':'guo','age1':'18'} dic2={'name':'tu','age':'45'} func(**dic1,**dic2) 执行结果: {'name1': 'guo', 'name': 'tu', 'age1': '18', 'age': '45'}
2.在函数定义时,*args,**kwargs代表的是聚合。
def func(*args,**kwargs): print(args) print(kwargs) dic1={'name1':'guo','age1':'18'} dic2={'name':'tu','age':'45'} func(*[1,2,3,4,5],*'fghj',**dic1,**dic2) 执行结果: (1, 2, 3, 4, 5, 'f', 'g', 'h', 'j') {'age1': '18', 'age': '45', 'name': 'tu', 'name1': 'guo'}
练习题
编写名单文件
def Infor_entry(username,sex='男'): with open('name_list',encoding='utf-8',mode='a') as f: f.write('{}\t{}\n'.format(username,sex)) while True: username=input('请输入姓名(男生以1开头):').strip() if '1'in username: username=username[1:] Infor_entry(username) else: Infor_entry(username,'女')