1.函数
对代码块和功能的封装和定义,即对某个功能直接进行封装,当需要该功能时,直接调用函数
1)函数的定义
def 函数名():
函数体
2)函数调用:
函数名()
例:函数的定义和调用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def play(): #函数定义 print("吃饭") print("睡觉") print("打豆豆") play() #函数调用 print("哈哈哈哈") play()
3)函数的返回
执行完函数之后,可以使用return来返回结果
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def play(): #函数定义 print("吃饭") print("睡觉") print("打豆豆") return "吃喝玩乐" #当函数结束的时候,给调用方一个结果 res = play() #函数调用,并接受返回结果 print(res) 输出: 吃饭 睡觉 打豆豆 吃喝玩乐
①每个函数如果在函数中不写return,默认返回None
②如果在return后面啥也不写,默认也是返回None
③只要函数执行到return,函数就会停止执行
④可以只写一个return,也是返回None,表示停止函数的执行
⑤return 一个返回值 ; 可在调用方接受到一个返回值
⑥return 多个返回值 ; 多个返回值需要用逗号隔开,多个返回值在接受的位置,接受到的时元组类型的数据
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def play(): #函数定义 print("吃饭") print("睡觉") print("打豆豆") res = play() #函数调用,并接受返回结果 print(res) 输出: 吃饭 睡觉 打豆豆 None
#函数存在多个返回值
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def play(): #函数定义 print("打豆豆") return "吃饭","睡觉","玩游戏" a,b,c = play() print(a) print(b) print(c) 输出: 打豆豆 吃饭 睡觉 玩游戏
4)函数的参数
参数:在函数执行的时候,给函数传递的信息
形参:在函数声明的位置,声明出来的遍历
实参:在函数调用的时候实际给函数传递的值
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def play(func): #func为形参 print("吃饭") print("打%s" % func) play("游戏") play("豆豆") #实参
#可以给函数传递多个参数,每个参数之间用逗号隔开
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def play(func,game): #函数定义 print("吃饭") print("玩%s" % func) print("游戏名称为 %s" % game) play("游戏","LOL") 输出: 吃饭 玩游戏 游戏名称为 LOL
注:函数的参时个数是没有要求的,但是程序在运行的时候,要按照位置把实参赋值给形参
#实参的角度,对于参数的分类:
①位置参数
②关键字参数
③混合参数:混合参数应注意书写顺序,先写位置参数,然后在写关键字参数,否则会报错
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def people(id,name,age,add,email): print("ID:%s,姓名:%s,年龄:%s,地址:%s,邮箱:%s" % (id,name,age,add,email)) people("101","zz","23","兰州","88888@qq.com") #位置参数 people(name="ha",age="20",add="西安",id="102",email="00000@163.com") #关键字参数 people("103",name="er",age="4",add="lanzhou",email="1dada00@163.com") #混合参数 输出: ID:101,姓名:zz,年龄:23,地址:兰州,邮箱:88888@qq.com ID:102,姓名:ha,年龄:20,地址:西安,邮箱:00000@163.com ID:103,姓名:er,年龄:4,地址:lanzhou,邮箱:1dada00@163.com
#形参的角度,对于参数的分类
①位置参数
②默认值参数:在定义时,给形参一个默认值,实参传值时,若不写,使用默认值
③位置参数和默认值参数混和用。顺序:先写位置参数,然后再写默认值参数
#默认值参数使用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def people(name,age,sex="男"): print("姓名:%s,年龄:%s,性别: %s" % (name,age,sex)) people("张三",18) people("李四",20) people("小红",23,"女") 输出: 姓名:张三,年龄:18,性别: 男 姓名:李四,年龄:20,性别: 男 姓名:小红,年龄:23,性别: 女
例1:1+。。。。+n
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def sum(n): s = 0 count =1 while count <= n: s = s + count count = count +1 return s res = sum(100) print(res) 输出: 5050
例2:计算n是奇数还是偶数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def fn(n): if n%2 ==0: return "偶数" else: return "奇数" print(fn(321)) 输出: 奇数
2.练习
1)写一个函数,检查获取传入列表或元组对象(即传入的参数为列表或者元组)的所有奇数位索引对于的元素,并将其作为新列表返回给调用者
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(lst): lst_new =[] for i in range(len(lst)): if i % 2 == 1: lst_new.append(lst[i]) return lst_new a = [1,10,13,2,8,17] s = func(a) print(s) 输出: [10, 2, 17]
2)写一个函数,判断用户传入的对象(字符串,列表,元组)长度是否大于5
注:对于判断类的函数,返回值建议写True或者False
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(a): if len(a) >5: return True else: return False res = func("我爱北京天安门") print(res) 输出: True
3)写一个函数,检查传入列表的长度,如果列表长度大于2,将列表的前2项返回给调用者
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(lst): if len(lst) > 5: return lst[0],lst[1] a,b = func(lst=[10,20,5,8,7,9,6]) print(a,b) 输出: 10 20
4)写一个函数,计算传入函数的字符串中的数字,字母,空格,以及其他内容 的个数,并返回结果
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(s=""): num = 0 word =0 space =0 other = 0 for i in s: if i.isdigit(): num +=1 elif i.isalnum(): word += 1 elif i == " ": space += 1 else: other +=1 return num,word,space,other str = "AAAA2222 @@ #" print(func(str)) 输出: (4, 4, 4, 3)
5)写一个函数,接受两个参数,返回比较大的那个数字
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(a,b): return a if a>b else b print(func(3,5)) 输出: 5
6)写一个函数,检查传入字典的每一个value的长度,如果value的长度大于2,那么仅保留前两个长度的内容,并将新内容返回给调用着(注:字典中的value只能是字符串或列表)
如dic={'k1':"vvvv",'k2':[11,22,33,44]} 改变为dic={'k1':"vv",'k2':"[11,22]"}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(dic): dic_new = {} for k,v in dic.items(): if len(v) > 2: dic_new[k] = v[0:2] else: dic_new[k] = v return dic_new dic={'k1':"vvvv",'k2':[11,22,33,44]} print(func(dic)) 输出: {'k1': 'vv', 'k2': [11, 22]}
7)写一个函数,此函数只接受一个参数且参数必须是列表数据类型,此函数完成的功能是返回调用者一个字典,此字典的键值对位此列表的索引以及对于的元素。例如传入的列表为[11,22,33]则返回的字典为{0:11,1::22,2:33}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(lst): dic = {} for i in range(len(lst)): dic[i] = lst[i] return dic lst = ["哈哈","呵呵","吼吼"] print(func(lst)) 输出: {0: '哈哈', 1: '呵呵', 2: '吼吼'}
8)写一个函数,函数接受四个参数分别为:姓名、性别、年龄、学历。用户通过输入这四个内容,然后将这四个内容传入到函数中,此函数接受到这四个内容,将内容追加到一个student_msg文件中
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def funn(name,sex,age,edu): f = open("student.msg",mode="a",encoding="utf-8") f.write(name+"_"+sex+"_"+"_"+age+"_"+edu) f.flush() f.close() return name,sex,age,edu a = input("请输入姓名:") b = input("请输入性别:") c = input("请输入年龄:") d = input("请输入学历:") print(funn(a,b,c,d)) 输入输出: 请输入姓名:zdz 请输入性别:男 请输入年龄:20 请输入学历:小学 ('zdz', '男', '20', '小学')
9)对上一题升级:支持用户持续输入,按Q或者q退出,性别默认为男,如果遇到nv学生,则把性别输入女
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def funn(name,age,edu,sex="男"): f = open("student.msg",mode="a",encoding="utf-8") f.write(name+"_"+sex+"_"+"_"+age+"_"+edu+"\n") f.flush() f.close() return name,sex,age,edu while 1 : content = input("是否录入学生信息,Q/q退出:") if content.upper() == "Q": break a = input("请输入姓名:") b = input("请输入性别:") c = input("请输入年龄:") d = input("请输入学历:") funn(a,b,c,d)
10.写一个函数,用户掺入修改的文件名与要修改的内容,执行函数,完成整个文件的批量修改操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import os def func(filename,old,new): with open(filename,mode="r",encoding="utf-8") as f1, \ open(filename+"_副本",mode="w",encoding="utf-8") as f2: for line in f1: s = line.replace(old,new) f2.write(s) os.remove(filename) os.replace(filename+"_副本",filename) func("student.msg","小学","大学")