第16篇山涡,Python的其它知識

傳遞元組

如下

# 傳遞元組
def get_error_details():
    return (2,'details')

errnum,errstr = get_error_details()
print(errnum)
print(errstr)

# 快速交換兩個變量
errstr,errnum = errnum,errstr
print(errnum)
print(errstr)

控制臺

2
details
details
2

Process finished with exit code 0

a,b = <some expression>將表達(dá)式解釋為具有兩個值的一個元組堤结。
快速交換兩個變量的方法如上。

特殊方法

更所的特殊方法鸭丛,請參考這里

# 特殊方法 舉例說明

# __init__(self,...) 這一方法在新創(chuàng)建的對象被返回準(zhǔn)備調(diào)用時被調(diào)用
# __del__(self) 這一方法在對象被刪除之前調(diào)用(但是它的使用實際不可預(yù)測竞穷,所以避免使用)
# __str__(self) 當(dāng)我們使用print函數(shù)時,或者str()被使用時就會被調(diào)用
# __it__(self,other) 當(dāng)小于運算符(<)被使用時被調(diào)用鳞溉。類似瘾带,使用其它所有運算符時都會有特殊方法被調(diào)用
# __getitem__(self,key) 使用x[key]索引操作時被調(diào)用
# __len__(self) 當(dāng)針對序列對象使用內(nèi)置len()函數(shù)時被調(diào)用
單語句塊

我們已經(jīng)見過每一個語句塊都由其自身的縮進(jìn)級別與其它部分相區(qū)分。但是如果語句塊只包括單獨的一行語句熟菲,那么我們可以在同一行指定它看政,比如條件語句和循環(huán)語句。
如下

flag = True
if flag: print('YES')

單個語句是在原地立即使用的抄罕,它不會被看做一個單獨的塊允蚣。

Lambda表格

lambda語句可以創(chuàng)建一個新的函數(shù)對象。從本質(zhì)上說呆贿,lambda需要一個參數(shù)厉萝,后跟一個表達(dá)式作為函數(shù)體,這個表達(dá)式執(zhí)行的值將作為這個新函數(shù)的返回值榨崩。
如下

# lambda表達(dá)式
point = [
    {'x':2,'y':3},
    {'x':4,'y':7}
]
point.sort(key=lambda i:i['x'])
print(point)
print("****************")
z = lambda x,y,z:x*y*z
print(z(999,95,82))

控制臺輸出

[{'x': 2, 'y': 3}, {'x': 4, 'y': 7}]
****************
77892210

Process finished with exit code 0

當(dāng)我們需要編寫一個函數(shù)谴垫,又不想為函數(shù)編寫一個獨立的def塊時,就可以使用lambda表達(dá)式母蛛。

列表推導(dǎo)

列表推導(dǎo)用于從現(xiàn)有的列表中得到一份新的列表翩剪。當(dāng)我們循環(huán)處理列表中的元素,并將其存儲在一個新的列中中時彩郊,列表推導(dǎo)可以省下很多代碼前弯。
如下

# 列表推導(dǎo)
# 從已有列表中國推導(dǎo)出一份新的列表
listone = [2,3,4,5,6]
listtwo = [2*i*i for i in  listone if i>3]
print(listtwo)

控制臺

[32, 50, 72]

Process finished with exit code 0
在函數(shù)中接收元組與字典

如下

# 在函數(shù)中接收元組與字典
# 接收元組
def powerSum(poewr,*ele):
    total = 0
    for i in  ele:
        print(i)
        total += pow(i,poewr)
    return  total

# 接收字典
def getkeyvalue(p,**dic):
    for k in  dic.values():
        print(k*p)
    print(dic)

print(getkeyvalue(3,a=3,b=4))
print('=====================')
print(powerSum(10,5,9,11))

控制臺

9
12
{'a': 3, 'b': 4}
None
=====================
5
9
11
29433974627

Process finished with exit code 0

如上,我們使用*作為元組的前綴秫逝,函數(shù)所有的其它額外參數(shù)都將傳遞到ele中恕出,并作為一個元組進(jìn)行存儲。**作為字典的前綴违帆,額外的參數(shù)將被視為字典的鍵值對進(jìn)行存儲浙巫,并且,在傳遞參數(shù)時必須采用key=value的形式。

assert語句

assert用來斷言Assert某件事是真的的畴,如果不是真的渊抄,就會拋出AssertionError錯誤。
如下

# assert 語句
text = input('Please input content:')
assert  len(text) > 5

控制臺

Please input content:qwert
Traceback (most recent call last):
  File "/Users/a1/Desktop/Python/PythonProjectFiles/More.py", line 62, in <module>
    assert  len(text) > 5
AssertionError

Process finished with exit code 1

如上丧裁,我們斷言輸入字符串的長度會大于5护桦,當(dāng)我們輸入字符串長度小于等于5時,就會拋出AssertionError煎娇。
相比捕獲異常 以及定位問題或向用戶顯示錯誤信息然后退出二庵,斷言的優(yōu)勢更為明顯。

裝飾器

裝飾器是應(yīng)用包裝函數(shù)的快捷方式缓呛,這有助于將某一功能與一些代碼一遍又一遍的“包裝”眨猎。如下,創(chuàng)建一個retry裝飾器

from time import  sleep
from  functools import wraps
import logging

logging.basicConfig()
log = logging.getLogger('retry')

