第一周作业
1 练习题
1、简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释型
1.编译型:类似于百度翻译,执行效率高 (c,java)
2.解释型:类似于同声传译,开发效率高 (python: 后出现的能使用前出现的(资源),反过来不行)
2、执行 Python 脚本的两种方式是什么
交互模式和脚本文件方式
3、Pyhton 单行注释和多行注释分别用什么?
单行注释 #
多行注释 ,,, ,,, """ """
4、布尔值分别有什么?
一个True一个False
5、声明变量注意事项有那些?
1. 可以由数字、字母、下划线组合
2. 不能以数字开头
3. 不能与系统关键字保留字重名
4. 见名知意,建议使用_连接语法(驼峰 owenName OwenName | _连接 owen_name),一般_开头或结尾都有特殊含义
6.如何查看变量在内存中的地址?
id(x)
7.写代码
- 1.实现用户输入用户名和密码,当用户名为 seven 且 密码为 123 时,显示登陆成功,否则登陆失败!
usr = input('usr:')
pwd = input('pwd:')
if usr == 'seven' and pwd == '123':
print('登录成功')
else:
print('登录失败')
- 2.实现用户输入用户名和密码,当用户名为 seven 且 密码为 123 时,显示登陆成功,否则登陆失败,失败时允许重复输入三次
count = 1
# while True:
# if count > 3:
# break
while count <= 3:
usr = input('usr:')
pwd = input('pwd:')
if usr == 'seven' and pwd == '123':
print('登录成功')
break
else:
print('登录失败')
count += 1
- 3.实现用户输入用户名和密码,当用户名为 seven 或 alex 且 密码为 123 时,显示登陆成功,否则登陆失败,失败时允许重复输入三次
users = ['seven', 'alex']
# 新增用户的接口
users.append('abc')
count = 1
# while True:
# if count > 3:
# break
while count <= 3:
usr = input('usr:')
pwd = input('pwd:')
if usr in users and pwd == '123':
print('登录成功')
break
else:
print('登录失败')
count += 1
8.写代码
a. 使用while循环实现输出2-3+4-5+6…+100 的和
count=2
sum=0
sum_ji=0
while count < 101:
if count%2 == 0:
sum = sum + count
else:
sum_ji = sum_ji + count
count+=1
print(sum-sum_ji)
b. 使用 while 循环实现输出 1,2,3,4,5, 7,8,9, 11,12 使用 while 循环实现输出 1-100 内的所有奇数
count=1
while count < 13:
if count == 6:
pass
else:
print(count)
count+=1
count = 1
while count < 101:
if count%2 == 1:
print("奇数",count)
count += 1
e. 使用 while 循环实现输出 1-100 内的所有偶数
count = 1
while count < 101:
if count%2 == 0:
print("偶数",count)
count += 1
9.现有如下两个变量,请简述 n1 和 n2 是什么关系?
n1 = 123456
n2 = n1
print(id(n2))
print(id(n1))
# n1和n2共用同一个内存地址
2 作业:编写登陆接口
基础需求:
让用户输入用户名密码
认证成功后显示欢迎信息
输错三次后退出程序
dic={
'egon1':{'password':'123','count':0},
'egon2':{'password':'123','count':0},
'egon3':{'password':'123','count':0},
}
while True:
name=input('username>>: ')
if not name in dic:
print('用户不存在')
continue
if dic[name]['count'] > 2:
print('尝试次数过多,锁定')
continue
password=input('password>>: ')
if password == dic[name]['password']:
print('登录成功')
break
else:
print('用户名或密码错误')
dic[name]['count']+=1
升级需求:
可以支持多个用户登录 (提示,通过列表存多个账户信息)
用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态(提示:需把用户锁定的状态存到文件里)
#db.txt内容:egon1|egon2|
dic={
'egon1':{'password':'123','count':0},
'egon2':{'password':'123','count':0},
'egon3':{'password':'123','count':0},
}
count=0
while True:
name=input('u>>: ')
if name not in dic:
print('用户不存在')
continue
with open('db.txt','r') as f:
lock_users=f.read().split('|')
if name in lock_users:
print('用户%s已经被锁定' %name)
break
if dic[name]['count'] > 2:
print('尝试次数过多,锁定')
with open('db.txt','a') as f:
f.write('%s|' %name)
break
password=input('p>>: ')
if password == dic[name]:
print('登录成功')
break
else:
print('用户名或密码错误')
dic[name]['count']+=1
综合题
读用户信息文件:用什么数据结构存储用户信息
写用户信息文件:写什么内容到用户信息文件
用户登录逻辑
usr = one
[[one, 123, 0], [two, 000, 0]]
{"one": [123, 0], "two": [000, 0]}
{"one": {"pwd": 123, "locked": 0}, "two": {"pwd": 000, "locked": 0}}
def read_user():
dic = {}
with open('user.info', 'r', encoding='utf-8') as f:
data = f.read() # 所有内容
if data: # 读到了信息,才进行数据分析
user_infos = data.split('\n') # 换行分割成一个个用户的信息
for info in user_infos:
if info: # 用户信息正常
usr, pwd, lock = info.split('|') # 每个用户的三个信息分别取出
# 为什么要这样转化: "one": {"pwd": 123, "locked": 0}
dic[usr] = {"pwd": pwd, "locked": int(lock)}
return dic
# print(read_user())
def write_user(dic):
info = ''
for key, value in dic.items(): # "one", {"pwd": 123, "locked": 0}
usr = key
pwd = value['pwd']
lock = value['locked']
info += '%s|%s|%s\n' % (usr, pwd, lock)
# print(info)
with open('user.info', 'w', encoding='utf-8') as f:
f.write(info)
# dic = read_user()
# dic['one']['locked'] = 1
# dic['one']['pwd'] = 456
# write_user(dic)
is_over = False
while not is_over:
usr = input('usr:')
user_dic = read_user() # 拿到用户信息
if usr in user_dic: # 账号存在
count = 1
while True:
if user_dic[usr]['locked']: # 锁定了
print('该账号已锁定')
break
if count > 3:
user_dic[usr]['locked'] = 1 # 改内存信息并不能持久化锁定状态
# 持久化锁定状态一定要写入文件
write_user(user_dic)
print('该账号已被锁定')
# 内存循环体要停止外层循环,通过改变bool类型变量的值
is_over = True
break
pwd = input('pwd:')
if pwd == user_dic[usr]['pwd']:
print('登录成功')
is_over = True
break
else:
print('密码错误')
count += 1
第二周作业
1.统计元组中所有数据属于字符串的个数,提示:isinstance()
数据:t1 = (1, 2, ‘3’, ‘4’, 5, ‘6’)
结果:3
法一:
t1 = (1, 2, '3', '4', 5, '6')
count = 0
for i in t1:
if type(i) == str:
# print(">>>",i,type(i))
count += 1
print(count)
法二:
t1 = (1, 2, '3', '4', 5, '6')
count = 0
for v in t1:
if isinstance(v, str):
count += 1
print(count)
2.将以下数据存储为字典类型
数据:info = “name:Owen|age:18|gender:男”
结果:{‘name’: ‘Owen’, ‘age’: 18, ‘gender’: ‘男’}
注:年龄存储为数字类型
#字符串的split、join
#list、dict的增删改查
user = "name:Owen|age:18|gender:男"
dic = {}
for info in user.split('|'):
key, value = info.split(":")
if value.isdigit():
value = int(value)
dic[key] = value
print(dic)
3.完成数据的去重
数据:t3 = (1, 2, 1, 2, 3, 5, 9)
结果:t3 = (1, 2, 3, 5, 9)
注:从不考虑顺序、考虑顺序两方面完成
t3 = (3, 1, 2, 1, 2, 3, 5, 9)
print(tuple(set(t3)))
t = []
for v in t3:
if v not in t:
t.append(v)
print(tuple(t))
考虑排序
t3 = (1, 2, 1, 2, 3, 5, 9)
t3 = list(t3)
t3.sort() #sort 排序
t3 = list(set(t3)) #集合去重
t3 = tuple(t3)
print(t3)
4.计算元组中所有可以转换为数字的数据的总和
数据:t4 = (10, ‘abc’, ‘100’, ‘3’)
运算结果:113
t4 = (10, 'abc', '100', '3')
sum = 0
#遍历每一个元素,把每个元素都转为字符串,然后用它isdigit判断是否为数字,判断通过的转为数字进行计算
for num in t4:
num = str(num)
if num.isdigit(): #判断数字
num = int(num)
# print(num,type(num))
sum += num
print(sum)
t4 = (10, 'abc', '100', '3')
sum = 0
for v in t4:
# if isinstance(v, int):
# sum += v
# elif v.isdigit():
# sum += int(v)
# if isinstance(v, int) or v.isdigit():
# sum += int(v)
if not (isinstance(v, int) or v.isdigit()):
continue
sum += int(v)
print(sum)
5.将数据转换类型存储
原数据:dic = {‘name’: ‘Owen’, ‘age’: 18, ‘gender’: ‘男’}
处理后:info = [(‘name’, ‘Owen’), (‘age’, 18), (‘gender’, ‘男’)]
dic = {'name': 'Owen', 'age': 18, 'gender': '男'}
info = []
for k, v in dic.items():
info.append((k, v))
print(info) # [('name', 'Owen'), ('age', 18), ('gender', '男')]
print(list(dic.items()))
info = [['name', 'Owen'], ('age', 18), ('gender', '男')]
print(dict(info))
拓展:选做
1.计算元组中所有可以转换为数字的数据的总和
数据:t4 = (10, ‘abc’, ‘100’, ‘3’, ‘壹’, ‘肆’, [1000], (10000,))
运算结果:11118
提示:
- 利用字符串isnumeric()判断汉字
- 利用字典{‘壹’: 1 …}将汉字转换为数字
- 利用isinstance()将list和tuple中数据取出来
- 先将所有转化为数字的数据存放在一个单列集合中,在做运算
num_map = {
'壹': 1,
# ...
'肆': 4
}
t4 = (10, 'abc', '100', '3', '壹', '肆', [1000, 0], (10000,))
# print(t4)
sum = 0
for v in t4:
if isinstance(v, int):
sum += v
elif isinstance(v, (list, tuple)):
for num in v:
sum += num
elif v.isdigit():
sum += int(v)
elif v in num_map:
sum += num_map[v]
print(sum)
t4 = (10, 'abc', '100', '3', '壹', '肆', [1000], (10000,))
num_map = {'壹': 1, '贰': 2, '仨': 3,
'肆': 4, '伍': 5, '陆': 6,
'柒': 7, '捌': 8, '玖': 9, '拾': 10}
nums = []
for v in t4:
if isinstance(v, int):
nums.append(v)
elif isinstance(v, str):
if v.isdigit():
nums.append(int(v))
elif v.isnumeric():
nums.append(num_map[v])
elif isinstance(v, tuple) or isinstance(v, list):
# 只考虑该具体数据,不考虑更复杂情况
for n in v:
nums.append(n)
total = sum(nums) # python内置方法
print(total)
2.完成录入电话本
需求:
-- 从键盘中录入姓名(不区分大小写):
-- 姓名必须是全英文组成,不是则重新录入姓名,如果是q,代表退出
-- 从键盘中再录入电话:
-- 电话必须为数字且长度必须是11位(不能转换为数字)
-- 如果出现姓名相同,则保留最后一次电话号码
-- 形成的数据是有电话分组的,如:第一次录入Owen,13355667788,则会形成
-- {
'O': {
'Owen': '13355667788'
}
}
最终数据,分组名一定大写:
{
'E': {
'egon': '17788990000',
'engo': '16633445566'
},
'O': {
'Owen': '13355667788'
}
}
法一:
phone_dic = {}
while True:
name = input('name: ')
if name == 'q':
break
if not name.isalpha():
continue
while True:
phone = input('phone: ')
if not (phone.isdigit() and len(phone) == 11):
continue
# 根据名字拿到分组
group = name[0].upper()
# 分组第一次出现,新建分组,不是第一次出现,什么都不做
# phone_dic.setdefault(group, {})
if group not in phone_dic:
phone_dic[group] = {}
else:
pass
# 默认值为什么要采用字典:每个分组下可以存放多个
# 人与电话对对象关系,这种对象关系自然采用字典存储
phone_dic[group][name] = phone
print('添加成功')
break
print(phone_dic)
法二:
# 电话本
phone_map = {}
# 是否退出系统
is_over = False
while not is_over:
# 姓名初始制空,完成只有姓名输入正确才录入电话
name = ''
while True:
# 姓名必须录入正确
if not name:
name = input("name:")
if name == 'q':
# 退出系统
is_over = True
break
elif not name.isalpha():
# 录入错误,置空名字
print('name error')
name = ''
continue
# 录入电话,保证是11位的数字字符串
phone = input("phone:")
if not (phone.isdigit() and len(phone) == 11):
continue
# 取组名
group = name[0:1].upper()
# 对于组名的操作:无组名,添加分组 | 有组名,不操作
phone_map.setdefault(group, {})
phone_map[group][name] = phone
# 一条信息添加完毕,重置信息
name = ''
phone = ''
print('录入成功')
print(phone_map)
第三周作业
1.统计文件数据中字母e出现的次数(不区分大小写)
文件内容:hello friend, can you speak English!
结果:4
分析:将文件内容读出,然后统计读出的字符串串中字符e的个数(字符串串count功能)
with open('1', 'r', encoding='utf-8') as f:
data = f.read().lower()
print(data.count('e'))
2.统计文件数据中出现的的所有字符与该字符出现的个数(不区分大小写,标点与空格也算)
文件内容:hello friend, can you speak English!
结果:
{
'h': 1,
'e': 4,
'l': 3,
'o': 2,
' ': 5,
...
}
分析:将文件内容读出,然后统计读出的字符串中每个字符的个数,形成字段(for遍历读取的字符串)
with open('zuoye.txt', 'r', encoding='utf-8') as f:
data = f.read()
# print(data) #hello friend, can you speak English!
s=set() #集合
for i in data:
s.add(i)
# print(s) #{'l', 's', 'd', 'o', '!', 'k', 'f', 'p', ' ', 'E', 'h', 'y', 'g', 'i', 'a', 'c', 'r', 'u', 'e', ',', 'n'}
dic = {} #字典
for t in s:
# print(t,data.count(t))
dic[t] = data.count(t)
print(dic) #{'d': 1, 'e': 3, 'E': 1, 'g': 1, 'k': 1, 's': 2, '!': 1, ',': 1, 'a': 2, 'p': 1, 'c': 1, 'y': 1, 'l': 3, 'i': 2, 'h': 2, 'r': 1, 'o': 2, ' ': 5, 'n': 3, 'u': 1, 'f': 1}
dic = {}
with open('1', 'r', encoding='utf-8') as f:
data = f.read().lower()
for v in data:
# if v not in dic:
# dic[v] = 1
# else:
# dic[v] += 1
# 如果dic中没有v这个key,就添加并设置默认值,如果有啥事不干
# dic.setdefault(v, 0)
if v not in dic:
dic[v] = 0
else:
pass
dic[v] += 1
print(dic)
3.读取文件内容,分析出所有的账号及对应的密码
文件内容:owen:123456|egon:123qwe|liuxx:000000
结果:
{
'owen': '123456',
'egon': '123qwe',
'liuxx': '000000'
}
分析:将文件内容读出,然后按|拆分出 账号:密码 格式的子字符串,再按:拆分成 账号及密码,存放到字典中
法一:
with open('zuoye03.txt', 'r', encoding='utf-8') as f:
data = f.read()
data = (data.split('|')) #['owen:123456', 'egon:123qwe', 'liuxx:000000']
info_dic = {}
for msg in data:
k,v = msg.split(':')
info_dic[k] = v
print(info_dic) #{'owen': '123456', 'egon': '123qwe', 'liuxx': '000000'}
法二:
info = 'owen:123456|egon:123qwe|liuxx:000000'
dic = {}
for user in info.split('|'):
usr, pwd = user.split(':')
dic[usr] = pwd
print(dic)
4.在题3的基础上,账号密码已经被存储在文件中,完成用户登录成功或失败(只做一次性判断)
⽂文件内容:owen:123456|egon:123qwe|liuxx:000000
需求:输入账号、密码,然后进行登录判断,账号密码均正确打印登录成功,否则打印登录失败
分析:先完成题3,分析出账号密码字典,然后拿输⼊入的账号密码与字典中数据进行校验
法一:
with open('zuoye03.txt', 'r', encoding='utf-8') as f:
data = f.read()
data = (data.split('|')) #['owen:123456', 'egon:123qwe', 'liuxx:000000']
info_dic = {}
for msg in data:
k,v = msg.split(':')
info_dic[k] = v
# print(info_dic) #{'owen': '123456', 'egon': '123qwe', 'liuxx': '000000'}
count = 0
while count < 3:
name = input('>>>请输入用户:')
if name not in info_dic:
print('用户不存在')
continue
count += 1
password = input('>>>请输入密码:')
if password == info_dic[name]:
print('登录成功')
break
else:
print("用户名或密码错误")
法二
info = 'owen:123456|egon:123qwe|liuxx:000000'
dic = {}
for user in info.split('|'):
usr, pwd = user.split(':')
dic[usr] = pwd
usr = input('usr:')
pwd = input('pwd:')
if usr in dic and pwd == dic[usr]:
print('登录成功')
else:
print('登录失败')
# if usr in dic:
# if pwd == dic[usr]:
# print('登录成功')
# else:
# print('密码错误')
# else:
# print('账号不存在')
5.在题3的基础上,完成用户注册的功能(只做一次性判断)
文件内容:owen:123456|egon:123qwe|liuxx:000000
需求:输入注册的账号、密码,账号已存在的打印账号已存在,注册失败,反正打印注册成功,并将新账号密码录入文件
结果:如果输入mac、123123 => owen:123456|egon:123qwe|liuxx:000000|mac:123123
分析:先完成题3,分析出账号密码字典,然后拿输⼊入的注册账号与字典中数据进行校验,如果校验没有新账号
– 1.采用 w 模式写文件,可以在读取文件的内容后拼接 |mac:123123
字符串,将拼接后的总字符串一次性写入
– 2.采用 a 模式写文件,可以直接追加写入 |mac:123123
字符串
with open('zuoye03.txt', 'r', encoding='utf-8') as f:
data = f.read()
data = (data.split('|')) #['owen:123456', 'egon:123qwe', 'liuxx:000000']
info_dic = {}
for msg in data:
k,v = msg.split(':')
info_dic[k] = v
# print(info_dic) #{'owen': '123456', 'egon': '123qwe', 'liuxx': '000000'}
while True:
name = input(">>> 请输入要注册的用户:")
if name not in info_dic:
password = input(">>> 请输入注册用户的密码:")
with open('zuoye03.txt', 'a', encoding='utf-8') as f:
f.write('|')
f.write(name)
f.write(':')
f.write(password)
f.flush()
user_info = "恭喜,您的用户已创建成功。\n 用户:%s ,密码:%s" %(name,password)
print(user_info)
break
else:
print("用户已存在,请输入其他用户名!!!")
continue
拓展1.统计文件中大写字母、小写字母、数字及其他字符出现的次数
文件内容:Abc123,-+XYZopq000.?/
结果:
{
‘大写字母’: 4,
‘小写字母’: 5,
‘数字’: 6,
‘其他字符’: 6
}
分析:利用ASCII表,for循环遍历每一个字符value,eg:’a’ <= value <= ‘z’就代表是小写字母
dic = {}
info = 'Abc123,-+XYZopq000.?/'
for v in info:
if 'a' <= v <= 'z':
dic.setdefault('小写字母', 0)
dic['小写字母'] += 1
elif 'A' <= v <= 'Z':
dic.setdefault('大写字母', 0)
dic['大写字母'] += 1
elif v.isdigit():
dic.setdefault('数字', 0)
dic['数字'] += 1
else:
dic.setdefault('其他', 0)
dic['其他'] += 1
print(dic)
字符串比较:按从左到右,逐个字符进行ASCII值比较
print('a' > 'A') # 97 > 65
print('呵呵abc'.encode('utf-8'))
print('\x61')
print('bc' > 'ad')
print('ab' > 'a')
拓拓展2.完成登录注册系统(从空⽂文件开始做)
需求分析:
1.可以循环登录注册,输入1代表选择登录功能,输入2代表注册功能,输入0代表退出,其他输入代表
输入有误,重输
2.用户的账号密码信息存放在usr.txt文件中,保证⽤用户注册成功后,重启系统,用户信息仍然保存
3.登录在账号验证通过才输入密码验证登录,账号验证三次失败自动进入注册功能,登录三次验证失败
自动退出系统
4.第一次注册,文件写入 账号:密码 信息,再次注册追加写入 |账号:密码 信息
so = int(input(">>登录请输入1"))
# 登录
if so == 1:
with open('zuoye03.txt', 'r', encoding='utf-8') as f:
data = f.read()
data = (data.split('|')) #['owen:123456', 'egon:123qwe', 'liuxx:000000']
info_dic = {}
for msg in data:
k,v = msg.split(':')
info_dic[k] = v
# print(info_dic) #{'owen': '123456', 'egon': '123qwe', 'liuxx': '000000'}
count = 0
while count < 3:
name = input('>>>请输入用户:')
if name not in info_dic:
print('用户不存在')
continue
count += 1
password = input('>>>请输入密码:')
if password == info_dic[name]:
print('登录成功')
break
else:
print("用户名或密码错误")
if so == 2:
# 注册
with open('zuoye03.txt', 'r', encoding='utf-8') as f:
data = f.read()
data = (data.split('|')) #['owen:123456', 'egon:123qwe', 'liuxx:000000']
info_dic = {}
for msg in data:
k,v = msg.split(':')
info_dic[k] = v
# print(info_dic) #{'owen': '123456', 'egon': '123qwe', 'liuxx': '000000'}
while True:
name = input(">>> 请输入要注册的用户:")
if name not in info_dic:
password = input(">>> 请输入注册用户的密码:")
with open('zuoye03.txt', 'a', encoding='utf-8') as f:
f.write('|')
f.write(name)
f.write(':')
f.write(password)
f.flush()
user_info = "恭喜,您的用户已创建成功。\n 用户:%s ,密码:%s" %(name,password)
print(user_info)
break
else:
print("用户已存在,请输入其他用户名!!!")
continue
if so == 0:
quit()
法二:
def read_user():
dic = {}
with open('2', 'r', encoding='utf-8') as f:
data = f.read()
if data: # 读到了信息,才进行数据分析
user_infos = data.split('|')
for info in user_infos:
if info: # 用户信息正常
usr, pwd = info.split(':')
dic[usr] = pwd
return dic
def write_user(dic):
info = ''
for usr, pwd in dic.items(): # "one", {"pwd": 123, "locked": 0}
info += '%s:%s|' % (usr, pwd)
if info:
info = info[:-1] # 去掉最末尾的|
with open('2', 'w', encoding='utf-8') as f:
f.write(info)
# 一次性注册
# user_dic = read_user()
# usr = input('usr:')
# if usr not in user_dic:
# pwd = input('pwd:')
# user_dic[usr] = pwd
# write_user(user_dic)
# print('注册成功')
# else:
# print('账号已存在')
is_over = False
while not is_over:
cmd = input("""请输入:
0:<退出> 1:<登录> 2:<注册>
>>>: """)
if cmd == '0':
print('退出系统')
break
elif cmd in ['1', '2']:
# 登录与注册都需要用户信息
user_dic = read_user()
if cmd == '1':
print('登录功能')
count = 1
while True:
if count > 3:
print('账号多次错误,去注册吧,孩子!')
cmd = '2'
break
usr = input('usr:')
if usr not in user_dic:
print('账号不存在,请查证')
count += 1
continue
# 如果能往下走,代表账号输对了
count = 1 # 重置账号失败的次数
tag = 1
while True:
if tag > 3:
print('密码错误次数过多,退出系统')
is_over = True
break
pwd = input('pwd:')
if user_dic[usr] != pwd:
print('密码错误')
tag += 1
continue
# 如果能接着往下,代表账号密码均正确
print('登录成功')
is_over = True
break
break
if cmd == '2':
print('注册功能')
usr = input('usr:')
if usr not in user_dic:
pwd = input('pwd:')
user_dic[usr] = pwd
write_user(user_dic)
print('注册成功')
else:
print('账号已存在')
else:
print('指令有误,重新输入')
continue
知识点:
while is_over:
while True:
# usr
is_over = True
while True:
# pwd
is_over = True
break
break