《笨办法学Python》 第38课手记
注意这是第三版的《笨办法学Python》的内容,我后来发现第三版存在很大的问题,就放弃了第三版开始使用第四版,第四版的第38课是读代码,这里保留之前的手记,因为它们是有价值。
不在写第四课的手记,因为是读代码课。但是之后的课程手记全部是针对第四版的,第三版弃之不用了。
本节课内容较多,可以慢慢理解,虽然标题是列表,但实际其实是一种叫做字典(dict)的数据结构。
列表是有序排列的一些物件,而字典是将一些物件(keys)对应到另外一些物件(values) 的数据结构。这句话出自39课的常见问题解答。
原代码如下(缩进统一使用四个空格):
# create a mapping of state to abbreviation
states = {
'Oregon': 'OR',
'Florida': 'FL',
'California': 'CA',
'New York': 'NY',
'Michigan': 'MI',
}
# create a basic set of states and some cities in them
cities = {
'CA': 'San Francisco',
'MI': 'Detroit',
'FL': 'Jacksonville'
}
# add some more cities
cities['NY'] = 'New York'
cities['OR'] = 'Portland'
# print out some cities
print '-' * 10
print "NY State has: ", cities['NY']
print "OR State has: ", cities['OR']
# print some states
print '-' * 10
print "Michigan's abbreviation is: ", states['Michigan']
print "Florida's abbreviation is: ", states['Florida']
# do it by using the states then cities dict
print '-' * 10
print "Michigan has: ", cities[states['Michigan']]
print "Florida has: ", cities[states['Florida']]
# print every state abbreviation
print '-' * 10
for state, abbrev in states.items():
print "%s is abbreviated %s" % (state, abbrev)
# print every city in state
print '-' * 10
for abbrev, city in cities.items():
print "%s has the city %s" % (abbrev, city)
# now do both at the same time
print '-' * 10
for state, abbrev in states.items():
print "%s state is abbreviated %s and has city %s" % (
state, abbrev, cities[abbrev])
print '-' * 10
# safely get a abbreviation by state that might not be there
state = states.get('Texas', None)
if not state:
print "Sorry, no Texas."
# get a city with a default values
city = cities.get('TX', 'Does Not Exist')
print "The city for the state 'TX' is: %s" % city
结果如下:
一块一块地来解释吧。
首先定义了字典,这里有两种定义(事实上第二种是在添加字典中的元素)的方式。
①
第一种:
states = {
‘Oregon’: ‘OR’,
‘Florida’: ‘FL’,
‘California’: ‘CA’,
‘New York’: ‘NY’,
‘Michigan’: ‘MI’,
}
第二种:
cities[‘NY’] = ‘New York’
cities[‘OR’] = ‘Portland’
而在使用时,以states[‘缩写’]的形式即可表示相应的字符串,这比数组强大的多,数组只能以基数来区分其中的元素,列表以缩写来区分,显然方便的多,使用时不再要求你记住数值,缩写是你在学英语时以及记住的东西。
②
print ‘-’ * 10
print “Michigan has: “, cities[states[‘Michigan’]]
print “Florida has: “, cities[states[‘Florida’]]
这里是嵌套调用,因为states和cities是在定义时就是嵌套定义的,所以可以嵌套使用,请记住这个用法。
③
print ‘-’ * 10
for state, abbrev in states.items():
print “%s is abbreviated %s” % (state, abbrev)
abbrev也是一个关键字,是指列表中元素的缩写。states.item()会遍历states里面的所有内容。
④
state = states.get(‘Texas’, None)
这里涉及到get函数。
描述:
Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值。
语法:
dict.get(key, default=None)
参数:
key – 字典中要查找的键。
default – 如果指定键的值不存在时,返回该默认值值。
返回值:
返回指定键的值,如果值不在字典中返回默认值None。None是一个逻辑值,表示为假。所以if语句满足运行的条件,而最后一块代码中变量city中储存的值不是一个逻辑值而是字符串。
本节课涉及的知识
其实本节课这种类型的列表变量还有专门的名字叫做字典(dict),字典由键和值组成,键是数据库里面的键(key),相当于我们日常生活中字典的页码,是一种索引或者说地址,每一个键都对应一个值。
Operation | Result |
---|---|
len(a) | the number of items in a 得到字典中元素的个数 |
a[k] | the item of a with key k 取得键K所对应的值 |
a[k] = v | set a[k] to v 设定键k所对应的值成为v |
del a[k] | remove a[k] from a 从字典中删除键为k的元素 |
a.clear() | remove all items from a 清空整个字典 |
a.copy() | a (shallow) copy of a 得到字典副本 |
k in a | True if a has a key k, else False 字典中存在键k则为返回True,没有则返回False |
k not in a | Equivalent to not k in a 字典中不存在键k则为返回true,反之返回False |
a.has_key(k) | Equivalent to k in a, use that form in new code 等价于k in a |
a.items() | a copy of a’s list of (key, value) pairs 得到一个键值的list |
a.keys() | a copy of a’s list of keys 得到键的list |
a.update([b]) | updates (and overwrites) key/value pairs from b 从b字典中更新a字典,如果键相同则更新,a中不存在则追加 |
a.fromkeys(seq[, value]) | Creates a new dictionary with keys from seq and values set to value 创建一个新的字典,键来自seq,值对应键对应的值 |
a.values() | a copy of a’s list of values 得到字典值的副本 |
a.get(k[, x]) | a[k] if k in a, else x 得到a[k],若存在返回x |
a.setdefault(k[, x]) | a[k] if k in a, else x (also setting it) 得到a[k],若不存在返回x,并设定为x |
a.pop(k[, x]) | a[k] if k in a, else x (and remove k) 弹出a[k],若不存在则返回x,同时将删除k键 |
a.popitem() | remove and return an arbitrary (key, value) pair 弹出a中对象的键和值,并删除弹出的键和值 |
a.iteritems() | return an iterator over (key, value) pairs 返回a中所有对象(键和值) |
a.iterkeys() | return an iterator over the mapping’s keys 返回a中所有键(索引) |
a.itervalues() | return an iterator over the mapping’s values 返回a中所有值 |
建议每天看一遍,一个星期之后就能牢记于心。也可以先记住本机课涉及的内容,碰到字典再来翻这一节课。