1. 程式人生 > >Python第三周 學習筆記(1)

Python第三周 學習筆記(1)

學習筆記;內建函數;字典;列表解析式

字典
  • key-value鍵值對的數據的集合
  • 可變的、無序的、key不重復

初始化:

d = dict()
d = {}
d = dict(**kwargs)  如:d = dict(a=1,b=2)
dict(iterable, **kwarg)

使用可叠代對象和name=value對構造字典,不過可叠代對象的元素必須是一個二元結構

dict(mapping, **kwarg)
dict.fromkeys(iterable, value)

字典元素的訪問

  • d[key]
    • 返回key對應的值value
    • key不存在拋出KeyError異常
  • get(key[, default])
    • 返回key對應的值value
    • key不存在返回缺省值,如果沒有設置缺省值就返回None
  • setdefault(key[, default])
    • 返回key對應的值value
    • key不存在,添加kv對,value為default,並返回default,如果default沒有設置,缺省為None

字典增加和修改

  • d[key] = value
    • 將key對應的值修改為value
    • key不存在添加新的kv對
  • update([other]) -> None
    • 使用另一個字典的kv對更新本字典
    • key不存在,就添加
    • key存在,覆蓋已經存在的key對應的值
    • 就地修改
d.update(red=1)
d.update(((‘red‘,2),))
d.update({‘red‘:3})

字典刪除

  • pop(key[, default])
    • key存在,移除它,並返回它的value
    • key不存在,返回給定的default
    • default未設置,key不存在則拋出KeyError異常
  • popitem()

    • 移除並返回一個任意的鍵值對
    • 字典為empty,拋出KeyError異常
    • clear()
    • 清空字典
  • del語句
    • 本質上減少了一個對象的引用,del 實際上刪除的是名稱,而不是對象

字典遍歷:

  • 遍歷key:
for k in d:
print(k)

for k in d.keys():
print(k)
  • 遍歷values:
for k in d:
print(d[k])

for k in d:
print(d.get(k))

for v in d.values():
print(v)

* 遍歷item,即kv對:

for item in d.items():
print(item)

for item in d.items():
print(item[0], item[1])

for k,v in d.items():
print(k, v)

for k, _ in d.items():
print(k)

for _ ,v in d.items():
print(v)

總結

  • Python3中,keys、values、items方法返回一個類似一個生成器的可叠代對象,不會把函數的返回結果復制到內存中
    • Dictionary view對象
    • 字典的entry的動態的視圖,字典變化,視圖將反映出這些變化

字典遍歷和移除

  • 遍歷字典時,不允許增刪元素
  • 可先記錄key值再遍歷刪除
d = dict(a=1, b=2, c=‘abc‘)
keys = []
for k,v in d.items():
if isinstance(v, str):
keys.append(k)
for k in keys:
d.pop(k)
print(d)

defaultdict

  • collections.defaultdict([default_factory[, ...]])
  • 第一個參數是default_factory,缺省是None,它提供一個初始化函數。當key不存在的時候,會調用這個工廠函數來生成key對應的value

ordereddict

  • collections.OrderedDict([items])
  • key並不是按照加入的順序排列,可以使用OrderedDict記錄順序

標準庫datetime


datetime模塊

  • datetime類
  • today()
    • 返回本地時區當前時間的datetime對象
  • now(tz=None)
    • 返回當前時間的datetime對象,時間到微秒,如果tz為None,返回和today()一樣
    • fromtimestamp(timestamp, tz=None) 從一個時間戳返回一個datetime對象
  • 日期格式化
    • 類方法 strptime(date_string, format) ,返回datetime對象
    • 對象方法 strftime(format) ,返回字符串
    • 字符串format函數格式化
import datetime
dt = datetime.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
print(dt.strftime("%Y-%m-%d %H:%M:%S"))
print("{0:%Y}/{0:%m}/{0:%d} {0:%H}::{0:%M}::{0:%S}".format(dt))
  • timedelta對象

    • 與datetime對象做加減運算
    • datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0,minutes=0, hours=0, weeks=0)
    • total_seconds() 返回時間差的總秒數
  • 標準庫time
    • time.sleep(secs) 將調用線程掛起指定的秒數

列表解析式


  • 語法

    • [返回值 for 元素 in 可叠代對象 if 條件]
    • 使用中括號[],內部是for循環,if條件語句可選
    • 返回一個新的列表
  • 列表解析式是一種語法糖
    • 編譯器會優化,不會因為簡寫而影響效率,反而因優化提高了效率
    • 減少程序員工作量,減少出錯
    • 簡化了代碼,但可讀性增強

列表解析進階

  • [expr for item in iterable if cond1 if cond2]
  • 等價於

    ret = []
    for item in iterable:
    if cond1:
    if cond2:
    ret.append(expr)
  • [expr for i in iterable1 for j in iterable2 ]
    等價於
    ret = []
    for i in iterable1:
    for j in iterable2:
    ret.append(expr)

