輕輕松松搞定python--3

字典

字典 dict 是一種映射表, 其他語言里一般叫 map,字典里的每一個記錄保存的是鍵值對 key-value,字典以 key 為索引,key 可以不只是數(shù)字,還可以是字符串、字節(jié)串、元組等類型,value 是 key 位置保存的值,字典最大的特點(diǎn)就是查找速度快,通過 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來實(shí)現(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ù)、方法、類、模塊等等都是對象。換句話說,就是所有這些東西在底層都被實(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 可以用于刪除變量,但并不會刪除變量所引用的對象。
變量的類型指的是變量所引用對象的類型,其實(shí)變量自身是沒有類型的,其可以引用任何類型的對象。
(更底層一點(diǎn)分析:對象存在堆上,內(nèi)存可大可小,視具體對象類型和值而定,變量存在棧上,因?yàn)橹皇莻€引用,沒有類型,固定大小,一般就幾個字節(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 是可變類型。

注意:元組的元素可以是一個可變類型,比如是一個列表,列表的值可以被改變,但并不影響元組的不可變性。因?yàn)樵M的元素實(shí)際保存的只是列表的引用,列表值改變了,但列表的引用并沒有變。

>>> 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  # 但實(shí)際上并沒有重新創(chuàng)建元組,因?yàn)閍[2]只是列表b的引用,并沒有改變
>>> 

內(nèi)存的釋放

python里的變量和其引用的對象的內(nèi)存釋放是自動進(jìn)行的,不需要顯式的調(diào)用操作,因?yàn)閜ython內(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代碼塊中的變量,在外部也是可以訪問的。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,136評論 1 32
  • 一、python 變量和數(shù)據(jù)類型 1.整數(shù) Python可以處理任意大小的整數(shù),當(dāng)然包括負(fù)整數(shù),在Python程序...
    績重KF閱讀 1,774評論 0 1
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實(shí)驗(yàn)課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,804評論 0 10
  • 我的骨子里,只有中國傳統(tǒng)的節(jié)日,那些淺生生新節(jié)日,我常常漠視,那些硬生生的洋節(jié)日,我一向不屑。可是,今年的平安夜,...
    可比克克閱讀 543評論 2 4