一.函数
函数的概念:对功能或者动作的封装可以帮我们把一段公共的代码提取出来
语法如下
def 函数名(形参): 函数体 函数名(实参) # 函数名() def yue(): print("1. 打开手机") print("2. 打开陌陌") print("3. 找个漂亮的小姐姐") print("4. 探讨一下人生") print("5. 一起出来happy") yue() # 执行一次函数 print("休息休息") yue() # 再来一次 print(yue)
二.函数的返回值
return, 终止函数的运行
1. 函数内部不写return, 默认在最后返回None
2. 函数只写了return 返回None
3. return 值 有一个返回值
4. return 值1, 值2, 值3 .... 有多个返回值
返回值返回给调用方
例一 def yue(): print("1. 打开手机") print("2. 打开陌陌") print("3. 找个漂亮的小姐姐") print("4. 探讨一下人生") print("5. 一起出来happy") ret = yue() print(ret) 例二 def yue(): print("1. 打开手机") print("2. 打开陌陌") return print("3. 找个漂亮的小姐姐") print("4. 探讨一下人生") print("5. 一起出来happy") 例三 def yue(): print("1. 打开手机") print("2. 打开陌陌") print("3. 找个漂亮的小姐姐") print("4. 探讨一下人生") print("5. 一起出来happy") return "漂亮的小姐姐" # 返回到哪儿了???? 谁调用的就返回给谁 例四 def yue(): print("1. 打开手机") print("2. 打开微信") print("3. 找个漂亮的小姐姐") print("4. 探讨一下人生") print("5. 一起出来happy") return "漂亮的小姐姐","大妈", "大爷", "鲜肉" # 返回到哪儿了???? 谁调用的就返回给谁 ret = yue() # ('漂亮的小姐姐', '大妈', '大爷', '鲜肉') print(ret)
三.函数的参数(一部分)
形参: 在函数声明位置的变量
1. 位置参数2. 默认值参数
def regist(id, name, age, gender="男"): # 从语法上讲. 不允许, 从代码运行也不允许 print(id, name, age, gender) regist(3, "王大锤", 20) regist(4, "李鸿洁", 18, "女")
3. 混合参数 位置参数, 默认值参数
4. 动态传参, *args, **kwargs
实参: 在函数调用的时候给函数传递的具体的值
1. 位置参数
def chi(good_food, junk_food,drink, sweet, xiaoshi, lingshi1, lingshi2, lingshi3, good_food2, xiaoye, shuiguo): print(good_food, junk_food, drink, sweet) chi("猪蹄", "北冰洋", "哈根达斯", "薯条", "罐头", "大米饭") def chi(good_food, junk_food,drink, sweet): print(good_food, junk_food, drink, sweet) chi("大米饭", "猪蹄", "北冰洋", "哈根达斯")
2. 关键字参数
def chi(good_food, junk_food,drink, sweet): print(good_food, junk_food, drink, sweet) # 关键字参数: 必须按照形参的名字来传递信息 chi(good_food="大米饭", sweet="哈根达斯", drink="饮料", junk_food="薯条")
3. 混合参数
def chi(good_food, junk_food, drink, sweet): print(good_food, junk_food, drink, sweet) chi("大米饭", "薯条", sweet="哈根达斯", drink="北冰洋") # positional argument follows keyword argument
顺序: 位置, 关键字
传参: 把实参赋值给形参的过程
四.函数的应用
1.注册 def regist(): f = open("account", mode="r+", encoding="utf-8") while 1: # 输入用户名和密码 username = input("请输入你的用户名:") password = input("请输入密码:") for line in f: if line.strip().split(":")[0] == username: print("对不起, 该用户已经注册!") break else: print("恭喜, 注册成功") f.write(" "+username+":"+password) # break # 能执行到这个break. for一定是执行完了的. f.flush() f.close() return # 直接结束函数的调用 regist() 2.登录 def login(): username = input("请输入用户名:") # sylar:123 password = input("请输入密码:") # 123 f = open("account", encoding="utf-8") for line in f: if line.strip() == username + ":" + password: print("恭喜你.登录成功 ") return True # True, 登录成功 else: print("对不起, 用户名或密码错误") return False # False 登录失败 login() login() login() login()
练习六..作业
1.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。 def func(lst): return lst[1::2] print(func(['王大锤','刘亦菲','曾小贤','王祖贤','张柏芝','陈小春'])) 2.写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。 def func(lst): return len(lst)>5 print(func([1,2,2])) 3.写函数,检查传入列表的长度,如果大于2,将列表的前两项内容返回给调用者。 def func(lst): if len(lst)>2: return lst[:2] print(func([1,2])) 4.写函数,计算传入函数的字符串中, 数字、字母、空格 以及 其他内容的个数,并返回结果。 def func(s): shuzi = 0 zimu = 0 kongge = 0 qita = 0 for c in s: if c.isdigit(): shuzi+=1 elif c.isalpha(): zimu+=1 elif c== " ": kongge+=1 else: qita += 1 print(shuzi,zimu,kongge,qita) return shuzi,zimu,kongge,qita func("hidjhdsfhfhsdsd2323453478%R$%$%$%+--==-g-//..,l") 5.写函数,接收两个数字参数,返回比较大的那个数字。 方案一 def func(a, b): if a > b: return a else: return b 方案二 def func(a, b): return a if a > b else b # a>b? a:b 6.写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。dic = {"k1": "v1v1", "k2": [11,22,33,44]} PS:字典中的value只能是字符串或列表 def func(dic): dd = {} for k, v in dic.items(): if len(v) > 2: v = v[:2] dd[k] = v return dd dic = {"k1": "v1v1", "k2": [11,22,33,44]} print(func(dic)) 7.写函数,此函数只接收一个参数且此参数必须是列表数据类型, 此函数完成的功能是返回给调用者一个字典,此字典的键值对为此列表的索引及对应的元素。例如传入的列表为:[11,22,33] 返回的字典为 {0:11,1:22,2:33}。 def func(lst): dic = {} for i in range(len(lst)): # 索引 0 1 2 dic[i] = lst[i] return dic print(func([11,22,33])) 8.写函数,函数接收四个参数分别是:姓名,性别,年龄,学历。 用户通过输入这四个内容,然后将这四个内容传入到函数中, 此函数接收到这四个内容,将内容追加到一个student_msg文件中。 def func(name,edu, age, gender="男"): f = open("student_msg", mode="a", encoding="utf-8") f.write(name+"$$"+gender+"$$"+edu+"$$"+age+" ") f.flush() f.close() 9.题升级:支持用户持续输入,Q或者q退出,性别默认为男, 如果遇到女学生,则把性别输入女 while 1: content = input("请输入姓名,年龄,学历,性别(周杰伦,18,小本,)(q退出)") if content.upper() == "Q": break lst = content.split(",") if len(lst) <= 3 or lst[3] == '': func(lst[0], lst[2], lst[1]) else: func(lst[0], lst[2], lst[1], lst[3] ) def func(s="男"): print(s) func() 10.写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成文件的修改操作(升级题)。 def func(file_path, old, new): with open(file_path, mode="r", encoding="utf-8") as f1, open(file_path + "_副本", mode="w", encoding="utf-8") as f2: for line in f1: s = line.replace(old, new) f2.write(s) os.remove(file_path) os.rename(file_path+"_副本", file_path) func("student_msg", "$$", "@@")