生成器表達式

  • (返回值 for 元素 in 可叠代對象 if 條件)

    • 生成器表達式是按需計算(或稱惰性求值、延遲計算),需要的時候才計算值
    • 列表解析式是立即返回值
  • 生成器是可叠代對象、叠代器

  • 使用next(itetator)叠代

生成器叠代與列表叠代對比

  • 生成器

    • 延遲計算
    • 返回叠代器,可以叠代
    • 從前到後走完一遍後,不能回頭
  • 列表

    • 立即計算
    • 返回的不是叠代器,返回可叠代對象列表
    • 從前到後走完一遍後,可以重新回頭叠代
  • 計算方式
    • 生成器表達式延遲計算,列表解析式立即計算
  • 內存占用
    • 單從返回值本身來說,生成器表達式省內存,列表解析式返回新的列表
    • 生成器沒有數據,內存占用極少,但是使用的時候,雖然一個個返回數據,但是合起來占用的內存也差不多
    • 列表解析式構造新的列表需要占用內存
  • 計算速度
    • 單看計算時間看,生成器表達式耗時非常短,列表解析式耗時長
    • 但是生成器本身並沒有返回任何值,只返回了一個生成器對象
    • 列表解析式構造並返回了一個新的列表

集合解析式

  • {返回值 for 元素 in 可叠代對象 if 條件}
    • 立即返回一個集合

字典解析式

  • {返回值 for 元素 in 可叠代對象 if 條件}
    • 使用key:value形式
    • 立即返回一個字典

內建函數


  • 標識 id
    • 返回對象的唯一標識,CPython返回內存地址
  • 哈希 hash()
    • 返回一個對象的哈希值
  • 類型 type()
    • 返回對象的類型
  • 類型轉換
    float() int() bin() hex() oct() bool() list() tuple() dict() set() complex() bytes() bytearray()
  • 輸入 input([prompt])

    • 接收用戶輸入,返回一個字符串
    • 打印 print(*objects, sep=‘ ‘, end=‘\n‘, file=sys.stdout, flush=False)
    • 打印輸出,默認使用空格分割、換行結尾,輸出到控制臺
  • 對象長度 len(s)
    • 返回一個集合類型的元素個數
  • isinstance(obj, class_or_tuple)

    • 判斷對象obj是否屬於某種類型或者元組中列出的某個類型
    • isinstance(True, int)
  • issubclass(cls, class_or_tuple)

    • 判斷類型cls是否是某種類型的子類或元組中列出的某個類型的子類
    • issubclass(bool, int)
  • 絕對值abs(x)
    • x為數值
  • 最大值max() 最小值min()
    • 返回可叠代對象中最大或最小值
    • 返回多個參數中最大或最小值
  • round(x)
    • 四舍六入五取偶,round(-0.5)
  • pow(x , y)
    • 等價於 x**y
  • range(stop)
    • 從0開始到stop-1的可叠代對象;range(start, stop[, step])從start開始到stop-1結束步長為step的可叠代對象
  • divmod(x, y)
    • 等價於 tuple (x//y, x%y)
  • sum(iterable[, start])

    • 對可叠代對象的所有數值元素求和
    • sum(range(1,100,2))
  • chr(i)
    • 給一個一定範圍的整數返回對應的字符
  • ord(c)

    • 返回字符對應的整數
  • sorted(iterable[, key][, reverse]) 排序
    • 返回一個新的列表,默認升序
  • reversed()

    • 反轉
  • 枚舉 enumerate(seq, start=0)

    • 叠代一個序列,返回索引數字和元素構成的二元組
      *start表示索引開始的數字,默認是0
  • 叠代器和取元素 iter(iterable)、next(iterator[, default])

    • iter將一個可叠代對象封裝成一個叠代器
    • next對一個叠代器取下一個元素。如果全部元素都取過了,再次next會拋StopIteration異常
  • 拉鏈函數zip(*iterables)
    • 像拉鏈一樣,把多個可叠代對象合並在一起,返回一個叠代器
    • 將每次從不同對象中取到的元素合並成一個元組
    • 木桶原理,取最小叠代次數叠代

可叠代對象

  • 能夠通過叠代一次次返回不同的元素的對象。
  • 所謂相同,不是指值是否相同,而是元素在容器中是否是同一個,例如列表中值可以重復的,[‘a‘,‘a‘],雖然這個列表有2個元素,值一樣,但是兩個‘a‘是不同的元素
  • 可以叠代,但是未必有序,未必可索引
  • 可叠代對象有:list、tuple、string、bytes、bytearray、range、set、dict、生成器等
  • 可以使用成員操作符in、not in,in本質上就是在遍歷對象

叠代器

  • 特殊的對象,一定是可叠代對象,具備可叠代對象的特征
  • 通過iter方法把一個可叠代對象封裝成叠代器
  • 通過next方法,叠代 叠代器對象
  • 生成器對象,就是叠代器對象

Python第三周 學習筆記(1)