python字典
字典初始化的N种方法
直接赋值
1
a = {"one": 1, "two": 2, "three": 3}
先新建字典对象,再动态赋值
1
2
3
4b = dict()
b["one"] = 1
b["two"] = 2
b["three"] = 3新建字典对象时,通过参数赋值
1
c = dict(one=1, two=2, three=3)
新建字典对象时,通过嵌套的元组和列表来赋值
1
d = dict([("one", 1), ("two", 2), ("three", 3)])
通过zip函数
1
2
3
4
5e = dict(zip(["one", "two", "three"], [1, 2, 3]))
list(zip(["one", "two", "three"], [1, 2, 3]))
<<< [("one", 1), ("two", 2), ("three", 3)]
zip()函数:将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。
新建字典对象使,直接传入字典对象作为参数
1
f = dict({"one": 1, "two": 2, "three": 3})
利用fromkeys()为字典中所有的键赋相同的值
1
2
3
4
5
6g = dict.fromkeys(["height", "weight"], "normal")
or
g = dict.fromkeys(("height", "weight"), "normal")
print(g)
<<< {'height': 'normal', 'weight': 'normal'}若不指定第二个参数,所有的键对应的值为None
优雅的获取键值
1 | # 字典可以这样获取到键的值 |
字典的更新
1 | # update方法 |
删除字典键值
1 | # del内置关键字 |
获取全部的key和value
1 | dict_a = {'a': 1, 'b': 2, 'c': 3} |
注:以上方法返回不是真正的列表,无法直接进行索引取值,可以利用for循环进行取值,或者在外层加一个list()将其转换成真正的列表,也就是list(dict_a.keys())。
本来我以为以上方法返回的是迭代器,但是尝试过使用next()方法,证明了并不是迭代器,正好简单说下迭代器和生成器。
1 | next(dict_a.keys()) |
生成器【generator】(一边循环,一边计算,未知序列长度,惰性)
如果一个函数种包含yield关键字,那么它就是一个生成器。在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回yield的语句处继续执行。
可迭代对象【Iterable】
可以用for循环,但无法用next(),例如list,tuple,dict,set,str。
迭代器【Iterator】
可以用for和next(),例如生成器;使用iter(),可以将Iterable变为Iterator。
面向对象
__slots__
1 | # __slots__属性来限定对象的属性,不允许私自修改种类和个数 |
__init__()
1 | # 类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用 |
注:self代表类的实例,而非类
“_”和”__”的含义
以”_”开头的变量或者方法是protected的,只能允许其本身与子类进行访问;
以”__”开头的变量或方法是私有的,只能允许这个类本身进行访问;
注:__xx__是特殊变量或者特殊方法,非私有变量
hasattr()、getattr()、setattr()
hasattr(obj, target)
getattr(obj, target, default)
setattr(obj, target, default)
1 | class Test1(object): |
对象转换成字典
1 | class Test1(object): |
python中的三目运算
在C/C++/C#或者Java中,都有三目运算符,即条件表达式1?表达式1:表达式2;
意为如果条件表达式1值为真,则这个整个表达式的取值为表达式1的值,否则为表达式2的值。
python没有a?b:c的形式,但是有类似的表达式,a if b else c,意为若b为真,返回a,否则返回c。
1 | a = 10 |