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題?

TAG:Python | Python3x | 人工智慧 |