Python 部分知識點總結(六)

此篇博客只是記錄第八周未掌握或不熟悉的知識點,用來加深印象。

一、argparse 模塊

  1. 參數種類:
    ?? ??? ?? ? 位置參數:參數放在那里,就要對應一個參數位置,例如:/etc?就是對應一個參數位置
    ?? ??? ?? ? 選項參數:必須通過前面是 –?的短選項,或者 —?的長選項,然后后面的才算它的參數,當然短選項后面也可以沒有參數
  2. 基本解析
    import argparse
    parser = argparse.ArgumentParser()? #?獲得一個參數解析器
    args = parser.parse_args() #?分析參數
    parser.print_help() # 打印幫助
    argparse?不僅僅做了參數的定義和解析,還自動幫助生成了幫助信息,尤其是?usage,可以看到現在定義的參數是否是自己想要的
  3. 解析器的參數
    ?? ??? ?? ? prog:程序的名字,缺省使用?sys.argv[0]
    ?? ??? ?? ? add_help:自動為解析器增加 -h?和 –help?選項,默認為?True
    ?? ??? ?? ? description:為程序功能添加描述
    parser = argparse.ArgumentParser(prog=’ls’,description=’list directory contents’,add_help=True)
  4. 位置參數解析
    ?? ??? ?? ? ls?基本功能應該解決目錄內容的打印
    ?? ??? ?? ? 打印的時候應該指定目錄路徑,需要位置參數
    parser = argparse.ArgumentParser(prog=’ls’,description=’list directory contents’,add_help=True)
    parser.add_argument(‘path’)
    args = parser.parse_args() #?分析參數
    parser.print_help() # 打印幫助
    運行結果:
    usage:ls [-h] path
    ls:error:the following arguments are required:path
    即 -h?為幫助,可有可無;path?為位置參數,必須提供
  5. 傳參
    parse_args(args=None,namespace=None):args?參數列表,一個可迭代對象,內部會把可迭代對象轉換成?list,如果為?None?則使用命令行傳入參數,非?None?則使用?args?參數的可迭代對象
    import?argparse
    parser = argparse.ArgumentParser(prog=’ls’,description=’list directory contents’,add_help=True)
    parser.add_argument(‘path’)? #?位置參數
    args = parser.parse_args((‘/etc’,))? #?分析參數,同時傳入可迭代的參數
    print(args)? #?打印名詞空間紅收集的參數
    parser.print_help() # 打印幫助
    運行結果:
    Namespace(path=’/etc’)
    usage:ls [-h] path
    list directory contents
    positional arguments:
    ? ? path
    optional arguments:
    ? ? -h,–help show this help message and exit
    Namespace(path=’/etc’)?里面的?path?參數存儲在了一個?Namespace?對象內的屬性上,可以通過?Namespace?對象屬性來訪問,例如:args.path
  6. 非必須位置參數
    有時候,ls?命令不輸入任何路徑的話就表示列出當前目錄的文件列表
    import?argparse
    parser = argparse.ArgumentParser(prog=’ls’,description=’list directory contents’,add_help=True)
    parser.add_argument(‘path’,nargs=’?’,default=’.’,help=”path help”)? #?位置參數
    ? ? help:表示幫助文檔中的這個參數的描述
    ? ? nargs:表示這個參數接收結果參數,?表示可有可無,+ 表示至少一個,*?可以任意個,數字表示必須是指定數目個
    ? ? default:表示如果不提供該參數,就使用這個值,一般和 ? *?配合,因為它們都可以不提供位置參數,不提供就是用缺省值

