函数
【一】函数定义
-
函数就是将我们某一块代码封装起来后可以在某处直接使用的代码块。
-
前提条件:只有先定函数才能调用
-
先定义在调用
-
【二】函数的语法
-
循环结构有关键字:while,if,else,elif....
-
函数的关键词就是:def
-
return值 : 定义函数的返回值,return用的时候就写,不用的时候可以不写(可有可无)
-
pass:表示什么都不做
【1】标准函数结构
-
定义
''' def 函数名() 代码体 #调用 函数名() ''' #什么是代码体:代码体可能包含各种语句、表达式、函数、类等
【2】定义函数
#定义 def name(): print(f"当前用户已登入!") #调用(定义完之后使用) name()#输出:当前用户已登入!
【3】函数的内部原理
-
在函数定义阶段
-
def表示在内存空间中开启一个内存空间地址
-
name给i这块内存地址取名字
-
()函数可能会接收到参数
-
代码体 函数可以执行的代码块
-
【三】函数的类型
【1】有参函数,无参函数(定义函数的时候)
(1)无参函数
-
()里面没有放变量
-
函数内部可以直接使用外部头顶上面的参数
#方式一 在函数头顶上指定参数 username = "tom" password = "710" def login(): #函数内部可以做直接使用外部头顶的参数 if username == "tom" and password == "710": print("当前用户登入成功!") else: print("当前用户登入失败!") login()
(2)有参函数
-
()里面放变量
-
函数内部可以直接使用外部头顶上面的参数
#方式二 有参函数在()的里面放变量名即可 def login(username,password): if username == "tom" and password == "710": print("当前用户登入成功!")#调用login("tom","710")正确的用户名密码 else: print("当前用户登入失败!")#调用login("dream","521")错误的用户名密码 login("tom","710") #(1)按照位置传递参数,参数位置不能随意改变 #用户名在前密码在后login("tom","710") #(2)按照关键词传参数,位置可以变动 #login(username="tom",password="710")
-
区分有参函数和无参函数就看()里面有没有变量名
-
无参函数不需要参数传递直接就可以用
-
有参函数调用的时候需要传递参数
-
传递参数可以按照位置传递参数,函数定义的那个变量在前就先传哪个
-
user_input(username,password)
-
login("tom","710")
-
-
传递参数也可以按照关键字传参,函数定义的时候那个参数在前没影响
-
user_input(username,password)
-
login(username="tom",password="710")
-
【四】有返回值函数和无返回值函数
-
函数的返回值是元组( 不懂)
def get_user_pwd():#输出填写用户名和密码的信息 username = input("请输入用户名 :>>>>> ").strip() password = input("请输入密 码 :>>>>> ").strip() return username, password #元组的特性 解压赋值 def login(username, password): if username == 'dream' and password == '521':#判断密码用户名是否正确 print(f"登录成功") else: print('登录失败') def register(username, password):#登入的用户名密码 # 模拟打开了文件并写入内容 data = f'{username}|{password}' print(data) def main(): print(f"当前功能如下 : 1 登录 2 注册") func_id = input("请输入功能ID ").strip() func_id = int(func_id) if func_id == 1: username, password = get_user_pwd() login(username=username, password=password) elif func_id == 2: username, password = get_user_pwd() register(username=username, password=password) main()
[五]文本文件登入系统优化)练习题
# 【全局异常捕获】 # 在指定位置添加异常捕获机制 # 如果遇到异常和报错要捕获异常信息并做定制化输出 # 【总需求】 # 【1】打印功能菜单供用户选择 # 【2】校验功能ID是否存在并且符合数字格式 # 【3】根据指定功能ID进入到指定的功能中 # 【注册功能】 # 【1】用户输入用户名和密码 # 【2】校验用户名是否存在,如果已经存在则禁止注册,否则允许注册 # 【3】使用文本文件作为数据存储位置 # 【4】用户注册时指定默认锁定状态为未锁定 # 【登录功能】 # 【1】用户输入用户名和密码 # 【2】校验用户名是否存在,如果不存在则提示注册 # 【3】校验用户状态是否是锁定状态,如果锁定不允许登录并提示管理员解除 # 【4】未锁定用户允许重试输入密码,最大重试次数为3次并提示剩余尝试次数 # 【5】用户输入密码错误次数达最大尝试次数后修改默认锁定状态为锁定 # 【文件拷贝功能】 # 【1】用户登录成功后允许使用文件拷贝程序 # 【2】用户输入指定的路径(源文件) # (1)打开文件 (文本文件w 二进制是wb) # (2)对文件类型做区分 # 【3】用户输入指定的路径(新文件) # (1)复制当前文件到新位置 # (2)按照指定文件类型赋值新文件(可重命名或者使用原本的文件名)
get_username_password(): username_input = input("请输入用户名 :>>>> ").strip() password_input = input("请输入密 码 :>>>> ").strip() return username_input, password_input # 保存数据 def save_data(data, file='user_data.text'): # 打开文件 with open(file=file, mode='a', encoding='utf-8') as fp: # 写数据 fp.write(data + '\n') # 读取数据 # 第五步 读取用户数据 def read_data(file='user_data.text'): # 第六步 打开文件 ---> 将文件内容切割 拼成字典 try: user_data_dict = {} # 打开文件 with open(file=file, mode='r', encoding='utf-8') as fp: for line in fp: username, password, lock = line.strip().split(':') user_data_dict[username] = { 'username': username, 'password': password, 'is_locked': bool(int(lock)) } # 第七步 用户文件存在并且已经做好了定制 然后返回给代用的函数使用 return user_data_dict except: # 可能会遇到第一次进来文件不存在 直接返回空的字典 return {} # 公共的函数:用来校验当前用户是否存在 # 第三步 进入到校验用户是否存在的函数中 def exist_user(username): # 第四步 从文件中读取用户数据 # 第八步 从读取数据的函数中获取到了 拼接号的数据字典 # {'dream': {'username': 'dream', 'password': '521', 'is_locked': False}} user_data_dict = read_data() # 第九步:从数据字典中获取得到当前用户名所对应的数据 如果有 没有就是 None user_data = user_data_dict.get(username) if not user_data: # None不存在 返回False return False else: # 如果存在则返回 True return True def register(): print("当前是注册功能") # 第一步 输入用户名和密码 username_input, password_input = get_username_password() # 第二步 先校验当前用户是否存在 # 第十步 接收到函数判断出来的结果 是存在True 还是不存在False is_exist = exist_user(username_input) # 第十一步 已经判断出存在了 不让注册 if is_exist: return False, f"当前用户 {username_input} 已存在不允许注册" else: # 第十二步 用户不存在 允许注册 # 拼成指定的数据格式 data = f'{username_input}:{password_input}:0' # 第十三步 调用保存数据的函数方法 保存数据 save_data(data) return True, f"当前用户 {username_input} 注册成功!" def login(): print(f"当前是登录功能") return True, f'登录成功' def copy_file(): print("当前是文件拷贝功能") # print(type(copy_file)) # <class 'function'> # print(id(copy_file)) # 2198084305104 func_menu = ''' ########################## 功能菜单 ########################## 1.注册 2.登录 3.文件拷贝 q.退出 ''' func_dict = { '1': register, '2': login, '3': copy_file } def main(): while True: # 【一】打印功能菜单 print(func_menu) # 【二】输入功能ID func_id = input("请输入功能ID :>>>> ").strip() if not func_id.isdigit(): print(f"当前功能ID不是数字,不合法!") func = func_dict.get(func_id) tag, msg = func() if tag: print(msg) break else: print(msg) continue main() # def login(username='dream'): # if username == 'dream': # print("登录成功") # # login(username='opp')
【六】练习
-
使用函数完善剩下功能
# 【全局异常捕获】 # 在指定位置添加异常捕获机制 # 如果遇到异常和报错要捕获异常信息并做定制化输出 # 【总需求】 # 【1】打印功能菜单供用户选择 # 【2】校验功能ID是否存在并且符合数字格式 # 【3】根据指定功能ID进入到指定的功能中