python day 4

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)
相關文章
相關標籤/搜索