二、序列化和反序列化

  1. 序列化(serialization):將內存中對象存儲下來,把它變成一個個字節? –>?二進制
    反序列化(deserialization):將文件的一個個字節恢復成內存中的對象? < —?二進制
    持久化:序列化保存到文件就是持久化,可以將數據序列化后持久化,或者網絡傳輸;也可以將從文件中或者網絡接收到的字節序列反序列化
  2. pickle?庫:Python?中的序列化、反序列化模塊
    ?? ?? ? dumps? ?對象序列化為?bytes?對象
    ?? ?? ? dump? ? ?對象序列化到文件對象,就是存入文件
    ?? ?? ? loads? ? ? 從?bytes?對象反序列化
    ?? ?? ? load? ? ? ?對象反序列化,從文件讀取數據
  3. import pickle
    filename = ‘test.txt’
    d = {‘a’:1,’b’:’abc’,’c’:'[1,2,3]’}
    l = list(‘123’)
    i = 99
    with open(filename,’wb’) as f:
    ????pickle.dump(d,f)
    ????pickle.dump(l,f)
    ????pickle.dump(i,f)
    with open(filename,’rb’) as f:
    ????print(f.read(),f.seek(0))
    ????for _ in range(3):
    ????????x = pickle.load(f)
    ????????print(type(x),x)
    class AA:
    ????tttt = ‘ABC’
    ????def show(self):
    ????????print(‘abc’)
    a1 = AA()
    sr = pickle.dumps(a1)
    print(sr)
    a2 = pickle.loads(sr)
    print(a2.tttt)
    a2.show()

    b’\x80\x03}q\x00(X\x01\x00\x00\x00bq\x01X\x03\x00\x00\x00abcq\x02X\x01\x00\x00\x00cq\x03X\x07\x00\x00\x00[1,2,3]q\x04X\x01\x00\x00\x00aq\x05K\x01u.\x80\x03]q\x00(X\x01\x00\x00\x001q\x01X\x01\x00\x00\x002q\x02X\x01\x00\x00\x003q\x03e.\x80\x03Kc.’ 0
    <class ‘dict’> {‘b’: ‘abc’, ‘c’: ‘[1,2,3]’, ‘a’: 1}
    <class ‘list’> [‘1’, ‘2’, ‘3’]
    <class ‘int’> 99
    b’\x80\x03c__main__\nAA\nq\x00)\x81q\x01.’
    ABC
    abc
    上面的例子中,其實就保存了一個類名,因為所有的其他東西都是類定義的東西,是不變的,所以只序列化一個?AA?類名,反序列化的時候找到類就可以恢復一個對象
  4. import pickle
    class AAA:
    ????def __init__(self):
    ????????self.tttt = ‘abc’
    a1 = AAA()
    ser = pickle.dumps(a1)
    print(ser)
    a2 = pickle.loads(ser)
    print(a2,type(a2))
    print(a2.tttt)
    print(id(a1),id(a2))

    b’\x80\x03c__main__\nAAA\nq\x00)\x81q\x01}q\x02X\x04\x00\x00\x00ttttq\x03X\x03\x00\x00\x00abcq\x04sb.’
    <__main__.AAA object at 0x7f625c06a390> <class ‘__main__.AAA’>
    abc
    140060427461408 140060427461520
    可以看出這次除了必須保存的AAA,還序列化了?tttt?和?abc,因為這是每一個對象自己的屬性,每一個對象不一樣的,所以這些數據需要序列化
    序列化、反序列化必須保證使用同一套類的定義,否則會帶來不可預料的結果
  5. JSON(JavaScript?Object Notation,JS?對象標記)是一種輕量級的數據交換格式,它基于?ECMAScript(w3c?制定的?JS?規范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數據
  6. 值:雙引號?引起來的字符串、數值、true?和?false、null、對象、數組,這些都是值
    字符串:由雙引號包圍起來的任意字符的組合,可以有轉義字符
    數值:有正負、整數、浮點數
    對象:無序的鍵值對的集合
    ?? ??? ?? ?格式:{key1:value,….keyn:valuen}
    ?? ??? ?? ?key?必須是一個字符串,需要雙引號包圍這個字符串
    ?? ??? ?? ?value?可以是任意合法的值
    數組:有序的值得集合,格式:[val1,….valn]
  7. Python?支持少量內建數據類型到?Json?類型的轉換
    Python類型?? ??? ?Json類型
    True?? ??? ??? ??? ?? ? ?true
    False?? ??? ??? ??? ?? ? false
    None?? ??? ??? ??? ?? ? null
    str?? ??? ??? ??? ??? ?? ? string
    int?? ??? ??? ??? ??? ?? ? integer
    float?? ??? ??? ??? ??? ??float
    list?? ??? ??? ??? ??? ?? ? array
    dict?? ??? ??? ??? ??? ?? object
    dumps?? ??? ??? ?? ? json編碼
    dump?? ??? ??? ??? ??json編碼并存入文件
    loads?? ??? ??? ??? ?? ?json解碼
    load?? ??? ??? ??? ?? ? ?json解碼,從文件讀取數據

三、正則表達式

  1. 元字符
    .? ?? ?? ? ?匹配出換行符外任意一個字符
    [abc]? ? 字符集合,只能表示一個字符位置,匹配所包含的任意一個字符
    [^abc]? 字符集合,只能表示一個字符位置,匹配除去集合內字符的任意一個字符
    [a-z]??? ?字符范圍,是一個集合,表示一個字符位置,匹配所包含的任意一個字符
    \b??? ??? ?匹配單詞的邊界
    \B??? ??? ?不匹配單詞的邊界,如 t\B?包含?t?的單詞但是不以?t?結尾的字符,write
    \d??? ??? ??匹配 [0-9]?中任意一個數字
    \D??? ??? ?匹配 [0-9]?中任意一個數字
    \s??? ?? ? ?匹配1位空白字符,包括換行符、制表符、空格
    \S??? ??? ?匹配一位非空白字符
    \w??? ??? ?匹配[0-9a-zA-Z_],包括中文的字
    \W??? ??? ?匹配\w之外的字符
  2. 轉義:具有特殊意義的符號,如果想使用它的本意,用反斜杠 \?轉義,\r?回車,\n?換行
  3. 重復
    *? ? ? ? ?重復 0?次或多次
    +? ? ? ? 重復至少 1?次
    ?? ? ? ? ?重復 0?次或 1?次
    {n}? ? ? 重復固定的?n?次
    {n,}? ? ?重復至少?n?次
    {n,m}? 重復?n?到?m?次
    x|y? ? ? 匹配?x?或者?y
    (pattern)? ? ? ? ? ? ? ? ?使用小括號指定一個子表達式,也叫分組
    \數字?? ?? ? ?? ?? ? ? ? ? ?匹配對應的分組
    (?:pattern)? ? ?? ?? ? ??如果僅僅為了改變優先級,就不需要捕獲分組
    (?P<name>exp)? ???分組捕獲,但是可以通過?name?訪問分組
    (?=exp)? ?? ??? ??? ??? ?零寬度正預測先行斷言,斷言?exp?一定在匹配的右邊出現
    (?<=exp)? ?? ?? ? ? ? ??零寬度正回顧后發斷言,斷言?exp?一定出現在匹配的左邊出現
    (?!exp)??? ? ?? ??? ?? ? ??零寬度負預測先行斷言,斷言?exp?一定不會出現在右側
    (?<!exp)? ??? ??? ?? ? ??零寬度負回顧后發斷言,斷言?exp?一定不能出現在左側
    (?#comment)? ?? ???注釋,如:f(?=oo)(?#這個后斷言不捕獲)
  4. 貪婪與非貪婪:默認是貪婪模式,即盡量多匹配更長的字符串,在重復的符號后面加上一個 ?,就會盡量的少匹配
    *???? ?? ??? ? ?匹配任意次,但盡可能少重復
    +???? ?? ???? ?匹配至少 1?次,但盡可能少重復
    ????? ?? ??? ???匹配 0?次或 1?次,但盡可能少重復
    {n,}??? ??? ? ?匹配至少?n?次,但盡可能少重復
    {n,m}? ? ? ? ?匹配至少?n?次,至多?m?次,但盡可能少重復
  5. 引擎選項
    IgnoreCase?匹配時忽略大小寫,re.I
    Singleline?單行模式,可以匹配所有字符,包括 \n,re.S
    Multiline? 多行模式,^行首,$行尾,re.M
    ignorePatternWhitespace? 忽略表達式中的空白字符,如果要使用空白字符,用轉義,#可以做注釋,re.X
    單行模式就如同看穿了換行符,所有文本就是一個長長的只有一行的字符串,所有 ^?就是這一行字符串的行首,$?就是這一行的行尾
    多行模式,無法看穿換行符,^ 和 $?還是行首行尾的意思,只不過限于每一行
  6. 方法
    編譯:re.compile(pattern,flags=0)
    ?? ??? ?設定?flags,編譯模式,返回正則表達式對象?regex
    ?? ?? ? pattern?就是正則表達式字符串,flags?是選項,正則表達式需要被編譯,為了提高效率,這些編譯后的結果被保存,下次使用同樣的?pattern?的時候,就不需要再次編譯
    ?? ?? ? re?的其它方法為了提高效率都調用了編譯方法,就是為了提高提速
    單詞匹配:re.match(pattern,string,flag=0)
    ?? ??? ??? ?? ? ?regex.match(string[,pos[,endpos]])
    ?? ??? ??? ?? ? ?match?匹配從字符串的開頭匹配,regex?對象?match方法可以重設定開始位置和結束位置,返回?match?對象,必須從開頭開始,找到一個就不找了,找不到就返回?None
    ?? ??? ??? ?? ? ?re.search(pattern,string.flags=0)
    ?? ??? ??? ??? ??regex.search(string[,pos[,endpos]])
    ?? ??? ??? ?? ? ?match?匹配從字符串的開頭匹配,regex?對象?match?方法可以重設定開始位置和結束位置,返回?match?對象,找到第一個就不找了
    ?? ??? ??? ?? ? ?re.fullmatch(pattern,string.flags=0)
    ?? ??? ??? ?? ? ?regex.fullmatch(string[,pos[,endpos]])
    ?? ??? ??? ??? ??整個字符串和正則表達式匹配,必須是完全匹配,多了少了都不行
    全文搜索:re.findall(pattern,string,flags=0)
    ?? ??? ??? ??? ??re.findall(string[,pos[,endpos]])
    ?? ??? ??? ?? ? ?對整個字符串,從左至右匹配,返回所有匹配項的列表
    ?? ??? ??? ??? ??re.finditer(pattern,string,flags=0)
    ?? ??? ??? ??? ??regex.finditer(string[,pos[,endpos]])
    ?? ??? ??? ?? ? ?對整個字符串,從左至右匹配,返回所有匹配項,返回迭代器
    ?? ??? ??? ?? ? ?注意每次迭代返回的是?match?對象
    匹配替換:re.sub(pattern,replacement,string,count=0,flags=0)
    ?? ??? ??? ?? ? ?regex.sub(replacement,string,count=0)
    ?? ??? ??? ?? ? ?使用?pattern?對字符串?string?進行匹配,對匹配項使用?repl?替換
    ?? ??? ??? ?? ? ?replacement?可以是?string、bytes、function
    ?? ??? ??? ?? ? ?re.subn(pattern,replacement,string,count=0,flags=0)
    ?? ??? ??? ?? ? ?regex.subn(replacement,string,count=0)
    ?? ??? ??? ?? ? ?同?sub?返回一個元祖(new_string,number_of_subs_made)
    分割字符串:re.split(pattern,string,maxsplit=0,flags=0)
    ?? ??? ??? ??? ?? ? 字符串的分割函數太難用,不能指定多個字符進行分割
    分組:使用小括號的 pattern?捕獲的數據被放到了組?group?中
    ?? ??? ?? ?match、search?函數可以返回?match?對象,findall?返回字符串列表,finditer?返回一個個?match?對象
    ?? ??? ?? ?如果?pattern?中使用了分組,如果有匹配的結果,會在?match?對象中
    ?? ??? ??? ??? ?? ? 1、使用?group(N)?方式返回對應分組,1-N?是對應的分組,0?返回整個匹配的字符串
    ?? ??? ??? ??? ?? ? 2、如果使用了命名分組,可以使用?group(‘name’)?的方式取分組
    ?? ??? ??? ??? ?? ? 3、也可以使用?groups()?返回所有組
    ?? ??? ??? ??? ?? ? 4、使用?groupdict()?返回所有命名的分組

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/97337

(0)
龐豪龐豪
上一篇 2018-05-02 14:48
下一篇 2018-05-02

相關推薦

  • Python 部分知識點總結(七)

    此篇博客只是記錄第九周未掌握或不熟悉的知識點,用來加深印象。

    Python筆記 2018-05-06
  • ss

    sas

    Python筆記 2018-05-10
  • 文件IO常用操作

    io模塊 StringIO BytesIO 類
    pathlib模塊 路徑操作 3.4版本開始
    os模塊 更改權限、顯示信息 3.4版本之前路徑操作
    shuril 模塊(高級文件操作
    csv 文件
    configparser模塊 ini文件處理

    2018-05-02
  • 樹 非線性結構,每個元素都可以有多個前驅和后繼 樹是n(n>=0)個元素 n = 0時,稱為空樹 樹只有一個特殊的沒有前驅的元素,稱為樹的根root 樹中除了根結點,其余元素只能有一個前驅,可以有0個或者多個后繼 遞歸定義 樹T是n(n>=0)個元素的集合,n=0時,稱為空樹 有且只有一個特殊元素根,剩余元素都可以被劃分為m個互不相交的集合T1,…

    2018-04-16
  • 遞歸函數

    遞歸函數 def foo(b,b1=3):print(“foo1 called “,b,b1)def foo2(c):foo3(c)print(“foo2 called”,c)def foo3(d):print(“foo3 called”)def mian():print(“…

    2018-04-16
  • Python 部分知識點總結(一)

    此篇博客只是記錄第三周未掌握或不熟悉的知識點,用來加深印象。

    Python筆記 2018-03-26
欧美性久久久久