2018-02-14

https://bop.mol.uno/ 已讀

  1. python 類變量與對象變量
    Class Variable 是共享的,它們可以被屬于該類的所有實例訪問。該類變量只擁有一個副本,當任何一個對象對類變量作出改變時,發生的變動將在其它所有實例中都會得到體現。
    Object variable 由類的每一個獨立的對象或實例所擁有。在這種情況下,每個對象都擁有屬于它自己的字段的副本,也就是說,它們不會被共享,也不會以任何方式與其它不同實例中的相同名稱的字段產生關聯。
    比如:
class Robot:
# 一個類變量
    population = 0

    def __init__(self, name):
        self.name = name
        print("(Initializing {})".format(self.name))
#這個population是通過Robot類名調用
        Robot.population += 1

    def die(self):
        print("{} is being destroyed!".format(self.name))

        Robot.population -= 1

        if Robot.population == 0:
            print("{} was the last one.".format(self.name))
        else:
            print("There are still {:d} robots working.".format(
                Robot.population))

    def say_hi(self):
        print("Greetings, my masters call me {}.".format(self.name))

#類方法
#how_many 實際上是一個屬于類而非屬于對象的方法。
#這就意味著我們可以將它定義為一個 classmethod(類方法) 或是一個 staticmethod(靜態方法),這取決于我們是否需要知道這一方法屬于哪個類。
#由于我們已經引用了一個類變量,因此我們使用 classmethod
    @classmethod
    def how_many(cls):
        print("We have {:d} robots.".format(cls.population))
  • 注意當一個對象變量與一個類變量名稱相同時,類變量將會被隱藏。
  • 除了 Robot.popluation,我們還可以使用 self.class.population,因為每個對象都通過 self.class 屬性來引用它的類。
  • 只能使用 self 來引用同一對象的變量與方法。這被稱作屬性引用(Attribute Reference)。
  • 所有的類成員都是公開的。但有一個例外:如果你使用數據成員并在其名字中使用雙下劃線作為前綴,形成諸如 __privatevar 這樣的形式,Python 會使用名稱調整(Name-mangling)來使其有效地成為一個私有變量。
  1. Exception handler
    with - 在 try 塊中獲取資源,然后在 finally 塊中釋放資源,用with可以更優雅的完成。
f = open("poem.txt")
try:
     yield f
finally:
    f.close()
with open("poem.txt") as f:
    for line in f:
        print(line, end='')
  1. Lambda
    lambda 語句可以創建一個新的函數對象。從本質上說,lambda 需要一個參數,后跟一個表達式作為函數體,這一表達式執行的值將作為這個新函數的返回值。
points = [{'x': 2, 'y': 3},
          {'x': 4, 'y': 1}]
points.sort(key=lambda i: i['y'])
#按y值排序字典

4.列表推導(List Comprehension)
用于從一份現有的列表中得到一份新列表。

listone = [2, 3, 4]
listtwo = [2*i for i in listone if i > 2]
print(listtwo)

在本案例中,當滿足了某些條件時(if i > 2),我們進行指定的操作(2*i),以此來獲得一份新的列表。要注意到原始列表依舊保持不變。

  • 使用列表推導的優點在于,當我們使用循環來處理列表中的每個元素并將其存儲到新的列表中時時,它能減少樣板(Boilerplate)代碼的數量。

5.裝飾器
裝飾器(Decorators)是應用包裝函數的快捷方式。這有助于將某一功能與一些代碼一遍又一遍地“包裝”。
舉個例子,我為自己創建了一個 retry 裝飾器,這樣我可以將其運用到任何函數之中,如果在一次運行中拋出了任何錯誤,它就會嘗試重新運行,直到最大次數 5 次,并且每次運行期間都會有一定的延遲。

from time import sleep
from functools import wraps
import logging
logging.basicConfig()
log = logging.getLogger("retry")

def retry(f):
    @wraps(f)
    def wrapped_f(*args, **kwargs):
        MAX_ATTEMPTS = 5
        for attempt in range(1, MAX_ATTEMPTS + 1):
            try:
                return f(*args, **kwargs)
            except:
                log.exception("Attempt %s/%s failed : %s",
                              attempt,
                              MAX_ATTEMPTS,
                              (args, kwargs))
                sleep(10 * attempt)
        log.critical("All %s attempts failed : %s",
                     MAX_ATTEMPTS,
                     (args, kwargs))
    return wrapped_f

counter = 0


@retry
def save_to_database(arg):
    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
    # 這將在第一次調用時拋出異常
    # 在第二次運行時將正常工作(也就是重試)
    if counter < 2:
        raise ValueError(arg)

if __name__ == '__main__':
    save_to_database("Some bad value")
  1. yield
    https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/
    帶有 yield 的函數在 Python 中被稱之為 generator(生成器)
    fibonachi
class Fab(object): 
 
   def __init__(self, max): 
       self.max = max 
       self.n, self.a, self.b = 0, 0, 1 
 
   def __iter__(self): 
       return self 
 
   def next(self): 
       if self.n < self.max: 
           r = self.b 
           self.a, self.b = self.b, self.a + self.b 
           self.n = self.n + 1 
           return r 
       raise StopIteration()

Fab 類通過 next() 不斷返回數列的下一個數,內存占用始終為常數:

def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b 
        a, b = b, a + b 
        n = n + 1 
for n in fab(5)
#這里就會用到iterater b  
  print(n)  

這樣用了yield就更加簡潔

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,775評論 18 139
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,745評論 0 9
  • Python 面向對象Python從設計之初就已經是一門面向對象的語言,正因為如此,在Python中創建一個類和對...
    順毛閱讀 4,231評論 4 16
  • 這篇文章完全是基于南峰子老師博客的轉載 這篇文章完全是基于南峰子老師博客的轉載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,578評論 33 466
  • 我們總以為我們自己可以完成所有的事,我們也習慣了一切靠自己說法,然而,有些事不是你一個人努力就夠的。 ...
    楊瑩瑩ing閱讀 712評論 0 1