有时候,为了节省几行代码或者想让你的同事对你刮目相看,你会编写一些更“精巧”的代码,但是,编写这种代码是要付出代价的:牺牲了代码可读性和简单性。下面来看一个例子,代码1-9,对字典序列进行排序:
这段代码有什么问题?
当然,在一行代码中,利用lambda表达式按照first_name对字典进行排序,可以让代码看起来比使用for循环更加精巧,并没有什么问题。
但是,咋一看这段代码,会发现并没那么容易理解,尤其是对新手来说更是如此,因为lambda表达式怪异的语法,并没有那么容易掌握。当然,在这里使用lambda表达式的确节省了一些代码量,看起来貌似精巧,但是,这种做法并没有让代码的易读性和容错性更强。比如,这段代码忽视了键值缺失的场景,同时也没有考虑字典正确是否。
下面用函数来改写一下这段代码,让其更易读,容错性更强。函数会检查非预期值,编写起来也更加容易,如代码1-10所示:
你可以看到,这段代码检查了所有可能的非预期值,且比之前的单行代码更易读。单行代码虽然节省了代码量,但给代码带来了一定的复杂度。需要说明的是,并不是说单行代码就一定不好,在这里我要阐明的观点是,如果单行代码让你的代码更难阅读,请尽量避免使用。
所以,在编写代码的时候需要意识到这点,单行代码有时会让你的代码更易读,有时候恰恰相反。
让我们来看另外一个例子,在这个例子中,会读取一个CSV文件,并对所处理的行数进行计数,代码1-11所示说明了为什么代码的可读性如此重要,同时也说明了为什么命名在代码可读性中会起到重要的作用。
将代码分割成帮助函数(helper function)可让复杂代码更容易阅读,而且在代码碰到错误时更容易调试。
这段代码在with语句中完成多个功能,为了让代码易读性更强,需要将从CSV文件中处理薪水的代码放到另外一个函数里让代码产生更不易产生错误。另外,调试这种多行代码也会非常困难,所以在定义函数的时候,需要有明确的目标和界限。下面,将这些代码进一步进行分割,如代码1-12所示:
我们在这里创建了个帮助函数,而不是在with语句里完成所有的功能,这种做法可以让开发人员更清晰地了解process_salary函数的功能。如果你要处理更多的场景,或者从CSV文件里读取更多的数据,可以按照上述简单原则将函数进一步进行分割。