import time def timmer(func): def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print('run time is %s' %(stop_time-start_time)) return res return wrapper @timmer def foo(): time.sleep(3) print('from foo') foo() 無參裝飾器
#閉包函數定義:定義在函數內部的函數,
特色是:包含對外部做用域而不是對全局做用域名字的引用
函數體內內部須要一個變量,有兩種解決方案
一種是:以參數的形式傳入python
裝飾器:express
一、爲何要用裝飾器:開放封閉原則,對擴展是開放的,對修改是封閉的編程
2.什麼是裝飾器json
1、用來裝飾他人,裝飾器自己能夠是任意可調用對象, 別裝飾的對象也能夠是任意可調用的對象 2、遵循的原則: 1、不修改被裝飾 2、不修改被裝飾對象的調用方式 三、原則是:在遵循原則1和2的前提,爲被裝飾器對象添加上新功能
有參裝飾器:網絡
2.迭代器與生成器閉包
1、什麼叫迭代:迭代是一個重複的過程,每次重複都是基於上一次的結果來的 2、爲何要用迭代器? 對於序列類型:字符串,列表,元組,可使用基於索引的迭代取值方式,而對於沒有索引的字典,集合 三、可迭代的對象:只有對象內置有__iter__ 方法,obj.__iter__ 如文件對象 四、迭代器對象:既有內置__iter__ 又有 __next__ 迭代器的優缺點: 優勢:提供了一種統一的迭代取值方式,該方式再也不依賴索引,更節省內存 缺點:沒法統計長度 一次性的,只能日後走,不能往前退,沒法獲取指定位置的值 生成器: 定義:只要函數出現yield關鍵字,那麼再調用該函數,將不會當即執行函數體代碼,會到一個該結果就是生成器對象 生成器本質就是迭代器 yield 的功能: 1、爲咱們提供了自定義的迭代器的方式 二、對比return ,能夠返回屢次值,掛起函數的運行狀態
3.面向過程編程app
面向過程編程思想:核心是過程二字,過程即解決問題的步驟,那先幹什麼再幹什麼 基於該思想去編寫程序就比如在設計一條流水線,是一種機械式的編程思想 優勢: 1、能夠把複雜的問題流程化,進而簡單化 缺點: 1、可擴展性差
三元表達編程語言
name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(res)
列表解析函數
#一、示例 egg_list=[] for i in range(10): egg_list.append('雞蛋%s' %i) egg_list=['雞蛋%s' %i for i in range(10)] #二、語法 [expression for item1 in iterable1 if condition1 for item2 in iterable2 if condition2 ... for itemN in iterableN if conditionN ] 相似於 res=[] for item1 in iterable1: if condition1: for item2 in iterable2: if condition2 ... for itemN in iterableN: if conditionN: res.append(expression) #三、優勢:方便,改變了編程習慣,可稱之爲聲明式編程
三 生成器表達式學習
#一、把列表推導式的[]換成()就是生成器表達式 #二、示例:生一筐雞蛋變成給你一隻老母雞,用的時候就下蛋,這也是生成器的特性 >>> chicken=('雞蛋%s' %i for i in range(5)) >>> chicken <generator object <genexpr> at 0x10143f200> >>> next(chicken) '雞蛋0' >>> list(chicken) #因chicken可迭代,於是能夠轉成列表 ['雞蛋1', '雞蛋2', '雞蛋3', '雞蛋4',] #三、優勢:省內存,一次只產生一個值在內存中
json&pickle模塊
以前咱們學習過用eval內置方法能夠將一個字符串轉成python對象,不過,eval方法是有侷限性的,對於普通的數據類型,json.loads和eval都能用,但遇到特殊類型的時候,eval就無論用了,因此eval的重點仍是一般用來執行一個字符串表達式,並返回表達式的值。
1 import json 2 x="[null,true,false,1]" 3 print(eval(x)) #報錯,沒法解析null類型,而json就能夠 4 print(json.loads(x))
什麼是序列化?
咱們把對象(變量)從內存中變成可存儲或傳輸的過程稱之爲序列化,在Python中叫pickling,在其餘語言中也被稱之爲serialization,marshalling,flattening等等,都是一個意思。
爲何要序列化?
1:持久保存狀態
需知一個軟件/程序的執行就在處理一系列狀態的變化,在編程語言中,'狀態'會以各類各樣有結構的數據類型(也可簡單的理解爲變量)的形式被保存在內存中。
內存是沒法永久保存數據的,當程序運行了一段時間,咱們斷電或者重啓程序,內存中關於這個程序的以前一段時間的數據(有結構)都被清空了。
在斷電或重啓程序以前將程序當前內存中全部的數據都保存下來(保存到文件中),以便於下次程序執行可以從文件中載入以前的數據,而後繼續執行,這就是序列化。
具體的來講,你玩使命召喚闖到了第13關,你保存遊戲狀態,關機走人,下次再玩,還能從上次的位置開始繼續闖關。或如,虛擬機狀態的掛起等。
2:跨平臺數據交互
序列化以後,不只能夠把序列化後的內容寫入磁盤,還能夠經過網絡傳輸到別的機器上,若是收發的雙方約定好實用一種序列化的格式,那麼便打破了平臺/語言差別化帶來的限制,實現了跨平臺數據交互。
反過來,把變量內容從序列化的對象從新讀到內存裏稱之爲反序列化,即unpickling。
如何序列化之json和pickle:
json
若是咱們要在不一樣的編程語言之間傳遞對象,就必須把對象序列化爲標準格式,好比XML,但更好的方法是序列化爲JSON,由於JSON表示出來就是一個字符串,能夠被全部語言讀取,也能夠方便地存儲到磁盤或者經過網絡傳輸。JSON不只是標準格式,而且比XML更快,並且能夠直接在Web頁面中讀取,很是方便。
JSON表示的對象就是標準的JavaScript語言的對象,JSON和Python內置的數據類型對應以下:
import json dic={'name':'alvin','age':23,'sex':'male'} print(type(dic))#<class 'dict'> j=json.dumps(dic) print(type(j))#<class 'str'> f=open('序列化對象','w') f.write(j) #-------------------等價於json.dump(dic,f) f.close() #-----------------------------反序列化<br> import json f=open('序列化對象') data=json.loads(f.read())# 等價於data=json.load(f)