8/18
今日考题
1.详细写出注册登录功能每步逻辑思路
# 1.首先获取用户的注册用户名和密码 用input赋值给变量
# 2.先要做校验,用r模式打开文件
# 3.用for循环一行行读取文件然后用split把用户名和密码分割
# 4.for循环比对用户名没有重复回到步骤2
# 5.然后写入用户名字和密码用|分隔开最后加上|\n分割加换行(方便比对)
# 6.写入后注册的循环结束
# 7.登录也是先用input获取用户名密码
# 8.和3一样加一个解压赋值的技巧把用户名和密码一起比对
# 9.两者都正确才能登录成功结束登录循环程序跑完
# 10.失败的话和for循环比对同级别缩进这样for跑完没有比对到结果跑else失败提示错误
2.什么是函数,写出语法结构
函数就是提前做好的可以调用的工具 可以化简代码 让运维轻松好多
def 函数名(参数1,参数2):
'''函数注释
函数说明书
告诉别人这个函数写好了怎么用'''
函数体代码
return 函数返回值
复习巩固
- 简易文件拷贝系统
1.获取即将要拷贝文件路径
2.获取拷贝到哪里的目标路径
3.用with语法打开两个文件
1用r打开
2用w打开
4.循环读取步骤1中的文件 一行行写入步骤2
- 简易注册登录
# 注册
1.获取用户名和密码
2.以w打开文件
将用户名和密码组织成一个固定的格式写入
leo|123
# 登录
1.和上面一样获取用户名和密码
2.以r打开文件
读取文件内容按照固定的字符切割出用户名和密码
3.再与用户输入的用户名和密码比对
- 拔高注册登录
# 注册
1.获取用户名和密码
2.以r打开文件
for循环获取每一行数据
通过split分开之后取第一个值是用户名
一直比对没有重复再往下走
3.再以a打开文件
将用户名和密码写入(中间用|分隔方便取值对比,末尾添加换行符)
# 登录
1.一样获取用户名和密码
2.也用r打开打开文件
for循环读取每一行数据
用split分割之后比对
要两种都对才算登录成功
- 文件操作补充
flush # 将内存文件数据立刻刷新到硬盘
read() # 可以指定读取的字符或者字节数
seek # 控制光标的移动
"""硬盘删除数据的原理
固态硬盘原理不一样"""
- 函数基本
函数就相当于是工具
提前定义了之后就可以反复使用
使用函数有一个必须要遵守的尊则"先定义后使用"
定义函数的语法结构
def 函数名(参数1,参数2):
'''函数注释(产品说明书)'''
函数体代码
return 返回值
内容概要
- 函数的返回值
- 函数的参数(重要)
- 利用函数对注册登录封装
- 常见的内置函数
内置函数就是python解释器内部自带的函数
别人已经帮你写好了直接用就行
详细讲解
强调
# 1.定义和调用
定义函数使用关键字def
调用需要
函数名加() 如果函数需要参数 则额外传递参数
# 2.定义阶段
函数在定义阶段 只检测语法 不执行代码
# 3.调用阶段
函数名加括号调用函数的时候才执行函数代码
函数的返回值
# 返回值是什么?
就是执行完这个函数反馈出的结果
# 如何获取返回值?
通过 变量名 = 方法/函数() 即可
1.当函数体没有return返回默认为None
2.return关键字后面写什么函数就返还什么
3.return后面有多个值会默认变成元组返还
4.函数体代码执行到return直接结束当前函数
函数类型
1.无参函数:函数在定义阶段没有参数 调用阶段也不需要参数
def index():
print('from index')
index()
# 这就是典型的无参函数
2.有参函数:函数在定义阶段括号内填写了变量名即需要参数
def index(x):
print('from index',x)
index(1)
# 这种输出的时候x就会变成1
3.空函数 (没有具体函数体代码)
'''一般用于前期布局'''
def sleepy():
pass # 补全语法 本身没有任何含义
函数的参数
函数在定义阶段括号内的变量名叫做形式参数 简称形参
函数在调用阶段括号内的值称为函数的实际参数 简称实参
两者在调用函数的时候临时绑定 函数运行结束分开
def index(name): # 形参
print(name)
index('leo') # 实参 这个阶段可以理解为name = 'leo'
1.位置参数 按照位置一一对应传值 多一个不行少一个也不行
def index(x, y):
print(x, y)
index() # 不传不行
index(1) # 传少了也不行
index(1,2) # 个数正确可以
index(1,2,3,4,5,6,7) # 传多了也不行
2.关键字参数:指名道姓的给形参传值 可以打破位置限制
index(y=111, x=222)
index(111, y=222)
index(111, x=222) # 报错 两个抢位子了
print(y=111,222) # 报错 位置参数一定要在关键字参数的前面
3.默认参数:函数在定义阶段就给形参赋值了
def register(name, age, gender='male'):
print(name, age, gender)
'''默认参数不给值的情况下就使用默认的 给了就使用给了的'''
register('jason', 18)
register('tony', 28)
register('kevin', 38)
register('huahua', 18, 'female')
结果是:
jason 18 male
tony 28 male
kevin 38 male
huahua 18 female
4.可变长参数(最常用)
4.1函数如何做到无论接收多少个位置参数都可以正常运行?
用到之前见过一次的接收符号*
*会接收多余的位置参数组织成元组的形式赋值给*后面的变量名
def func(a, *b):
print(a, b)
func(1,2,3,4,5,6,7,8,9,10)
func(1)
4.2函数如何做到无论接收多少个关键字参数都可以正常运行?
关键字那想到就是通过K:V键值对这样两个数据写入
两个数据就用**
**会接收多余的关键字参数组织成字典的形式赋值给**后面的变量名
def func(a,**b):
print(a,b)
func(a=1,b=2,c=3,d=4,e=5)
func(a=1)
# 那怎么定义一个函数既能随意接收位置参数又能随意接收关键字参数呢?
def func(*a, **b):
'''
在python中约定俗成
针对形参中的可变长参数 变量名推荐使用
def login(*args, **kwargs):
'''
*与**在实参中作用
l = [11, 22, 33, 44, 55]
d = {'username': 'jason', 'pwd': 123, 'hobby': 'read'}
def func(*args, **kwargs):
print(args, kwargs)
# *在实参中使用 会将列表/元组内的元素打散成一个个位置参数传递给函数
func(*l) # 相当于func(11,22,33,44,55)
# **在实参中使用 会将字典内的元素打散成一个个关键字参数传递给函数
func(**d) # 相当于是func(username='jason',pwd=123,hobby='read')
登录注册封装
"""
将面条版代码封装成函数版
1.先写def和函数名
2.将代码缩进
3.查看内部需要哪些数据
4.在形参中定义出来即可
尽量做到一个函数就是一个具体的功能
"""
def auth_username(username):
# 校验用户名是否存在
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for line in f:
real_name = line.split('|')[0]
if real_name == username:
print('用户名已存在')
return True
return False
def get_info():
username = input('username>>>:').strip()
password = input('password>>>:').strip()
return username, password
def write_data(username, password):
# 将用户名和密码写入文件
with open(r'userinfo.txt', 'a', encoding='utf8') as f:
f.write('%s|%s\n' % (username, password))
print('%s注册成功' % username)
def register():
username, password = get_info()
# 调用校验用户名是否存在的函数
is_exist = auth_username(username)
if is_exist:
return
write_data(username, password)
def login():
username, password = get_info()
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for line in f:
real_name, real_pwd = line.split('|')
if real_name == username and password == real_pwd.strip('\n'):
print('登录成功')
return
print('用户名或密码错误')
func_dict = {'1': register,
'2': login
}
while True:
print("""
1 注册
2 登录
""")
choice = input('请输入执行功能编号>>>:').strip()
if choice in func_dict:
func_name = func_dict.get(choice)
func_name()
else:
print('请输入正确的编号')
内置函数
print(abs(-111))
print(all([1, 2, 3, 4, 0]))
print(any([1, 2, 3, 4, 0]))
print(bin(100))
print(oct(100))
print(hex(100))
# 判断变量是否可以调用
def index():
pass
name = 'leo'
print(callable(name)) # False
print(callable(index)) # True
# 返回ASCII码中数字对应的字符
print(chr(65)) # A 65-90
print(chr(122)) # z 97-122
# format字符串格式化输出
print('my name is {} and my age is {}'.format('leo', 18))
print('my name is {0} {1} {1} and my age is {1} {0}'.format('leo', 18))
print('my name is {name} {name} {age} and my age is {age}'.format(name='leo', age=18))
l = ['leo', 'ace', 'nancy', 'tony', 'jason']
count = 1
for name in l:
print(count, name)
count += 1
for i, name in enumerate(l, 10):
print(i, name)
l = [11, 22, 33, 44, 55, 66, 77, 88, 99]
print(max(l))
print(min(l))
print(sum(l))