接上一篇产品经理的 Python 自学之路(一),聊一聊掌握 Python 基石概念后,为什么自己写代码还是那么难呢?其中重要的一点是编程语言思维和日常解决问题的思维有差异。
假设一个场景,如果让你通过问卷从一群有男有女的高中生中找出会打篮球的男生。你会怎么找呢?你肯定只会给男生发问卷是吧?
好,那 Python 是怎么做的呢?
先看一个例子。
假设 A 是一个字典组成的列表,包括了不同国家在不同年份的人口数、三个字母的国别码。
A=[
{
'Country Name':'Arab World',
'Country Code':'ARB',
'Year':'1960',
'Value':'96388069'
},
{
'Country Name':'Arab World',
'Country Code':'ARB',
'Year':'1961',
‘Value':'98882541'
},
…
]
(用“…”表示省略)
B 是一个字典,包含两个字母的国别码。
B={
'ad':'Andorra',
'ae':'United Arab Emirates',
'af':'Afghanistan',
…
}
A 中有些国家在 B 中并没有。现在要绘制一张2010年世界人口地图。需得到一个字典,其键值对的 key 是 2 位数国别码,value 是人口数。
求2010 年的人口数比较方便。关键是 2010 年的国家对应的 2 位数国别码怎么求?
刚开始的时候,我是这么想的:根据 A ,首先能求出 2010 年的所有国家,可以写个列表。那么只要把这个列表里的每一项和 B 去匹配,匹配得上的,取到对应的 key (即 2 位数国别码)。完美!!那我只要写一个函数,这个函数的参数是一个列表,传入列表,得到一个匹配的结果。
好棒,开始写函数!然后特么的就悲剧了.....写不来....
然后我看答案:
def get_country_code(country_name):
for code,name in B.items():
if name==country_name:
return code
return None
C={}
for a in A:
if a['Year']=='2010':
country_name=a['Country Name']
population=int(a['Value']))
code=get_country_code(country_name)
if code:
C[code]=population
print C
要求出 2010 年的国家对应的 2 位数国别码,我的思路是:
在所有年份的国家里(A)筛选出含2010年的所有国家 -> 挑出哪些国家含2位数国别码 -> 分解这个整体,求得这些国家的2位国别码。
而 Python(或者编程语言)的思路是:
求得含2010年的所有国家 -> 求得每个国家的2位国家码 -> 去掉没有2位国家码的国家,将含 2 位国家码的国家汇集。
我的思路,或者说日常解决问题的思路是从整体里找特殊的个体,再去解析个体什么属性。就像开篇的场景中,先把人分成男女,再在男生里找更细分群体。
而 Python 是看成一个个个体,去找带有某个属性的个体。它会给所有人发问卷,筛选出带“打篮球”属性的个体,再筛选出带“男生”属性的个体。在这个例子中,在它的眼里,没有“子类”、“细分群体”这样的结构概念。个体都是平等的,只有带或不带某种属性的差异。
以上是一个重要的差异。还有一些小差异。比如它先假定结果存在。想把国别码和人口数量作为键值对组成一个字典,现实世界的思路是先找到这俩要素,再组成字典。但编码时先定义了字典 C={},再去找俩要素。这对于小白来说一开始还是挺痛苦的。
有空再写一篇小白学 Python tips..