怎样写一个小程序

假如你要编写一个程序,让他存储姓名,并让用户能够根据名字、中间名或姓找人。

知识点查找:字典(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>初始化一个数据结构函数(数据结构听起来是不是挺熟悉)

扫描二维码关注公众号,回复: 4427951 查看本文章
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

总结:

某一对象->具体方案

对对象抽象->用数据结构表示

应用到多个类似对象上->封装,继承,多态

 

    

  

  






  

    

  

猜你喜欢

转载自www.cnblogs.com/addicted-to-you/p/10088593.html