字典
字典 dict 是一種映射表, 其他語言里一般叫 map,字典里的每一個記錄保存的是鍵值對 key-value,字典以 key 為索引,key 可以不只是數(shù)字混聊,還可以是字符串、字節(jié)串乾巧、元組等類型句喜,value 是 key 位置保存的值,字典最大的特點就是查找速度快沟于,通過 key 可以快速找到對應(yīng) value咳胃,就像查字典一樣。
-
字典的創(chuàng)建
字典用大括號或內(nèi)置函數(shù)dict創(chuàng)建>>> a = {} # 空字典 >>> a {} >>> a = dict() # 空字典 >>> a {} >>> type(a) <class 'dict'> >>> >>> a = {'name':'tom', 'age':18} # 初始化值 >>> a {'name': 'tom', 'age': 18} >>>
-
dictview
字典的元素存放和前面的序列有很大的不同旷太, 字典里的元素是無序的展懈,因此不能直接遍歷字典销睁。python提供dictview來實現(xiàn)字典的遍歷功能。
dictview是用來遍歷字典元素的一種特殊的輔助對象存崖,字典改變冻记,dictview會跟著改變,dictview通過dict.keys(), dict.values() 和 dict.items() 創(chuàng)建来惧,有以下方法:操作 說明 dict.keys() 返回字典 keys 迭代器 dict.values() 返回字典 values 迭代器 dict.items() 返回字典 key-values 迭代器 dictview 有以下方法:
操作 說明 len(dictview) 字典元素個數(shù) iter(dictview) 返回字典 keys冗栗、values 或 key-values 迭代器 x in dictview 判斷 x 是否在字典中,x 可以是 key供搀、values 或 key-values -
字典的操作方法
操作 說明 len(d) 字典元素個數(shù) d[key] key 位置的值隅居,如果 key 不存在,拋 KeyError 異常 d[key] = value 設(shè)置 key 位置的值為 value del d[key] 刪除 key 元素葛虐,如果 key 不存在胎源,拋KeyError 異常 key in d 判斷字典 d 是否有元素 key,有返回 True key not in d 判斷字典 d 是否有元素 key挡闰,沒有返回 True iter(d) 返回字典所有 key 值的迭代器,相當(dāng)于 iter(d.keys()) clear() 清空字典 copy() 淺拷貝 classmethod fromkeys(seq[, value]) 創(chuàng)建序列掰盘,以序列 seq 中元素做字典的 key摄悯,value 為字典所有key對應(yīng)的初始值 get(key[, default]) 返回 key 對應(yīng)的 value,如果 key 不存在愧捕,則返回 None奢驯,不會拋異常 items() 返回所有 key-value 的 dictview keys() 返回所有 key 的 dictview values() 返回所有 value 的 dictview pop(key[, default]) 從字典中刪除并返回 key 元素的 value,如果 key 不存在次绘,則返回默認(rèn)值 default瘪阁,如果 default不存在,則拋異常 KeyError popitem() 從字典中刪除并返回一個 key-value 對邮偎,如果字典為空管跺,拋異常 KeyError setdefault(key[, default]) 嘗試設(shè)置元素 key,如果 key 已經(jīng)存在禾进,則返回 value豁跑,如果 key 不存在,則插入 key泻云,并返回 default update([other]) 更新字典艇拍,比如 d.update(key1=value1, key2=value2), other 也可以是一個字典
集合
pass
一切皆對象
python中,一切皆對象宠纯。所有數(shù)據(jù)類型包括數(shù)字卸夕、字符串、元組婆瓜、列表快集、字典等和函數(shù)、方法、類碍讨、模塊等等都是對象治力。換句話說,就是所有這些東西在底層都被實現(xiàn)為一個類勃黍,因此可以有屬性和方法宵统。
一切皆對象還有一層意思就是,這些東西即對象都可以賦值給變量覆获,并被傳遞马澈。
每個對象都有標(biāo)識(id)、類型(type)和值(value)弄息。
內(nèi)置函數(shù) id() 用來獲取id值痊班,一般就是對象的內(nèi)存地址,對象創(chuàng)建后就不會再改變摹量。
內(nèi)置函數(shù) type() 函數(shù)用來獲取類型涤伐。
內(nèi)置函數(shù) dir() 可以用來獲取對象的內(nèi)部信息,包括屬性和方法缨称。
>>> dir(1) # 常量1是整數(shù)類型對象凝果,支持很多方法
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>>
>>> id(1) # 1對象的id
10923136
>>>
>>> type(1) # 1對象的type
<class 'int'>
>>>
>>> a = 10
>>> dir(a) # 變量a也是整數(shù)類型對象,支持很多方法
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>>
>>> dir([1,2]) # 列表也是對象睦尽,支持很多方法
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>>
>>> dir(None) # None也是對象
['__bool__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>>
>>> dir(dir) #內(nèi)置函數(shù)dir自己也是對象
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__text_signature__']
>>>
變量引用
python中所有變量都只是個引用(reference器净,可以簡單理解為id和類型),類似c語言里的指針当凡。創(chuàng)建一個變量山害,相當(dāng)于在內(nèi)存中創(chuàng)建一個對象,然后變量再保存對象的引用沿量。關(guān)鍵字 del 可以用于刪除變量浪慌,但并不會刪除變量所引用的對象。
變量的類型指的是變量所引用對象的類型朴则,其實變量自身是沒有類型的眷射,其可以引用任何類型的對象。
(更底層一點分析:對象存在堆上佛掖,內(nèi)存可大可小妖碉,視具體對象類型和值而定,變量存在棧上芥被,因為只是個引用欧宜,沒有類型,固定大小拴魄,一般就幾個字節(jié))冗茸。
>>> a = 1 # 變量a引用了整數(shù)1對象席镀,即指向整數(shù)1對象
>>> id(a) # 整數(shù)1對象的id為10923136
10923136
>>> type(a)
<class 'int'>
>>>
>>> a = 'who am i' # 變量a重新引用了字符串'who am i'對象,即指向字符串'who am i'對象
>>> id(a) # 字符串'who am i'對象的id值為139972913664432
139972913664432
>>> type(a)
<class 'str'>
>>>
>>> del a # 此處只是刪除變量a夏漱, 并不會刪除字符串'who am i'對象豪诲,對象的刪除見后面章節(jié)'內(nèi)存的釋放'
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
變量的可變和不可變
python對象可以分為可變(mutable)和不可變(immutable)兩種類型,不可變是指對象的value值一旦初始化就不可改變挂绰,可變剛好相反屎篱。對引用了不可變對象的變量進(jìn)行修改,并不會改變變量所引用對象的值葵蒂,而是重新創(chuàng)建一個對象交播,然后再把變量指向新對象(因此對不可變類型變量進(jìn)行頻繁修改可能會很影響性能)。
整數(shù)践付、None秦士、字符串、bytes永高、元組隧土、range 是不可變類型。
bytearray命爬、列表曹傀、字典、set 是可變類型遇骑。
注意:元組的元素可以是一個可變類型卖毁,比如是一個列表揖曾,列表的值可以被改變落萎,但并不影響元組的不可變性。因為元組的元素實際保存的只是列表的引用炭剪,列表值改變了练链,但列表的引用并沒有變。
>>> a = 10
>>> id(a)
10923424
>>>
>>> a = 20
>>> id(a)
10923744
>>>
>>> a = 'qwert'
>>> id(a)
139972913631104
>>>
>>> a = 'asdfg'
>>> id(a)
139972913643568
>>>
>>> b = [5, 6]
>>> id(b)
139972913664328
>>> a = (1, 2, b) # 元組包含列表
>>> a
(1, 2, [5, 6])
>>> id(a)
139972913639216
>>>
>>> b[0] = 9 # 列表b改變了奴拦,但列表是可變對象媒鼓,因此id沒有改變
>>> b
[9, 6]
>>> id(b)
139972913664328
>>>
>>> a
(1, 2, [9, 6]) # 元組a看起來好像被改變了
>>> id(a)
139972913639216 # 但實際上并沒有重新創(chuàng)建元組,因為a[2]只是列表b的引用错妖,并沒有改變
>>>
內(nèi)存的釋放
python里的變量和其引用的對象的內(nèi)存釋放是自動進(jìn)行的绿鸣,不需要顯式的調(diào)用操作,因為python內(nèi)置有垃圾回收機(jī)制(Garbage collection)暂氯,不再使用的變量和對象會被認(rèn)為是垃圾潮模,其占用的內(nèi)存會被回收(但并不一定是立即執(zhí)行,可能延后)痴施,后續(xù)進(jìn)行重用或釋放擎厢。判斷變量和對象是否不再使用也是自動進(jìn)行的究流。
變量作用域
等講函數(shù)和類時再深入講。
python能夠改變變量作用域的代碼段是def动遭、class芬探、lamda
if/elif/else、try/except/finally厘惦、for/while
代碼塊中的變量偷仿,在外部也是可以訪問的。