考试题目整理
#python2和python3的一个区别,
k=1000
count = 0
while k>1:
count+=1
print(k)
k=k/2
#在python2中输出1到9,
#在python3中输出1到10,
#原因是对于1.9这个数字
#python2中会当作1,
#python3中会当作1.9,
#会影响到k>1的判断,
l1 = []
with open('t1.txt',encoding='utf-8') as f1:
name_list = f1.readline().strip().split(',')
for i in f1:
dic = {}
i_list = i.strip().split(',')
for j in range(len(i_list)):
dic[name_list[j]] = i_list[j]
l1.append(dic)
print(l1)
#重点看这句:name_list = f1.readline().strip().split(',')
#这句实现了真正意义上的通用,
#之前还是在开头定义好了表头,
#这个直接从文件中读取,进而获取表头的结构,
choice_dict = {
1: login,
2: register,
3: article,
4: diary,
5: comment,
6: enshrine,
7: login_out,
8: Quit,
}
choice = input('请输入您选择的序号:').strip()
if choice.isdigit():
choice = int(choice)
if 0 < choice <= len(choice_dict):
choice_dict[choice]()
#这个写法可以学习,把选择定义进字典,就没有那么多elif的判断了,
#员工信息查询作业,我在参考太白老师select功能代码后,写出了set功能的代码,
name_list = ['id', 'name', 'age', 'phone', 'job'] #索引与员工信息表每行信息的每列一一对应
check_conditions = ['>', '<', '=', 'like']
def update():
try: #这个异常捕获倒是懒,这么大堆语句,直接一个try,就处理了,
update_info = input('请输入更新语句:格式set name=value where cond').strip()
content, condition = update_info.split('where') #把set更新语言以where为标志,分为查询内容和查询条件两部分
if 'set' in content: #如果内容中没有set,说明语句肯定有问题
for key in check_conditions: #遍历>,<,=,like判断条件,
if key in condition: #进一步确定,我们更新语句中是哪一个判断条件,
index_check_conditions = check_conditions.index(key) #后面有一个字典,可以将一个判断类型符号,转换到一个完整的判断语句,见36行,
name,cond = condition.strip().split(key) #对条件(比如a>5)进行处理,得到键和值(a和5),
content = ''.join(content.split('set')[1:]) #得到我们要更改内容的键值对,
with open('员工信息表', encoding='utf-8') as f1,\
open('员工信息表_bak',encoding='utf-8', mode= 'w') as f2:
for line in f1:
if line.strip():
line_list = [i.strip() for i in line.strip().replace(',', ',').split(',')] #将文件中每行记录,处理为列表的形式,
index = name_list.index(name.strip()) #获取我们查询条件中的键,在表头中的位置在哪.
check_dict = { #解读下字典,任何条件的判断,到最后往往都是转换为数值大小的比较or字符串相关的比较,
0: int(line_list[index]) > int(cond), #前面的值是通过index获取从文件中读取某条记录某项的值,后面是我们输入语句条件部分的值,
1: int(line_list[index]) < int(cond),
2: line_list[index].strip() == cond.strip(),
3: cond.strip() in line_list[index].strip(), #原来like内部是通过in来判断的啊,
}
if check_dict[index_check_conditions]: #字典中的键,在前面通过check_conditions获取了,
# print('OK') #这里返回True或者False,来决定我们是否要修改当前读取到的这行记录,
str1 = ''
if ','in content.strip(): #有,代表要更改多项数值,没有说明只更改一项数据,
print('OK_1')
update_name_value_list = content.strip().split(',') #将要更新的语句中的键值对,分隔开来,
update_name_list = []
print('OK_2',update_name_value_list)
for x in update_name_value_list:
update_name_list.append([x.split('=')[0],x.split('=')[1]]) #将我们要更新的数据,以列表的形式添加进另一个列表中保存,
print('OK_3', update_name_list)
for x in name_list: #以name_list中数据存储的顺序为基础循环,并比较我们要更改的数据,
for names_values in update_name_list:
if names_values[0] == x: #此处相等说明,当前数据项是我们要更新的,
str1 = str1 + names_values[1]+',' #将我们要修改的数据添加进str中,
break
else:
str1 = str1 + line_list[name_list.index(x)]+ ',' #此处相当于没有修改要修改项目的值,
str1 = str1[:-1] #末尾多了个,所以这里就是来消除的,
print('OK_5', str1)
f2.write(str1) if f2.tell() == 0 else f2.write('\n{}'.format(str1)) #有内容的文件,写入是接着最后一行的后面,所以根据情况判断是否添加\n,
else:
#下面的分支,为修改的数据项只有一个的情况,比上面的还简单写,不重复描述了!!!
update_name_list = content.strip().split('=')
for x in name_list:
if update_name_list[0] == x:
str1 = str1 + update_name_list[1] + ','
else:
str1 = str1 + line_list[name_list.index(x)] + ','
str1 = str1[:-1]
f2.write(str1) if f2.tell() == 0 else f2.write('\n{}'.format(str1))
else:
print(line,'这里没有被修改',f2.tell()) #不满足查询条件的部分,直接将原语句写入,
f2.write(line) if f2.tell()==0 else f2.write('\n{}'.format(line))
os.remove('员工信息表')
print('OK_7')
os.rename('员工信息表_bak','员工信息表')
else:
print('你没有输入set或者set输入有误,请重新输入')
except Exception:
print('你输入的查询语句有误,请重新输入')
# ps:
# d = {'YQ':33}
# print(d) # {'YQ': 33}
# print(d.keys()) # dict_keys(['YQ'])
# print(d.values()) # dict_values([33])
# print(d.items()) # dict_items([('YQ', 33)])
# 刚求证了,字典确实没有办法直接获取,键or值,for循环倒是可以,就是感觉有点冗余,
#景老师版的员工信息查询,模块化比较高,只有查功能,set的改功能我还没有实现.
def read_file():
with open('员工信息表',encoding='utf-8') as f: #这里把读取文件,做成了迭代器,好样的!!!然后呢,我这里被自己吭了,就是中英文逗号的问题,
for line in f:
line_lst = line.strip().split(',')
yield line_lst
def filter_item(col,value,condition):
dic = {'id':0,'name':1,'age':2,'phone':3,'job':4}
correct = []
for line_lst in read_file(): #这里是从文件中读取数据,不过这个数据是处理过的,即数据项以列表的形式存在,
if eval(condition): #这里是上一个函数的条件判断语句,条件判断,就两种可能,True或False,满足就把数据添加进列表,
correct.append(line_lst)
return correct
def condition_an(con):
if '>' in con: #这里是age>22,这里的四个分支都一样
col_name,value = con.split('>') #得到age 和 22 两部分,
condition = 'int(line_lst[dic[col]]) > int(value)' #首先这里是字符串,然后里面的那些变量,在传递到后面会出现的,
elif '<' in con:
col_name,value = con.split('<')
condition = 'int(line_lst[dic[col]]) < int(value)'
elif '=' in con:
col_name,value = con.split('=')
condition = 'line_lst[dic[col]] == value'
elif 'like' in con:
col_name,value = con.split('like')
condition = 'value in line_lst[dic[col]]'
correct = filter_item(col_name.strip(), value.strip(), condition) #传入键值对和筛选条件,int(line_lst[dic[col]]) > int(value)
return correct
def show(col,correct): #这里的col,是我们查询语句中的待查数据项,
dic = {'id': 0, 'name': 1, 'age': 2, 'phone': 3, 'job': 4}
if '*' == col.strip():
col_lst = dic.keys() #这里会得到表头的信息,
else:
col_lst = col.split(',')
for i in correct: #这里的i是一行完整的信息,
for col in col_lst: #不过打印什么信息,取决于这里,即前面可能包含了5个信息,但是这里的循环,可能之后3个,总之少于5个,
print(i[dic[col]],end=' ') #并且这里通过dic字典,可以得到我们要查询数据项在整个数据中的位置,
print() #这里的print,是为了换行而存在的,
exp = 'select * where age>22' #待查询的语句
col,con = exp.split('where') #将语句分隔为两部分,前面是待查询的数据项,后面是筛选条件,
col = col.replace('select','').strip() #打印结果是*,相当于仅留下待查询的数据项部分,
print(col,con) #显示:* age>22
correct = condition_an(con) #对条件进行处理,
show(col,correct) #显示数据的函数,