相信大家对众多选择判断语句都感到很厌烦,一大堆的
if something:do something()
else:
do something,
或者是
switch(something):
case st1:do1
case st2:do2
...
case stn:don
谁看了都会烦。不仅增加了巨大的代码量,而且不能很好地进行逻辑封装。
其实看到标题,高手就知道怎么做了。是的,就是用数组,列表或字典来替代这些选择判断语句。怎么处理呢?
比如我要对不同类型的书籍进行不同的处理,用 python 来实现
有个 read_book: 方法
read_book(book):
ret = None
if book == 'python':
ret = python()
elif book == 'C#':
ret = CSharp()
elif book == 'C':
ret = C()
elif book == 'C++':
ret = CPlus()
elif book == 'java':
ret = java()
elif book == 'lua':
ret = lua()
return ret
我认为读者看到一大堆if,都不会想看下去了,这样的代码实在太烂了。好,让我们来修改一下,我这里是用字典来实现的,请看我是怎样用字典来实现的:
read_book(book):
book_dict = { 'python': python(), 'C#': CSharp(), 'C':C(), 'C++':CPlus(), 'java':java(),'lua':lua() }
return book_dict[book]
看到没,两行就解决了!!不仅节省了大量代码,而且思路也更加清晰。
如果书籍有多种分类呢?比如上面的是程序书籍,如果我想看人文书籍呢?这就涉及到了 一Key 对 多Key 的问题,其实也很好解决。
read_book(cataglog, book):
book_dict = {'promgram': { 'python': python(),
'C#': CSharp(),
'C':C(),
'C++':CPlus(),
'java':java(),
'lua':lua() }
'renwen': { 'zhexue': zhexue(),
'shici': shici(),
'sanwen': sanwen(),
'guwen':guwen() }
}
return book_dict[catalog][book]
如果用if,就要使用两层嵌套,如果有多个嵌套,那代码看起来岂不是很恶心!!
我这里是用字典实现的,因为字典的索引好操作,很直观。如果用数组或列表,就可以用多维数组,但这个不好操作,要先遍历一遍数组或列表,对于数据量不大的时候,跟if判断语句差不多;如果数据量很大,可以别去遍历,先进行检索 Key,再去查找相应的函数。
其实我这里有个不足之处,就是每调用一次read_book函数,都要把所有的函数(执行这些python(),CSharp(),C())执行一次,这样会大大削弱程序性能。如果函数不复杂,也影响不了多少;如果函数很复杂呢?别担心,还是有解决办法的。
read_book(cataglog, book):
#注意,我用双引号把函数变成字符串
book_dict = {'promgram': { 'python': 'python()',
'C#': 'CSharp()',
'C':'C()',
'C++':'CPlus()',
'java':'java()',
'lua':'lua()' }
'renwen': { 'zhexue': 'zhexue()',
'shici': 'shici()',
'sanwen': 'sanwen()',
'guwen':'guwen()' }
}
return eval(book_dict[catalog][book])
大家注意到没,我把函数转成字符串,这样就不用执行全部函数了,只在最后用 eval() 执行一次函数,是不是很爽啊?!!!
其他语言也一样,要根据语言的数据结构来编码。
推荐几个用python写的网站:
python站:http://simple-is-better.com/news/552
站长工具界新秀 站长工具 www.gongju.com, 这里有个很好用的网站测速工具:ce.gongju.com/www.csdn.net
博客园里(http://www.cnblogs.com/descusr/archive/2012/04/27/2473684.html)也有我的这篇文章,不知CSDN允不允许我把同一篇文章放到不同的网站