def retry(f):
    @wraps(f)
    def wrapped_f(*tup,**dic):
        MAX_ATTEMPTS = 5
        for attempt in range(1,MAX_ATTEMPTS + 1):
            try:
                return  f(*tup,**dic)
            except:
                log.exception("Attemp %s%s failed:%s",
                               attempt,
                              MAX_ATTEMPTS,
                              (tup,dic))
                sleep(2 * attempt)
        log.critical("All %s attemp failed: %s",
                     MAX_ATTEMPTS,
                     (tup,dic))
    return  wrapped_f

counter = 0

@retry
def saveToDatabase(ele):
    print("Write to a database or make a network call or etc.")
    print("This will be automatically retried if exception is thrown.")
    global  counter

    counter += 1
    
    # 前3次調(diào)用時拋出異常  
    # 第四次運行時講正常工作(重試)
    if counter < 4:
        raise  ValueError(ele)

if not __name__ == 'main':
    saveToDatabase('Some bad value')

控制臺

ERROR:retry:Attemp 15 failed:(('Some bad value',), {})
Traceback (most recent call last):
  File "/Users/a1/Desktop/Python/PythonProjectFiles/Decorators.py", line 14, in wrapped_f
    return  f(*tup,**dic)
  File "/Users/a1/Desktop/Python/PythonProjectFiles/Decorators.py", line 37, in saveToDatabase
    raise  ValueError(ele)
ValueError: Some bad value
Write to a database or make a network call or etc.
This will be automatically retried if exception is thrown.
ERROR:retry:Attemp 25 failed:(('Some bad value',), {})
Write to a database or make a network call or etc.
Traceback (most recent call last):
This will be automatically retried if exception is thrown.
  File "/Users/a1/Desktop/Python/PythonProjectFiles/Decorators.py", line 14, in wrapped_f
    return  f(*tup,**dic)
  File "/Users/a1/Desktop/Python/PythonProjectFiles/Decorators.py", line 37, in saveToDatabase
    raise  ValueError(ele)
ValueError: Some bad value
ERROR:retry:Attemp 35 failed:(('Some bad value',), {})
Write to a database or make a network call or etc.
Traceback (most recent call last):
This will be automatically retried if exception is thrown.
  File "/Users/a1/Desktop/Python/PythonProjectFiles/Decorators.py", line 14, in wrapped_f
    return  f(*tup,**dic)
  File "/Users/a1/Desktop/Python/PythonProjectFiles/Decorators.py", line 37, in saveToDatabase
    raise  ValueError(ele)
ValueError: Some bad value
Write to a database or make a network call or etc.
This will be automatically retried if exception is thrown.

Process finished with exit code 0

如上 retry裝飾器强经,可以將它運行到任何函數(shù)中,如果在前三次運行中拋出任何錯誤寺渗,它將會嘗試重新運行匿情,直到最大運行次數(shù)5次,并且每次重新運行之間還會有一定時間的延遲信殊。
關(guān)于裝飾器炬称,可以參考 onetwo

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市涡拘,隨后出現(xiàn)的幾起案子玲躯,更是在濱河造成了極大的恐慌,老刑警劉巖鳄乏,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跷车,死亡現(xiàn)場離奇詭異,居然都是意外死亡橱野,警方通過查閱死者的電腦和手機(jī)朽缴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來水援,“玉大人密强,你說我怎么就攤上這事∥显” “怎么了或渤?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奕扣。 經(jīng)常有香客問我薪鹦,道長,這世上最難降的妖魔是什么惯豆? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任距芬,我火速辦了婚禮涝开,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘框仔。我一直安慰自己舀武,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布离斩。 她就那樣靜靜地躺著银舱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪跛梗。 梳的紋絲不亂的頭發(fā)上寻馏,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音核偿,去河邊找鬼诚欠。 笑死,一個胖子當(dāng)著我的面吹牛漾岳,可吹牛的內(nèi)容都是我干的轰绵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼尼荆,長吁一口氣:“原來是場噩夢啊……” “哼左腔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捅儒,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤液样,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后巧还,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鞭莽,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年麸祷,在試婚紗的時候發(fā)現(xiàn)自己被綠了撮抓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡摇锋,死狀恐怖丹拯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荸恕,我是刑警寧澤乖酬,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站融求,受9級特大地震影響咬像,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一县昂、第九天 我趴在偏房一處隱蔽的房頂上張望肮柜。 院中可真熱鬧,春花似錦倒彰、人聲如沸审洞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芒澜。三九已至,卻和暖如春创淡,著一層夾襖步出監(jiān)牢的瞬間痴晦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工琳彩, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留誊酌,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓露乏,卻偏偏與公主長得像碧浊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子施无,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項目接著寫寫一名3年工作經(jīng)驗的J...
    燕京博士閱讀 7,575評論 1 118
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)必孤,斷路器猾骡,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,117評論 25 707
  • 第一次來這里兴想,或許這里可以成為我寫寫隨筆,隨意發(fā)揮一些自己的見解亦或是小想法的地方吧赡勘!(因為心事很多嫂便,喜歡打打字寫...
    姓王不姓黃閱讀 596評論 8 3
  • 【點石成金】20170626 學(xué)習(xí)力6 Day42 畫日記:關(guān)鍵詞:爸爸 包子 指讀貼在墻上的小...
    葉子ya豆子閱讀 94評論 0 0