目录
1 抽象和结构
2 例子
3 升华
抽象可以节省很多工作,实际上它的作用还要更大。它是使得计算机程序可以让人读懂的关键(这也是最基本的要求,不管是读还是写程序)
自己的理解:抽象,就是将实现一个功能的一系列的操作先简明的说出来,之后具体的实现,再用具体的函数去表达。
书中的小结:抽象是隐藏多余细节的艺术。定义处理细节的函数可以让程序更抽象。
编写一个存储名字并且能用名字、中间名或者姓查找联系人的程序:
(1)考虑采用什么数据结构;
(2)抽象为几个函数:初始化函数+获得名字+存储名字。
知识点:
(1)数据结构中,字典中的字典,如下所示:
data = {'first':{'Li':[Li Jing Yi]},
'middle':{'Jing':[Li Jing Yi]},
'last':{'Yi':[Li Jing yi]}
}
(2)字符串的split()函数:字符串分隔为列表;
代码:
#初始化
def init(data):
data['first']={}
data['middle']={}
data['last']={}
#获得名字
def GetName(data,label,name):
return data[label].get(name)
#存储名字
def storage(data,Full_name):
labels = 'first','middle','last'
#labels =['first','middle','last']也是ok的
names = Full_name.split()#将字符串切片为列表
for label,name in zip(labels,names):
people=GetName(data,label,name)
if people:
pass
# people.append(Full_name)#Python简明教程上用的是这样一句话,
# 但我觉得这句话没用
else:
data[label][name]=[Full_name]
#data[label][name]=Full_name#也是ok的,相当于value是string类型
while True:
Myname={}
init(Myname)
try:
Full_name=input("请输入名字\n")
storage(Myname,Full_name)
print(GetName(Myname,'last','Yi'))
finally:
break
上面的例子中,参数可以实现一次多输入。实现如下:
#初始化
def init(data):
data['first']={}
data['middle']={}
data['last']={}
#查找名字
def lookup(data,label,name):
return data[label].get(name)
#存储名字
def store(data,*full_names):
for full_name in full_names:
names=full_name.split()
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]#使用list可以进行data的append
print(data)
Myname={}
init(Myname)
store(Myname,'Li Jing Yi','Li hao yuan')
print(lookup(Myname,'first','Li'))
递归的关键:将问题分解为小部分,递归不能永远继续下去,因为其总是以最小可能性问题结束,而这些问题有存储在基本上实例中。
#阶乘的普通实现
def factorial(n):
result = n
for i in range(1,n):
print(i)
result *= i
return result
#阶乘的递归实现
def factorial(n):
if n==1:
return 1
else:
return n*factorial(n-1)
print(factorial(5))