初识函数
本篇内容
1.什么是函数
2.函数定义,函数名,函数体以及函数的调用
3.函数的返回值
4.函数的参数
5.练习题
一.什么是函数
函数:定义一个事情或功能.等到需要的时候直接去用就好了.(对代码块和功能的封装和定义)
二..函数定义,函数名,函数体以及函数的调用
1...函数定义,函数名,函数体
def 函数名(): 函数体
函数名的命名规则和变量名的命名规则是一样的
1.由字母数字下划线组成 2.不能由数字开头 3.不能是python关键字 4.要有意义,不能太长 5.区分大小写 6.不要用中文
2.函数的调用,注意:函数只有被调用的时候里面的代码才会被执行,不调用的话就是定义了一个函数而已
使用函数名可以调用函数,写法:函数名(),这个时候函数就会被执行
def func(): print('哈哈') func()
三.函数的返回
执行完函数之后,我们可以使用return来返回结果
(1)函数终于到return,此函数结束,不再执行
def func(): print('哈哈') return print('呵呵') func()
哈哈
(2)给函数的调用者一个返回结果
a=0
def func():
return a
ret=func()
print(ret)
#0
(3)函数的返回值可以有多个结果注意:多个返回值放在一个元组里
def func(): a=10 b=20 c='嘻嘻' return a,b,c ret=func() print(ret) print(type(ret)) #(10, 20, '嘻嘻') #<class 'tuple'>
总结:
1.遇到return,此函数就结束,函数后面的东西将不会在执行
2.return返回值
(1)如果什么都不写或者return后面什么都不写就返回None
(2)如果return后面写了一个值,则掉用者可以接受一个结果
(3)如果后面写了多个结果,则调用者可以接受一个tuple,可以结构获取多个变量
四.函数的参数
参数函数在调用的时候指定具体的一个变量的值,就是参数,语法:
def 函数名(参数列表): #形参 函数体
函数名(实参)
def func(food): print('我今天中午吃了%s'%(food)) func('面条') func('炒面') func('盖浇饭') 结果: # 我今天中午吃了面条 # 我今天中午吃了炒面 # 我今天中午吃了盖浇饭
1.形参
写在函数声明的位置变量叫做形参,表示这个函数需要xxx
2.实参
在调用函数的时候给函数传递的值叫做实参,表示给函数xxx
3.传参
给函数传递信息的时候将实际参数交给形式参数的过程被称为传参'
4.参数的分类
4.1实参的分类
4.1.1位置参数(将实参按位置传给形参变量)
def yue(time,ad,gender,name): print('%s在%s与某%s叫%s'%(time,ad,gender,name)) #今天在餐厅与某女叫lucy # print(time+'在'+ad+'与某'+gender+'叫'+name) #今天在餐厅与某女叫lucy # print(name + '在' + ad + '与某' + gender + '叫' + time) #lucy在餐厅与某女叫今天 yue('今天','餐厅','女','lucy')
def func(a,b): return a if a>b else b print(func(10,20)) #20
4.1.2关键字参数
def name(a,b): print('我叫'+a+'我喜欢'+b+'再说一遍我叫'+a) ret=name(a='吃饭',b='睡觉') print(ret) #我叫吃饭我喜欢睡觉再说一遍我叫吃饭
4.1.3混合参数(位置参数必须在关键字参数前面)
def name(a,b,c,d): print('我叫%s我喜欢%s还喜欢%s再说一遍我叫%s'%(a,b,c,d)) ret=name('锅包肉','鱼香肉丝',c='吃饭',d='睡觉') #我叫锅包肉我喜欢鱼香肉丝还喜欢吃饭再说一遍我叫睡觉
4.2形参的分类
4.2.1位置参数按照位置来赋值到目前为止,我们编的都是这种
4.2.2默认值参数(在调用的时候如果给值,就用给的值,如果不给就默认值,声明位置参数,必须在默认值参数前面
def name(name,gender,age=8): print(name,gender,age) name('哈哈','女') name('吼吼','女',age=9) # 哈哈 女 8 # 吼吼 女 9
4.2.3动态参数
4.2.3.1动态接收位置参数(接受的是一个元组 无关('a',)只有一个元素的元组,需要逗号)
def func(*argc): print('我要吃',*argc) func('锅包肉','烤冷面','炒饼') #我要吃 锅包肉 烤冷面 炒饼
声明位置参数必须在动态参数前面
def func(*argc,a,b,):
print('我要吃',a,b,*argc)
func('锅包肉','烤冷面','炒饼','kaixin')
# TypeError: func() missing 2 required keyword-only arguments: 'a' and 'b'
改正:
def func(*argc,a,b,):
print('我要吃',a,b,argc)
func('锅包肉','烤冷面',a='炒饼',b='kaixin') #用关键字参数来指定
#我要吃 炒饼 kaixin ('锅包肉', '烤冷面')
def func(a,b,*argc):
print('我要吃',a,b,argc)
func('锅包肉','烤冷面','炒饼','kaixin')
#我要吃 炒饼 kaixin ('锅包肉', '烤冷面')
#(如果动态参数在前面,会接受所有的位置参数,会报错)
def func(*argc,a,b,):
print('我要吃',a,b,*argc)
func('锅包肉','烤冷面',a='炒饼',b='kaixin') #用关键字参数来指定
#我要吃 炒饼 kaixin 锅包肉 烤冷面
探究默认参数位置
def func(a,b,c='西瓜',*argc): print('我要吃',a,b,c,argc) func('锅包肉','烤冷面','炒饼','桃') func('锅包肉','烤冷面','炒饼','桃','橘子') func('锅包肉','烤冷面') # 我要吃 锅包肉 烤冷面 炒饼 ('桃',) #默认参数没生效 # 我要吃 锅包肉 烤冷面 炒饼 ('桃', '橘子') #默认参数没生效 # 我要吃 锅包肉 烤冷面 西瓜 () #默认参数生效
def func(a,b,*argc,c='西瓜'): print('我要吃',a,b,c,argc) func('锅包肉','烤冷面','炒饼','桃') func('锅包肉','烤冷面','炒饼','桃','橘子') func('锅包肉','烤冷面') # 我要吃 锅包肉 烤冷面 西瓜 ('炒饼', '桃') # # 我要吃 锅包肉 烤冷面 西瓜 ('炒饼', '桃', '橘子') # 我要吃 锅包肉 烤冷面 西瓜 ()
def func(a,b,*argc,c='西瓜'): print('我要吃',a,b,c,argc) func('锅包肉','烤冷面','炒饼',c='桃') func('锅包肉','烤冷面','炒饼','桃',c='橘子') func('锅包肉','烤冷面') # 我要吃 锅包肉 烤冷面 桃 ('炒饼',) # 我要吃 锅包肉 烤冷面 橘子 ('炒饼', '桃') # 我要吃 锅包肉 烤冷面 西瓜 ()
顺序:位置参数 动态参数 (*argc) 默认参数
4.3.2.2动态接收关键字参数**来接收关键字参数这时候接收的是一个字典
def func(**argc):
print(argc)
func(a=1,b=2,c=3)
#{'a': 1, 'b': 2, 'c': 3}
因为实参位置参数必须放关键字参数前面,所以形参接受的时候也是这个顺序
最终顺序:位置参数 *argc 默认参数 **kwargc
如果想接受所有参数 :
def func(*args,**kwargs): print(args,kwargs) func('hello','world',c='减肥',d='加油') #('hello', 'world') {'c': '减肥', 'd': '加油'}
4.4实参位置上* **
在实参位置上给一个序列,列表,可迭代对象前面加一个*表示把这个序列按顺序打散,在形参位置上的*表示把接收到的参数组合成一个元组
五.练习题
1.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。
def func(lis):
return lis[1::2]
print(func(['刘晓蕾','hahah']))
#['hahah']
def func(lis):
li=[]
for i in range(len(lis)):
if i%2!=0:
li.append(lis[i])
return li
print(func(['刘晓蕾','hahah']))
#['hahah']
2.写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
def func(s): return len(s)>5 s="sdnjhfuhf" print(func(s)) #如果大于五就True
3.写函数,检查传入列表的长度,如果大于2,将列表的前两项内容返回给调用
s=['刘晓蕾','哈哈哈','你好']
a=lambda *args:args[:2]
print(a(*['刘晓蕾','哈哈哈','你好','HFGYFG']))
#打散成为位置参数,得到的是长度为4的一个元组,
# 如果不打散得到的就是一个长度为1,里面是这个列表的元组
#('刘晓蕾', '哈哈哈')
def long(lis):
return lis[0:2]
ret=long(['哈','刘晓蕾','刘晓寒'])
print(ret)
#['哈', '刘晓蕾']
4.,写函数,计算传入函数的字符串中, 数字、字母、空格 以及 其他内容的个数,并返回结果。
def count(s):
number=0
english=0
write=0
d=0
for i in s:
if i.isdigit():
number=number+1
elif i.isalpha():
english=english+1
elif i==' ':
write=write+1
else:
d=d+1
return(number,english,write,d)
print(count('fjdkfhfhipcp 4578 &'))
5.写函数,接收两个数字参数,返回比较大的那个数字。
a=lambda a,b:a if a>b else b print(a(1,2))
6.写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。PS:字典中的value只能是字符串或列表
def func(dic):
for i in dic:
if len(dic[i]) > 2:
dic[i] = dic[i][0:2]
return dic
dic = {"k1": "v1v1", "k2": [11,22,33,44],'k3':"nihao"}
print(func(dic))
dic = {"k1": "v1v1", "k2": [11,22,33,44],'k3':"nihao}
lis=[dic[i][:2] for i in dic]
print(lis)
#['v1', [11, 22], 'ni']
ll=filter(lambda i:len(dic[i])>2,dic)
for i in ll:
print(dic[i][:2])
结果:
#v1
#[11, 22]
#ni
7.写函数,此函数只接收一个参数且此参数必须是列表数据类型, 此函数完成的功能是返回给调用者一个字典,此字典的键值对为此列表的索引及对应的元素。 例如传入的列表为:[11,22,33] 返回的字典为 {0:11,1:22,2:33}。
def func(lis): if type(lis)==list: dic={} for i in range(len(lis)): dic[i]=lis[i] return dic print(func([11,22,33]))
lis=[11,22,33]
a={lis.index(i):i for i in lis}
print(a)
#{0: 11, 1: 22, 2: 33}
8.写函数,函数接收四个参数分别是:姓名,性别,年龄,学历。 # 用户通过输入这四个内容,然后将这四个内容传入到函数中,此函数接收到这四个内容, # 将内容追加到一个student_msg文件中。
def func(name,age,gender,edu): with open('student_msg',mode='a+',encoding='utf-8')as f: f.write(name+' '+str(age)+' '+gender+' '+edu+'\n') func(name='刘晓蕾',age=20,gender='女',edu='本科') #刘晓蕾 20 女 本科
9.对第8题升级:支持用户持续输入,Q或者q退出,性别默认为男,如果遇到女学生,则把性别输入女。
def func(name,age,edu,gender='男'): with open('student_msg',mode='a+',encoding='utf-8')as f: f.write(name+' '+str(age)+' '+gender+' '+edu+'\n') while 1: concent=input('是否继续录入学生信息') if concent=='否': break else: name=input('请输入你的姓名') age=input('请输入你的年龄') gender=input('请输入你的性别') edu=input('请输入你的学历') if gender=='': func(name,age,edu) else: func(name,age,edu,gender) #刘晓蕾 20 女 本 #刘晓 20 男 哈哈
10.写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作(升级题)。(w模式下只会有第一次写的时候会清空原来的,在写就不会了)
def func(filename,old,new): import os with open(filename,mode='r',encoding='utf-8') as f1,\ open(filename+'副本',mode='w',encoding='utf-8') as f2: for line in f1: if old in line: line=line.replace(old,new) f2.write(line) os.remove(filename) os.rename(filename+'副本',filename) func('呵呵','嘿嘿','哈哈')