Python3基礎(4)匿名函數、裝飾器、生成器、迭代器、內置函數、json&pickle序列化、軟件目錄開發規範、不一樣目錄間模塊調用

---------------我的學習筆記---------------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

相關文章
相關標籤/搜索