怎样写一个小程序

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

知识点查找:字典(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]的调用,不理解的复习字典那章

 

    

  

  






 

 

  

    

  

转载于:https://www.cnblogs.com/addicted-to-you/p/10088593.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值