Python Learning Note Day 11

2018-03-31 0 条评论 217 次阅读 1 人点赞

今天是Python学习第十一天,今天主要对字典进行了补充,同时开始做《Python编程从入门到实践》中的第一个项目‘外星人入侵’(PS:灰机大战),pygame做2d游戏,有点意思。

项目的话可能就是一个利用pygame包来做2d游戏的过程。重点可能不在于做游戏本身,而是怎么样一步步把一个项目做出来,然后不断的去重构和优化代码,把一个看似很大的项目分解成不同的模块,各司其职,这点很重要。从做这行起,多数时候我都是独立开发,这种分模块(甚至说需要团队去配合)的机会很少,所以,这一块是我很欠缺的,这样走一圈,可能会更明白自己的代码要怎么写,才能让自己让他人修改和理解起来更简单容易。

接下就来总结下字典部分补充的知识。

补充知识

1. dict函数

函数dict可以从其他映射(如其他字典)或键-值对序列创建字典。

lst=[['ella',123],['timo',234]]
d=dict(lst)
print(d)

# 元组和列表都可以,但是一定是键值对的形式
lst=[('ella',123),['timo',234]]
d=dict(lst)
print(d)

也可以使用关键字实参的方式提供

# 也可以使用关键字实参的方式提供
d=dict(eimi=123,dona='123a')
print(d)

2. 键的类型

字典中的键可以是整数,但并非必须是整数。字典中的键可以是任何不可变的类型,如浮点数(实数)、字符串或元组。

3. 成员资格

表达式k in d(其中d是一个字典)查找的是键而不是值,而表达式v in l(其中l是一个列表)查找的是值而不是索引。这

dicts={'kiwi':123,345:'kiwi'}

print('kiwi' in dicts)# True
print(123 in dicts)# False
database={
    'Kiwi':{
        'addr':'sichuan',
        'age':25
    },
    'shine':{
        'addr':'nanchong',
        'age':24
    }
}
print(database['Kiwi']['age'])
for k,v in database.items():
    print(k+':')
    for key,val in v.items():
        print('-'+key+':'+str(val))

4.将字符串格式设置功能用于字典

像下面这样使用字典时,可指定任意数量的转换说明符,条件是所有的字段名都是包含在字典中的键。

string='Kiwi\'s phone is {Kiwi}'
phone={'Kiwi':'1387264','Shine':'887799'}

print(string.format_map(phone))
# Kiwi's phone is 1387264

5. clear
方法clear删除所有的字典项,这种操作是就地执行的(就像list.sort一样),因此什么都不返回(或者说返回None)。

6. copy
方法copy返回一个新字典,其包含的键值对与原来的字典相同(这个方法执行的是浅复制,因为值本身是原件,而非副本)。

from copy import deepcopy
# copy
dicts={'kiwi':123,'timo':234,'mimi':[12,'kiwi']}

dicts_copy=dicts.copy()
# {'kiwi': 123, 'timo': 234, 'mimi': [12, 'kiwi']}
dicts_deep=deepcopy(dicts)
# {'kiwi': 123, 'timo': 234, 'mimi': [12, 'kiwi']}

print(dicts_copy)
print(dicts_deep)

dicts_copy['timo']=876
dicts_copy['mimi'].remove(12)

print(dicts_copy)
# {'kiwi': 123, 'timo': 876, 'mimi': ['kiwi']}

print(dicts)
# {'kiwi': 123, 'timo': 876, 'mimi': ['kiwi']}

print(dicts_deep)
# {'kiwi': 123, 'timo': 234, 'mimi': [12, 'kiwi']}

当替换副本中的值(timo)时,原件不受影响。然而,如果修改副本中的值(就地修改而不是替换),原件也将发生变化,因为原件指向的也是被修改的值(如这个示例中的'mimi'列表所示)。
为避免这种问题,一种办法是执行深复制,即同时复制值及其包含的所有值,等等。为此,可使用模块copy中的函数deepcopy。

7. fromkeys
方法fromkeys创建一个新字典,其中包含指定的键,且每个键对应的值都是None。

dicts={}.fromkeys(['timor','auruff','ruiz'])
print(dicts)
# {'timor': None, 'auruff': None, 'ruiz': None}

也可以直接对dict函数使用fromekeys,如果你不想使用默认值None,可提供特定的值。

# 也可以直接对dict函数使用fromekeys
dicts_2=dict.fromkeys(['I','love','fyx'])
print(dicts_2)

# 指定key的值
dicts_3=dict.fromkeys(['I','love','keys'],'❤')
print(dicts_3)

8. get
方法get为访问字典项提供了宽松的环境。通常,如果你试图访问字典中没有的项,将引发错误。使用get来访问不存在的键时,没有引发异常,而是返回None。你可指定“默认” 值,这样将返回你指定的值而不是None。

d={'age':19,'addr':'chengdu'}
# print(d['name']) # 会引发错误

print(d.get('name'))# None
print(d.get('sex','N/A'))# N/A

9. pop
方法pop可用于获取与指定键相关联的值,并将该键-值对从字典中删除。

d={'x':2,'y':1}
print(d.pop('x'))
print(d)
#{'y':1}

10. popitem
方法popitem类似于list.pop,但list.pop弹出列表中的最后一个元素,而popitem随机地弹出一个字典项,因为字典项的顺序是不确定的,没有“最后一个元素”的概念。如果你要以高效地方式逐个删除并处理所有字典项,这可能很有用,因为这样无需先获取键列表。

c={'x':2,'y':1,'z':34,'f':2,'j':1,'a':34}
print(c.popitem())
print(c)

11. setdefault
方法setdefault有点像get,因为它也获取与指定键相关联的值,但除此之外,setdefault还在字典不包含指定的键时,在字典中添加指定的键-值对。

d = {}
v=d.setdefault('name', 'N/A')
print(v)
# N/A
print(d)
# {'name': 'N/A'}

d['name'] = 'Gumby' 

print(d.setdefault('name', 'N/A')) 
# 'Gumby' 

print(d) 
# {'name': 'Gumby'}

指定的键不存在时,setdefault返回指定的值并相应地更新字典。如果指定的键存在,就返回其值,并保持字典不变。与get一样,值是可选的;如果没有指定,默认为None。

12. update
方法update使用一个字典中的项来更新另一个字典。 对于通过参数提供的字典,将其项添加到当前字典中。如果当前字典包含键相同的项,就替换它。

d = {
    'title': 'Python Web Site',
    'url': 'http://www.python.org',
    'changed': 'Mar 14 22:09:15 MET 2016'
}
x = {'title': 'qingwei.tech'}
y = {'url': 'https://www.qingwei.tech'}

d.update(x)
d.update(y)
print(d)
# {'title': 'qingwei.tech', 'url': 'https://www.qingwei.tech',
# 'changed': 'Mar 14 22:09:15 MET 2016'}
z={'hehe':'eeee'}
d.update(z)
print(d)
# {'title': 'qingwei.tech', 'url': 'https://www.qingwei.tech',
# 'changed': 'Mar 14 22:09:15 MET 2016', 'hehe': 'eeee'}

13.本章介绍的新函数

dict(seq)         从键-值对、映射或关键字参数创建字典。

 

时间不够用啊!

Kiwi

Valar Morghulis

文章评论(0)