-
class?Student(Person): ????__slots__?=?('score',) ????def?__init__(self,?name,?gender,?score): ????????super(Student,?self).__init__(name,?gender) ????????self.score?=?score 從Person中繼承了,并新增加一個score的屬性
查看全部 -
使用?get/set?方法來封裝對一個屬性的訪問在許多面向對象編程的語言中都很常見。
查看全部 -
Python的?decorator?本質上就是一個高階函數,它接收一個函數作為參數,然后,返回一個新函數。
查看全部 -
直接把?lambda?函數賦值給?self.get_grade?和綁定方法有所不同,函數調用不需要傳入?self,但是方法調用需要傳入?self。
查看全部 -
要讓?@log?自適應任何參數定義的函數,可以利用Python的?*args?和?**kw,保證任意個數的參數總是能正常調用:
def?log(f): ????def?fn(*args,?**kw): ????????print?'call?'?+?f.__name__?+?'()...' ????????return?f(*args,?**kw) ????return?fn
現在,對于任意函數,@log?都能正常工作。
查看全部 -
通過對比可以看出,匿名函數?lambda x: x * x?實際上就是:
def?f(x): ????return?x?*?x
關鍵字lambda?表示匿名函數,冒號前面的?x 表示函數參數。
匿名函數有個限制,就是只能有一個表達式,不寫return,返回值就是該表達式的結果。
查看全部 -
strip()? 去除字符列表內為空的元素(None,False,'\n'‘‘,等)
查看全部 -
如果要提高Python代碼的運行速度,最簡單的方法是把某些關鍵函數用?C?語言重寫,這樣就能大大提高執行速度。
同樣的功能,StringIO?是純Python代碼編寫的,而?cStringIO?部分函數是?C?寫的,因此 cStringIO 運行速度更快。
利用ImportError錯誤,我們經常在Python中動態導入模塊:
try: ????from?cStringIO?import?StringIO except?ImportError: ????from?StringIO?import?StringIO
上述代碼先嘗試從cStringIO導入,如果失敗了(比如cStringIO沒有被安裝),再嘗試從StringIO導入。這樣,如果cStringIO模塊存在,則我們將獲得更快的運行速度,如果cStringIO不存在,則頂多代碼運行速度會變慢,但不會影響代碼的正常執行。
try?的作用是捕獲錯誤,并在捕獲到指定錯誤時執行?except?語句。
查看全部 -
python3報錯,需要修改下:
import?functools class?Student(object): ????def?__init__(self,?name,?score): ????????self.name?=?name ????????self.score?=?score ????def?__str__(self): ????????return?'(%s:?%s)'?%?(self.name,?self.score) ????__repr__?=?__str__ ????#?重寫魔術方法?__cmp__?排序規則:按照分數從高到底排序,分數相同的按名字排序。 ????#?python3?失效 def?my_cmp(self,?s): ????if?self.score?>?s.score: ????????return?-1 ????elif?self.score?<?s.score: ????????return?1 ????else: ????????if?self.name?<?s.name: ????????????return?-1 ????????elif?self.name?>?s.name: ????????????return?1 ????????else: ????????????return?0 L?=?[Student('Tim',?99),?Student('Bob',?88),?Student('Alice',?99)] print(sorted(L,?key=functools.cmp_to_key(my_cmp)))
查看全部 -
傳入**kw?即可傳入任意數量的參數
eg: ????def?__init__(self,?name,?gender,?**kw):????????self.name=name????????self.gender=gender????????for?k,?v?in?kw.iteritems():????????????setattr(self,?k,?v)
查看全部 -
像這種內層函數引用了外層函數的變量(參數也算變量),然后返回內層函數的情況,稱為閉包(Closure)。
閉包的特點是返回的函數還引用了外層函數的局部變量,所以,要正確使用閉包,就要確保引用的局部變量在函數返回后不能變。
查看全部 -
>>>?map(lambda?x:?x?*?x,?[1,?2,?3,?4,?5,?6,?7,?8,?9]) [1,?4,?9,?16,?25,?36,?49,?64,?81]
通過對比可以看出,匿名函數?lambda x: x * x?實際上就是:
def?f(x): ????return?x?*?x
關鍵字lambda?表示匿名函數,冒號前面的?x 表示函數參數。
查看全部 -
@log('DEBUG') def?my_func(): ????pass 把上面的定義翻譯成高階函數的調用,就是: my_func?=?log('DEBUG')(my_func) 再展開一下: log_decorator?=?log('DEBUG') my_func?=?log_decorator(my_func) 所以,帶參數的log函數首先返回一個decorator函數,再讓這個decorator函數接收my_func并返回新函數
查看全部 -
任務
改進一下前面定義的斐波那契數列:
class?Fib(object): ???????
請加一個__call__方法,讓調用更簡單:
>>>?f?=?Fib() >>>?print?f(10) [0,?1,?1,?2,?3,?5,?8,?13,?21,?34]
?不會了怎么辦
要正確定義參數:__call__(self, num)
參考代碼:
class?Fib(object): ????def?__call__(self,?num): ????????a,?b,?L?=?0,?1,?[] ????????for?n?in?range(num): ????????????L.append(a) ????????????a,?b?=?b,?a?+?b ????????return?L f?=?Fib() print?f(10)
查看全部 -
任務
假設Person類通過__slots__定義了name和gender,請在派生類Student中通過__slots__繼續添加score的定義,使Student類可以實現name、gender和score?3個屬性。
?
?不會了怎么辦
Student類的__slots__只需要包含Person類不包含的score屬性即可。
參考代碼:
class?Person(object): ????__slots__?=?('name',?'gender') ????def?__init__(self,?name,?gender): ????????self.name?=?name ????????self.gender?=?gender class?Student(Person): ????__slots__?=?('score',) ????def?__init__(self,?name,?gender,?score): ????????super(Student,?self).__init__(name,?gender) ????????self.score?=?score s?=?Student('Bob',?'male',?59) s.name?=?'Tim' s.score?=?99 print?s.score
查看全部
舉報