初识函数
- 1. 什么是函数
- 2. 函数定义, 函数名, 函数体以及函数的调用
- 3. 函数的返回值
- 4. 函数的参数
1.函数
定义一个事情或者功能. 等到需要的时候直接去用就好了. 那么这里定义的东西就是⼀个函数. 函数: 对代码块和功能的封装和定义
2.函数的定义, 函数名, 函数体以及函数的调用
使用def关键字来定义函数, 函数的定义语法:
def 函数名(): 函数体
函数名的命名规则和使用和变量基本⼀样(变量的命名规则), 函数体: 就是函数被执行之后要执行的代码
def back(): print("网上订票") print("坐火车回家") print("路上睡觉")
定义完了. 但是这个时候去执行. 会发现什么都没有发生. 因为我只定义了⼀个函数. 但是还没有执行过这个函数.
函数的调用: 使用函数名可以调用函数, 写法: 函数名(), 这个时候函数的函数体会被执行
def back(): print("网上订票") print("坐火车回家") print("路上睡觉") back() #调用函数)
3.函数返回
执行完函数之后. 使用return来返回结果.
函数中return的使用:
函数中遇到return, 此函数结束, 不再继续执行.
def back(): print("网上订票") print("坐火车回家") returnprint("路上睡觉") #不会被执行 back()
给函数的调用者⼀个访问结果
def back(): print("网上订票") print("坐火车回家") print("路上睡觉") return "就是太慢了" think=back() print(think)
函数返回值可以有多个结果
def back(): print("网上订票") print("坐火车回家") print("路上睡觉") return "就是太慢了","有时候票也不好买","但是相对便宜" think=back() print(think) #('就是太慢了', '有时候票也不好买', '但是相对便宜') tuple
总结⼀下:
- 1. 遇到return. 此函数结束, 函数后面的东西将不会再执行
- 2. return 返回值
关于返回值:
- 如果return什么都不写 或者干脆不写return .那么返回的就是None
- 如果return后面写了⼀个值. 则调用者可以接收⼀个结果
- 如果return后面写了多个结果, 则调用者可以接收⼀个tuple, 调用者可以直接解构成多个变量
4.函数的参数
参数, 函数在调用的时候指定具体的⼀个变量的值. 就是参数. 语法:
def 函数名(参数列列表): 函数
def back(ways): print("网上订票") print("坐%s回家" % ways) print("路上睡觉") back("汽车") back("火车") back("飞机")
关于参数:
- 形参:写在函数声明的位置的变量叫形参. 形式上的⼀个完整. 表示这个函数需要xxx
- 实参:在函数调⽤用的时候给函数传递的值. 叫实参, 实际执行的时候给函数传递的信息. 表⽰示给函数 xxx
- 传参:给函数传递信息的时候将实际参数交给形式参数的过程被称为传参.
(1)参数的分类--实参的分类
位置参数:在访问back()的时候, 按照位置的顺序分别把"携程", "火车", 6小时 赋值给 search, ways, time. 在传参过程中. 系统会默认按照位置把实参赋值到形参.
def back(search,ways,time): print("打开%s进行查找"%search) print("坐%s回家" % ways) print("路上需要睡%s" %time) back("携程","火车","6小时")
打开携程进行查找
坐火车回家
路上需要睡6小时
练习: 编写函数, 给函数传递两个参数a, b. 比较a, b的大小, 返回 a, b中大的那个数
def my_max(a, b): if a > b: return a else: return b # 有点⼉儿麻烦, 我们在这⾥里里学一个三元运算符. def my_max(a, b): c = a if a > b else b # 当a>b成⽴立返回a, 否则返回b return c
关键字参数:函数在定义的时候参数非常多时,我们不需要记住每个参数的位置. 只要记住每个参数的名字就可以了了
def back(search,ways,time): print("打开%s进行查找"%search) print("坐%s回家" % ways) print("路上需要睡%s" %time) back(ways="火车",search="携程",time="6小时")
打开携程进行查找
坐火车回家
路上需要睡6小时
混合参数: 可以把上面两种参数混合着使用. 也就是说在调用函数的时候即可以给出位置参数, 也可以指定关键字参数
def back(search,ways,time): print("打开%s进行查找"%search) print("坐%s回家" % ways) print("路上需要睡%s" %time) back("携程",ways="火车",time="6小时") #正确 第一个位置赋值给search,后面的参数开始制定关键字
def back(search,ways,time): print("打开%s进行查找"%search) print("坐%s回家" % ways) print("路上需要睡%s" %time) back(search="携程","6小时",ways="火车") # 错误, 最开始使用了关键字参数, 那么后面的"6小时"的位置就串了,容易出现混乱
注意: 在使用混合参数的时候, 关键字参数必须在位置参数后面
(2)参数的分类--形参的分类
位置参数:按照位置来赋值, 到⽬目前为⽌止, 我们编写的函数都是这种
默认值参数:在函数声明的时候, 就可以给出函数参数的默认值. 在调用的时候可以 给出具体的值, 也可以不给值, 使用默认值.
比如, 我们录入咱们班学生的基本信息. 通过调查发现. 我们班大部分学生都是男生. 这个时候就可以给出⼀个sex='男'的默认值.
def stu_info(name, age, sex='男'): print("录⼊入学⽣生信息") print(name, age, sex) print("录⼊入完毕") stu_info("张强强", 18)
注意, 必须先声明位置参数, 才能声明默认值参数.
Homework
1.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。
def func(lst): # function return lst[1::2] # result = [] # for i in range(len(lst)): # if i % 2 == 1: # result.append(lst[i]) # return result #很明显代码量大 ret=func([1,2,5,8,7]) print(ret)
2.写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
def func(obj): # if len(obj) > 5: # return True # else: # return False return len(obj) > 5 #返回结果 print(func("倚天屠龙记张无忌"))
3.写函数,检查传入列表的长度,如果大于2,将列表的前两项内容返回给调用者。
def func(lst): if len(lst) > 2: return lst[:2]
4.写函数,计算传入函数的字符串中, 数字、字母、空格 以及 其他内容的个数,并返回结果。
def count(info): a=0 b=0 c=0 d=0 for el in info: if el.isdigit(): a+=1 elif el.isalpha(): b+=1 elif el.isspace(): c+=1 else: d+=1 return a,b,c,d ret = count ("ASD78489 __") print(ret)
5.写函数,接收两个数字参数,返回比较大的那个数字。
def func(a, b): # if a > b: # return a # else: # return b return a if a > b else b #三目运算
7.写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表
def func(dic): for k, v in dic.items(): if len(v) > 2: v = v[:2] dic[k] = v return dic print(func({"k1": "v1v1", "k2": [11,22,33,44]}))
8.写函数,函数接收四个参数分别是:姓名,性别,年龄,学历。用户通过输入这四个内容,然后将这四个内容传入到函数中,此函数接收到这四个内容,将内容追加到一个student_msg文件中。
def stu_info(name,age,education,sex): f=open("student_msg",mode="a",encoding="utf-8") f.write("%s %s %s %s\n" % (name,age,education,sex)) a = input("请输入学生姓名:") b = input("请输入学生年龄:") c = input("请输入学生学历:") d = input("请输入学生性别:") stu_info(a,b,c,d )
9.对第9题升级:支持用户持续输入,Q或者q退出,性别默认为男,如果遇到女学生,则把性别输入女。
def stu_info(name,age,education,sex="男"): f=open("student_msg",mode="a",encoding="utf-8") f.write("%s %s %s %s\n" % (name,age,education,sex)) f.flush() f.close() while 1: name = input("请输入学生姓名(输入Q退出):") if name.upper()=="Q": break else: age = input("请输入学生年龄:") education = input("请输入学生学历:") sex = input("请输入学生性别(如果是女生则输入女,男生不需要输入,任意键跳过输入):") if sex == "女": stu_info(name,age,education,sex) else: stu_info(name, age, education)
def func(name, age, edu, gender="男"): f = open("student_msg", mode="a", encoding="utf-8") f.write(name+"_"+gender+"_"+age+"_"+edu+"\n") f.flush() f.close() while 1: tiwen = input("请问是否要输入学生信息输入任意内容继续,输入Q退出:") if tiwen.upper() == 'Q': break name = input("请输入你的姓名:") gender = input("请输入你的性别:") age = input("请输入你的年龄:") edu = input("请输入你的学历:") gender = "男" if gender == "" else "女" func(name, age, edu, gender)
8,写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作。
def revise(name,old,new): import os with open ("%s" % name,mode="r",encoding="utf-8" )as f1,\ open ("%s_副本"% name,mode ="w",encoding="utf-8" ) as f2: for line in f1: New_line = line.replace("%s" % old,"%s" %new) f2.write(New_line) os.remove("%s"% name) os.rename("%s_副本" % name, "%s"% name) a =input("请输入您要修改的文件名:") b = input("请输入你要修改的内容:") c = input("请输入你修改的新内容:") revise(name=a,old=b,new=c)
import os def func(file_name, old, new): with open(file_name, mode="r", encoding="utf-8") as f1, \ open(file_name+"_副本", mode="w", encoding="utf-8") as f2: for line in f1: line = line.replace(old, new) f2.write(line) os.remove(file_name) os.rename(file_name+"_副本", file_name)
12.写一个函数完成三次登陆功能,再写一个函数完成注册功能
def regist(username, password): # wusir # 1. 检查用户名是否重复 f = open("user_info", mode="r+", encoding="utf-8") for line in f: if line == "": # 防止空行影响程序运行 continue user_info_username = line.split("_")[0] if username == user_info_username: # 用户名重复了 return False else: # 2. 写入到文件中 f.write(username+"_"+password+"\n") f.flush() f.close() return True name, psw = input("请输入你的用户名:"), input("请输入你的密码:") print(regist(name, psw)) def login(username, password): f = open("user_info", mode="r", encoding="UTF-8") for line in f: if line.strip() == username+"_"+password: f.close() return True else: f.close() return False for i in range(2, -1, -1): ret = login(input("请输入用户名:"), input("请输入密码:")) if ret: print("恭喜你. 登录成功") break else: print("用户名或密码错误, 还有%s次机会" % i)