Day17
一、列表生成式
1. 是Python內置的非常簡單卻強大的可以用來創建list的生成式
2. 生成列表
list(range(1, 11))
list1 = [x for x in range(1,11)]
3. 生成表達式列表
[x * x for x in range(1, 11)]
寫列表生成式時,把要生成的元素x * x放到前面,後面跟for循環,就可以把list創建出來
4. if判斷生成式: [x * x for x in range(1, 11) if x % 2 == 0]
5. 兩層循環,可以生成全排列: [m + n for m in ABC for n in XYZ]
[{0}*{1}={2}.format(n,m,m*n) for m in range(1,10) for n in range(1,m+1)] # 乘法口訣
二、高階函數
1. 定義:又稱函數式編程或泛函編程,與Lamda表達式組合應用
優點: 比python的for和while的運行效率高
包括:map()、reduce()、filter()
2. map()
定義: 內置函數
格式: map(fn,datas)
參數: fn: 表示一個函數, 該函數需要一個參數並且有一個返回值;
datas: 表示的是數據(需要執行分布函數)的集合
返回值: 該函數返回的是datas依次執行函數後的結果集
作用: 將一個函數依次作用在序列中的每個元素上, 並把結果作為新的結果集list返回
a = list(range(1, 5))b = [i + 2 for i in a]print(b) #map()方式b = map(lambda x: x + 2, a)print(list(b))b = map(lambda x, y: x+y, a, range(10,15))print(list(b))
3. reduce()
定義: 使用時需要導入reduce函數: from functools import reduce
格式: reduce(fn,datas)
參數: fn: 表示功能函數; datas: 表示需要執行功能的序列參數
作用: 將函數依次作用在每個參數上, 該函數必須接收2個參數, reduce會把結果繼續與序列的下一個元素進行累計運算
#階乘計算from functools import reducen = 10result = reduce(lambda x, y: x * y, range(1, n + 1))print(result)#計算100以內的和n = 100result = reduce(lambda x, y: x + y, range(1, n + 1))print(result)
4. filter()
定義: filter是一種內置函數
格式: filter(fn, datas)
參數: fn: 表示函數;datas: 表示多個數據
作用: 把傳入的參數依次作用在函數上, 根據函數的返回值決定該參數是保留(True)還是剔除(False), 通常用於剔除臟數據
#查找50~100之間的偶數ns = range(50,101)result = filter(lambda x: x is not 0 and x % 2 == 0, ns)print(result)# <filter object at 0x0000022EC66BB128>
注意:關於filter()方法, python3和python2有一點不同,python2中返回的是過濾後的列表, 而python3中返回到是一個filter類。
filter類實現了__iter__和__next__方法, 可以看成是一個迭代器, 有惰性運算的特性, 相對python2提升了性能, 可以節約內存。列印出的是一個內存地址,可以通過遍歷獲得元素。
5. sorted
作用: 通常被用來排序
正序排序: sorted(data)
倒序排序: sorted(data, reverse=True)
絕對值正序排序: sorted(data, key=abs),key為排序因素,可以lambda配合使用
絕對值倒序排序: sorted(data, key=abs, reverse= True)
擴展-字典排序
# 按照key進行排序 print sorted(dict_1.items(), key=lambda d: d[0]) # 按照value進行排序 print sorted(dict_1.items(), key=lambda d: d[1])
三、代碼調試與日誌
1. 斷點調試:利用pycharm中的Debug模式調試
2. logging日誌模塊 import logging
# 日誌輸出logging.debug(s) #調試logging.info(s) # 普通信息logging.warning(s) # 警告logging.error(s) # 錯誤信息logging.critical(s) # 嚴重或緊急錯誤信息# 擴展欄位顯示,日誌格式中帶有%(port)slogging.warning(警告, extra={port:20})
3. 日誌處理器Handler
logging.StreamHandler() # 控制台logging.FileHandler("aa.log") # 文件 4. 設置日誌等級setLevel()按從高到低logging.FATAL=50logging.CRITICAL=FATALlogging.ERROR = 40logging.WARN = 30logging.WARNING = WARNlogging.info = 20logging.DEBUG = 10logging.NOTSET = 0# 注意:日誌顯示時,等級低的可以顯示等級高的
4. 設置日誌格式
setFormatter(fomatter) # 設置日誌格式Formater對象consoleHandler = logging.StreamHandler()fmter = logging.Formatter(%(asctime)s %(name)s -%(levelname)s-%(module)s:%(message)s)consoleHandler.setFormatter(fmter)# 日誌格式:fmt = %(asctime)s -%(name)s-%(levelname)s-%(module)s:%(message)slogging.basicConfig(format=fmt, datefmt=%H:%M:%S, filename=aa.log, filemode=a)
5. 格式說明
asctime # 表示當前日誌的時間name # 日誌對象的名字,默認為rootlevelname # 日誌等級名稱module # 日誌執行時所在的模塊名message # 日誌本次輸出的內容# 其它變數名意義filename # 文件名funcName # 函數名lineno # 行號process # 進程的idprocessName # 進程名thread # 線程idthreadName # 線程名# 獲取日誌對象logger = logging.getLogger("aa")logger.setLevel(logging.DEBUG)# 添加日誌處理器logger.addHandler(handler)
6. pdb調試
import pdb# 在某一代碼塊中加入:pdb.set_trace()# 當運行當set_trace()時,則進入(Pdb)環境中#---------------------------------help----------------------------------------#EOF c d h list q rv undisplaya cl debug help ll quit s unt alias clear disable ignore longlist r source until args commands display interact n restart step up b condition down j next return tbreak w break cont enable jump p retval u whatis bt continue exit l pp run unalias where a/args: 列印當前函數的參數alias: 給一段執行程序取別名(alias [name [command]])b/break: 設置斷點(b [([filename:]lineno | function) [, condition]])c/cont/continue: 繼續執行腳本cl/clear: 清除斷點(cl [filename:lineno | bpnumber [bpnumber ...]])disable: 禁用啟用的斷點(disable [bpnumber [bpnumber ...]])d/down: 移動到下一層堆棧(d [count])enable: 啟用禁用的斷點(enable [bpnumber [bpnumber ...]])j/jump: 跳轉到指定行,注意: 不會執行 跳過的語句l/list: 查看當前代碼塊ll: 查看完整源代碼n/next: 執行下一行代碼p/pp: 列印變數或表達式q/quit/exit: 終止執行並退出調試r/return: 執行腳本直到從當前函數返回run/restart: 重新開始調試rv/retval:s/step: 進入函數u/up: 移動到上一層堆棧(u [count])w/bt/where: 列印堆棧軌跡unalias: 刪除別名(unalias name)
四、單元測試
import unittest
聲明測試類
繼承unittest.TestCase
方法以test_開頭, 如test_xxx()
在方法中,使用斷言,如assertEqual()
快速進入單元測試方法:選中需要測試的類名或函數名,按快捷鍵Ctrl+Alt+t
五、文檔測試
針對注釋部分測試
import doctest doctest.testmod(verbose=True)
開始測試
verbose默認是False,意思是出錯才用提示;True,對錯都有執行結果
獨立文件測試
在 txt文本文件中,編寫 >>>測試用例行, 不帶>>>行用戶例結果
>>> 10+20
30
在命令行中
python -m doctest -v aa.txt
推薦閱讀:
※python中如何理解裝飾器代碼?
※Python訪問網頁報錯,ValueError: unknown url type,求問什麼原因?
※pycharm 如何程序運行後,仍可查看變數值?(非Debug mode, 因為debug運行太慢)
※Python中locale如何配置setlocale()的參數?
※新手遇到笨辦法學python第13題?