函数的使用涉及很多逻辑合理性的内容,优秀的代码,逻辑清晰,代码简洁,函数调用恰当,内存占用小,cpu计算量小,方方面面涉及很多技巧和思维方式,需要程序员多读代码,多思考,勤试错。
这篇代码总觉得还有很多需要优化的地方,但总是逻辑不清,搞不明白修改哪里合适,怎么修改?先贴上来,以后有思路再做调整。
需求是这样的:从一个列有员工信息的文件中查找所需要的内容,给出这个文件格式如下
id name age phone post
1,ryan,28,135********,HR
2,...
3,...
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
import re def show(i,inquire,li,dic): ''' 展示出用户要求展示的内容,即select与where之间的内容 :param i: 循环文件得来的每一行 :param inquire: 用户输入的语句 :param li: 放入筛选结果的列表 :param dic: 文件每行内容分割后放入的字典 :return: ''' lis = re.split('select|where.*|\s|,', inquire) lis = list(filter(lambda x: x, lis)) #筛选出select与where之间的内容 for k in lis: #循环select与where之间的内容 if k == '*': #如果是* li.append(i) #则把这一整行都放入列表 else: li.append(dic[k]) #否则把字典中k的值放入列表 def filt(i,inquire,li,dic): ''' 筛选出符合条件的行,即符合where之后条件的内容 :param i: 循环文件得来的每一行 :param inquire: 用户输入的语句 :param li: 放入筛选结果的列表 :param dic: 文件每行内容分割后放入的字典 :return: ''' lis = re.split('where', inquire) if '>' in lis[1]: lis8 = lis[1].split('>') if lis8[0].strip() in dic and int(dic[lis8[0].strip()]) > int(lis8[1].strip()): show(i,inquire,li,dic) if '<' in lis[1]: lis8 = lis[1].split('<') if lis8[0].strip() in dic and int(dic[lis8[0].strip()]) < int(lis8[1].strip()): show(i, inquire, li, dic) elif '=' in lis[1]: lis8 = lis[1].split('=') if lis8[0].strip() in dic and dic[lis8[0].strip()] == lis8[1].strip(): show(i, inquire, li, dic) elif 'like' in lis[0]: lis8 = lis[1].split('like') if lis8[1].strip() in dic and lis8[1].strip() in dic[lis8[0].strip()]: show(i, inquire, li, dic) with open('staff_information',encoding='utf-8') as f: inquire = input('请输入语句:').strip() for i in f: li = [] lis = i.strip().split(',') dic = {'name': lis[1], 'id': lis[0], 'age':lis[2], 'phone': lis[3], 'job': lis[4]} #把文件内容分割后(注意每分割必先除去前后空字符),然后把每个元素放入一个key是代表每列内容名字的字典中 filt(i, inquire, li, dic) #过滤文件内容并按用户要求仿佛列表中 if li:print(li) #用胡输入的查询语句如下: #select name,age where age >22 #select * where phone like 135 #selext name where post=HR