假如你要编写一个程序,让他存储姓名,并让用户能够根据名字、中间名或姓找人。
知识点查找:字典(Dictionary)中 setdefault()方法
1) 对某一对象具体化编程:
storage = {} storage['first'] = {} storage['second'] = {} storage['third'] = {} me = ['bei ji xiong'] storage['first']['bei'] = me storage['second']['ji'] = me storage['third']['xiogn'] = me print(storage['first']['bei']) print(storage) 执行结果如下: ['bei ji xiong'] {'first': {'bei': ['bei ji xiong']}, 'second': {'ji': ['bei ji xiong']}, 'third': {'xiong': ['bei ji xiong']}}
注:以上 me = ['bei ji xiong']用列表表示会在以后添加成员时出现不可预料错误
错误情况如下: {'first': {'bei': ['bei ji xiong', 'bei qi er']}, 'second': {'ji': ['bei ji xiong', 'bei qi er'], 'qi': ['bei qi er']}, 'third': {'xiong': ['bei ji xiong', 'bei qi er'], 'er': ['bei qi er']}} 分析原因: dic = {'1': ['one']} dic.setdefault('1', None).append('first') dic.setdefault('2', []).append('two')
#dic.setdefault('2', 'two').append('two') print(dic) 执行结果如下: {'1': ['one', 'first'], '2': ['two']}
AttributeError: 'str' object has no attribute 'append'
注:setdefault第二个参数决定是否能使用append方法,当有多个‘.’时,只看方法的对象是啥,不用考虑别的。
分析:将人员添加到这个数据结构中有点繁琐,在名,中间名,姓相同时尤是如此。
storage = {} storage['first'] = {} storage['second'] = {} storage['third'] = {} me = 'bei ji xiong' storage['first']['bei'] = [me] storage['second']['ji'] = [me] storage['third']['xiong'] = [me] you = 'bei qi er' storage['first'].setdefault('bei', []).append(you) storage['second'].setdefault('qi', []).append(you) storage['third'].setdefault('er', []).append(you) print(storage) 执行结果如下: {'first': {'bei': ['bei ji xiong', 'bei qi er']}, 'second': {'ji': ['bei ji xiong'], 'qi': ['bei qi er']}, 'third': {'xiong': ['bei ji xiong'], 'er': ['bei qi er']}}
2)单一具体对象到多个抽象对象(抽象的关键在于隐藏所有的更新细节)
1>初始化一个数据结构函数(数据结构听起来是不是挺熟悉)
def init(data): data['first'] = {} data['second'] = {} data['third'] = {} storage = {} target = init(storage) print(target) print(storage)
#print(type(init(storage)))
执行结果如下:
None
{'first': {}, 'second': {}, 'third': {}}
#<class 'NoneType'>
注:字符串(以及数和元组)是不可变的,这就意味着你不能修改他们(只能替换为新值)//p95页
对于不可修改的,可通过return返回来改变,也可将其转换为可修改的对象,修改完成在转换回去
对于可修改对象,使用函数来修改数据结构(如列表或字典)是不错的方式
2> 编写获取人员姓名的函数
3> 编写存储人员姓名的函数
def init(data): data['first'] = {} data['second'] = {} data['third'] = {} #编写获取人员姓名的函数 def lookup(data, label, name): return data[label].get[name] #编写存储人员姓名的函数 def store(data, full_name): names = full_name.split() if len(names) == 2: names.insert(1, '') labels = 'first', 'middle', 'last' for label, name in zip(labels, names): people = lookup(data, label, name) if people: people.append(full_name) else: data[label][name] = [full_name] Mynames={} init(Mynames) print(Mynames) store(Mynames, "Mag Lie Hetland") lookup(Mynames, 'middle', 'Lie')
注:存在错误,待修改
TypeError: 'builtin_function_or_method' object is not subscriptable
总结:
某一对象->具体方案
对对象抽象->用数据结构表示
应用到多个类似对象上->封装,继承,多态
2019/1/12
问题提问:
1)怎么创建一个初始化数据结构的函数,我怎么觉得storage不是字典啊?
答:从一般到抽象,创建字典除了用dict函数外,还可以初始化一个字典,再添加值‘
storage={} storage["banana"]='favorite' print(storage)
2)创建的字典键对应的值为空,接下来,怎么添加对应的值呢,这是个问题?
答:这就要编写一个“存储人员姓名的函数”,这需要比较好的设计,创建一个函数要与参数data相关联,
显然要将名字分割,分别存储到对应键上,又该如何分割呢?p97
3) 有了存储人员姓名的函数,怎么获取人员姓名的函数?
答:这个问题就比较简单了,字典中获取人员姓名的函数
data[label].get(name)是对data[label][name]=[full_name]的调用,不理解的复习字典那章