---------------我的學習筆記---------------html
----------------本文做者吳疆--------------算法
------點擊此處連接至博客園原文------json
1.匿名函數app
沒有函數名異步
# -*- coding:utf-8 -*- # Author: WUJiang # 匿名函數 calc = lambda x: x*3 print(calc(3))
2.裝飾器函數
裝飾器,本質是函數,裝飾其餘函數,即爲其餘函數添加附加功能學習
原則:不能修改被裝飾函數的源代碼、不能修改被裝飾函數的調用方式測試
須要瞭解:函數即「」變量「」、高階函數、嵌套函數(函數內部還存在用def定義其餘的函數)ui
須要注意@裝飾器的實際做用spa
# -*- coding:utf-8 -*- # Author: WUJiang # 裝飾器示例 = 嵌套函數+高階函數 # 建議每行打斷點看運行過程,函數只定義未調用時是不運行的 import time def timer(func): def wrapper(*args, **kwargs): start_time = time.time() func(*args, **kwargs) stop_time = time.time() print("the fuc running time is %s" % (stop_time - start_time)) return wrapper # 返回wrapper的內存地址,加()表明執行wrapper函數 @timer # 等同於test1=timer(test1) def test1(*args, **kwargs): time.sleep(3) print("in the test1") print(args, kwargs) test1()
之因此test1()、wrapper()和func()中添加形參*args、**kwargs是由於裝飾器只有一個,這樣就能夠用來裝飾多個有非固定參數的函數
# -*- coding:utf-8 -*- # Author: WUJiang # 用裝飾器給頁面增長登陸認證功能 user, pw = "wujiang", "abc123" def auth(func): def wrapper(*args, **kwargs): input_user = input("輸入用戶名:") input_pw = input("輸入密碼:") if input_user == user and input_pw == pw: ret = func(*args, **kwargs) return ret else: print("用戶名密碼錯誤,請重試") return wrapper @auth def index(): print("歡迎進入首頁") return "from index" # 竟然返回None,是由於wrapper()無返回值,若要返回index()的結果,能夠保存在變量中返回(見上) @auth def home(): print("歡迎登陸我的主頁") @auth def bbs(): print("歡迎登陸bbs論壇") print(index()) home() bbs()
上述增長代碼段能夠返回被裝飾函數的結果(以上代碼較實用)
3.裝飾器-進階學習
# -*- coding:utf-8 -*- # Author: WUJiang # 用裝飾器給不一樣頁面增長不一樣的登陸(本地/遠程)認證功能 def auth(auth_type): # print("auth_type:", auth_type) def out_wrapper(func): # print("func:", func) def wrapper(*args, **kwargs): if auth_type == "local": print("本地模擬登陸") elif auth_type == "ldap": print("ldap模擬登陸") return wrapper return out_wrapper # 這裏的auth與以前的區別是加了()並傳入參數 # 與以前不加()和傳參數有區別,具體須要看實際debug # 我的至關於home = auth(auth_type="local")() # 即home = wrapper @auth(auth_type="local") def home(): print("歡迎登陸我的主頁") @auth(auth_type="ldap") def bbs(): print("歡迎登陸bbs論壇") home() bbs()
與上面的區別是裝飾器傳入了參數,所以裝飾器內部須要多嵌套一層函數,具體看#註釋。
4.生成器
列表生成式[] 如[func(i) for i in range(10)]使代碼更簡潔,其中func()爲某函數,如i+1
經過列表生成式,能夠直接建立列表,但因爲受到內存限制,列表容量將有限。若是建立一個包含100萬個元素的列表,而僅僅須要訪問前面幾個元素,就有點得不償失,所以,若是列表元素能夠按照某種算法推算出來,就能夠在循環過程當中不斷推算後續元素,就不用建立完整的列表,從而節省大量空間。在Python中,一邊循環一邊計算的機制,稱爲生成器。
生成器() 如(func(i) for i in range(10)) ,區別是[]和()
注意:[2*i for i in range(10000000000)]列表生成式會一次性準備好數據,好比準備好[0,1,2,3,4...9999999999]再乘2,而(2*i for i in range(10000000000))生成器只是準備了一個算法,訪問到哪才生成相應數據,可是訪問第n個數據,必須依此訪問過以前n-1個數據,所以不能用切片方式訪問。
生成器只有__next__()方法(_2個Python3中,Python2中爲next()),讀取下一個數據,只依次保留當前位置的惟一數據。
-----------------------------------------------------------另外一種實現生成器的方式---------------------------------------------------------------------
# -*- coding:utf-8 -*- # Author: WUJiang # 另外一種實現生成器的方式 # 斐波那契數列 def fib(max): n, a, b = 0, 0, 1 while n < max: # print(b) yield b a, b = b, a+b n += 1 # <generator object fib at 0x0000000002340750> print(fib(10)) fib_gen = fib(10) print(fib_gen.__next__()) # 1 print(fib_gen.__next__()) # 1 print(fib_gen.__next__()) # 2 print(fib_gen.__next__()) # 3
-------------------------------------------------------經過生成器能夠實現並行操做---------------------------------------------------------------
# -*- coding:utf-8 -*- # Author: WUJiang # 生成器實現單線程下的並行效果(其實是串行,但感受上是並行),異步IO的雛形 import time def consumer(name): print("%s 準備吃包子了!" % name) while True: baozi = yield print("包子[%s]來了,被[%s]吃了" % (baozi, name)) def producer(name): c = consumer("A") # 至關於將函數變爲生成器 c2 = consumer("B") c.__next__() # 調用第一個yield中斷返回,所以纔會打印"準備吃包子了" c2.__next__() print("我開始作包子了!") for i in range(10): time.sleep(1) print("作了2個包子!") c.send(i) c2.send(i) producer("wujaing")
5.迭代器
能夠直接for循環的對象統稱爲可迭代對象,如list、tuple、dict、set、str、生成器、帶yield的generator function,可以使用isinstance()判斷一個對象是不是Iterable對象
# -*- coding:utf-8 -*- # Author: WUJiang # 判斷是否爲可迭代對象 from collections import Iterable print(isinstance([], Iterable)) # True print(isinstance({}, Iterable)) # True print(isinstance((), Iterable)) # True
能夠被next()函數調用並不斷返回下一個值的對象稱爲迭代器,可使用isinstance()判斷一個對象是否爲Iterator對象,dir(變量)可查看變量的全部方法,經過iter()函數可將list、dict、str等可迭代對象變成迭代器
# -*- coding:utf-8 -*- # Author: WUJiang # 判斷是否爲迭代器 from collections import Iterator print(isinstance([i+1 for i in range(10)], Iterator)) # False print(isinstance((i+1 for i in range(10)), Iterator)) # True print(isinstance(iter([]), Iterator)) # True
Python中Iterator對象表示一個數據流,能夠被next()函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration錯誤。能夠把這個數據流看作是一個有序序列,但卻不能提早知道序列長度,只有不斷經過next()函數實現按需計算下一個數據,因此Iterator的計算是惰性的,只有在須要返回下一個數據時纔會計算,Iterator甚至能夠表示一個無限大的數據流,例如全體天然數,而使用list是永遠不可能存儲全體天然數。
Python3中range(10)返回range(0,10)迭代器,Python2中range(10)返回[0,1,2,3,4,5,6,7,8,9],xrange(10)才返回迭代器
6.內置函數
abs() 絕對值
all() 可迭代對象中全部元素爲真返回True
any() 可迭代對象中任意元素爲真返回True
bin() 數字10進制轉2進制
bytearray() 將bytes類型數據變成可修改的列表
callable() 判斷是否可被調用
chr() 返回數字對應的ASCII碼
compile() 底層編譯代碼使用
dir() 查看變量的全部方法
divmod(a,b) 返回a除以b的商和餘數
eval() 用來執行一個字符串表達式,並返回表達式的值(轉字符串爲字典!)
exec() 動態執行Python代碼,能夠執行復雜的Python代碼,而不像eval函數那樣只能計算一個表達式的值
filter() 按定義的規則過濾,可與lambda搭配用
map() 按定義的函數處理,可與lambda搭配用
frozenset() 返回不可變對象
globals() 返回當前程序全部變量名和變量值
hash() 返回哈希值
help() 查看幫助
hex() 轉16進制
id() 返回內存地址
locals() 用於定義的函數內部返回局部變量
oct() 轉8進制
round() 四捨五入,可定義保留位數
sorted() 排序
zip() 一一對應組合
......
7.json&pickle序列化
json只能處理簡單數據類型,可用於不一樣語言間的交互,xml被json逐漸取代
# -*- coding:utf-8 -*- # Author: WUJiang # json序列化與反序列化 import json info = { "name": "wujiang", "age": 22 } # 序列化 with open("info.txt", "w") as f: f.write(json.dumps(info)) # 反序列化 with open("info.txt", "r") as f: data = json.loads(f.read()) print(data["name"])
pickle能處理全部數據類型(函數也能夠),用於Python特有的數據類型和Python的數據類型間進行轉換,用法與上面json相似,此外還均有dump()和load()方法,如pickle.dump(info,f) 和pickle.load(f),與上述等價
儘可能只dump和load一次,易出錯,Python2容許屢次dump和load,Python3只容許一次dump和load
8.軟件目錄開發規範
Foo項目名,bin可執行文件目錄,foo主要程序(邏輯)目錄(其中main.py爲程序主入口,啓動bin中foo調用main、test測試主要程序邏輯),docs文檔,setup.py安裝、部署、打包腳本,requirements.txt軟件依賴的外部Python包列表,README項目說明文件,還有conf配置文件目錄、logs日誌文件目錄
9.不一樣目錄間模塊調用
經過os.path.dirname獲取同級目錄添加至環境變量便可import,Pycharm中會標紅但不影響import
# -*- coding:utf-8 -*- # Author: WUJiang # 不一樣目錄間的模塊調用 import os import sys print(__file__) # 獲取當前文件相對路徑 print(os.path.abspath(__file__)) # 獲取當前文件絕對路徑 print(os.path.dirname(os.path.abspath(__file__))) # 獲取當前文件絕對路徑的上一級目錄 dir = os.path.dirname(os.path.abspath(__file__)) sys.path.append(dir) # 添加環境變量
原文出處:https://www.cnblogs.com/deeplearning1314/p/10892497.html