python 高級語法

一.Python 中類方法寿烟、類實例方法、靜態(tài)方法有何區(qū)別
定義區(qū)別:
1.類方法和靜態(tài)方法分別有專門的修飾符 @classmethod,@staticmethod碗短。
2.實例方法有self參數(shù)凤优,類方法有cls參數(shù)(類參數(shù))悦陋,靜態(tài)方法是不需要這些附加參數(shù)的

3.靜態(tài)方法實際上跟該類沒有太大關(guān)系
訪問區(qū)別:

  1. 類和實例都可以訪問靜態(tài)方法和類方法
  2. 從理論上來說,類是不能訪問實例方法的筑辨,但是可以把實例/類作為參數(shù)傳入俺驶,訪問如下:

a=Myclass()
Myclass.method(a)
Myclass.method(Myclass)
二.Python 中如何動態(tài)獲取和設(shè)置對象的屬性
hasattr,setattr,getattr
三.Python 的內(nèi)存管理機制及調(diào)優(yōu)手段
點這里[http://www.reibang.com/p/6e82c7a54c33]
內(nèi)存泄漏:有 del() 函數(shù)的對象間的循環(huán)引用是導(dǎo)致內(nèi)存泄漏的主兇。
不使用一個對象時使用:del object 來刪除一個對象的引用計數(shù)就可以有效防止內(nèi)存泄漏問題棍辕。
通過 Python 擴展模塊 gc 來查看不能回收的對象的詳細(xì)信息暮现。
可以通過 sys.getrefcount(obj) 來獲取對象的引用計數(shù),并根據(jù)返回值是否為 0 來判斷是否內(nèi)存泄漏楚昭。
四.函數(shù)

  1. 函數(shù)參數(shù)
    Python 的參數(shù)傳遞有:位置參數(shù)栖袋、默認(rèn)參數(shù)、可變參數(shù)抚太、關(guān)鍵字參數(shù)
    函數(shù)的傳值到底是值傳遞還是引用傳遞栋荸,要分情況:
    不可變參數(shù) 用值傳遞
    可變參數(shù) 引用傳遞

有這樣一段代碼,print c 會輸出什么:

a = 10
b = 20
c = [a]
a = 15
print c
>>>[10]

像列表凭舶,字典這樣的對象是通過引用傳遞晌块、和 C 語言里面的用指針傳遞數(shù)組很相似,可變對象
能在函數(shù)內(nèi)部改變帅霜。

對缺省參數(shù)的理解
缺省參數(shù)指在調(diào)用函數(shù)的時候沒有傳入?yún)?shù)的情況下匆背,調(diào)用默認(rèn)的參數(shù),在調(diào)用函數(shù)的同時賦值時身冀,所傳入的參數(shù)會替代默認(rèn)參數(shù)钝尸。
*args 是不定長參數(shù),他可以表示輸入?yún)?shù)是不確定的搂根,可以是任意多個珍促。元組方式傳入
**kwargs 是關(guān)鍵字參數(shù),賦值的時候是以鍵 = 值的方式剩愧,參數(shù)是可以任意多對在定義函數(shù)的時候不確定會有多少參數(shù)會傳入時猪叙,就可以使用兩個參數(shù)。字典式傳入

  1. 為什么函數(shù)名字可以當(dāng)做參數(shù)用
    Python 中一切皆對象,函數(shù)名是函數(shù)在內(nèi)存中的空間穴翩,也是一個對象犬第。
    4.遞歸函數(shù)終止的條件
    遞歸的終止條件一般定義在遞歸函數(shù)內(nèi)部,在遞歸調(diào)用前要做一個條件判斷芒帕,根據(jù)判斷的結(jié)果選擇是繼續(xù)調(diào)用自身歉嗓,還是 return;返回終止遞歸。
    終止的條件:
    . 判斷遞歸的次數(shù)是否達(dá)到某一限定值
    . 判斷運算的結(jié)果是否達(dá)到某個范圍等背蟆,根據(jù)設(shè)計的目的來選擇

5.回調(diào)函數(shù)鉴分,如何通信的:
回調(diào)函數(shù)是把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),將整個函數(shù)當(dāng)作一個對象带膀,賦值給調(diào)用的函數(shù)冠场。

  1. Python 主要的內(nèi)置數(shù)據(jù)類型都有哪些? print dir( ‘a(chǎn) ’) 的輸出

內(nèi)建類型:布爾類型本砰、數(shù)字碴裙、字符串、列表点额、元組舔株、字典、集合还棱;
輸出字符串‘a(chǎn)’的內(nèi)建方法载慈;

  1. 一句話解決階乘函數(shù)
reduce(lambda x,y: x*y, range(1,n+1))

8.lambda函數(shù)
lambda 函數(shù)是一個可以接收任意多個參數(shù)(包括可選參數(shù))并且返回單個表達(dá)式值的函數(shù)
.lambda 函數(shù)比較輕便,很適合需要完成一項功能,但是此功能只在此一處使用珍手,不用def給函數(shù)起名办铡。
.匿名函數(shù),一般用來給 filter琳要, map 這樣的函數(shù)式編程服務(wù);
.作為回調(diào)函數(shù)寡具,傳遞給某些應(yīng)用
這段代碼的輸出結(jié)果將是什么:

>>> def multipliers():
...     return [lambda x : i * x for i in range(4)]
...
>>> print [m(2) for m in multipliers()]
[6, 6, 6, 6] (不是我們想的[0, 2稚补, 4童叠, 6])

原因:
Python 閉包的延遲綁定。這意味著內(nèi)部函數(shù)被調(diào)用時课幕,參數(shù)的值在閉包內(nèi)進(jìn)行查找厦坛。
i的變量引用,等待4次循環(huán)結(jié)束后乍惊,i指向一個值i=3,這個時候杜秸,匿名函數(shù)才開始引用i=3

解決方法:
一種解決方法就是用 Python 生成器。

def multipliers():
     for i in range(4): yield lambda x : i * x

另外一個解決方案就是添加默認(rèn)參數(shù)润绎,立即綁定撬碟。

def multipliers():
    return [lambda x,a=i : a* x for i in range(4)]

第二種方法:添加了一個a=i诞挨,python函數(shù)中的默認(rèn)參數(shù),是在python 解釋器遇到def(i=i)或lambda 關(guān)鍵字時小作,就必須初始化默認(rèn)參數(shù),此時for i in range(4)稼钩,每循環(huán)一次顾稀,匿名函數(shù)的默認(rèn)參數(shù)i,就需要找一次i的引用坝撑,i=0時静秆,第一個匿名函數(shù)的默認(rèn)參數(shù)值就是0,i=1時巡李,第二個匿名函數(shù)的默認(rèn)參數(shù)值就是1...
可以理解為:
def multipliers():
return [lambda x,i=0: ix, lambda x,i=1: ix, lambda x,i=2: ix, lambda x,i=3:ix i=3]

五.設(shè)計模式
1)單例模式
是一種常用的軟件設(shè)計模式抚笔,該模式的主要目的是確保某一個類只有一個實例存在。當(dāng)你希望在整個系統(tǒng)中侨拦,某個類只能出現(xiàn)一個實例時殊橙,單例對象就能派上用場。
相關(guān)鏈接

實現(xiàn)單例模式的幾種方式:
.使用模塊:
Python 的模塊就是天然的單例模式狱从,因為模塊在第一次導(dǎo)入時膨蛮,會生成 .pyc 文件,當(dāng)?shù)诙螌?dǎo)入時季研,就會直接加載 .pyc 文件敞葛,而不會再次執(zhí)行模塊代碼。因此与涡,我們只需把相關(guān)的函數(shù)和數(shù)據(jù)定義在一個模塊中惹谐,就可以獲得一個單例對象
然后再從其他模塊導(dǎo)入這個單例對象

.使用裝飾器

def Singleton(cls):
    _instance = {}
    def _singleton(*args, **kargs):
        if cls not in _instance:
            _instance[cls] = cls(*args, **kargs)
        return _instance[cls]
    return _singleton


@Singleton
class A(object):
    a = 1
    def __init__(self, x=0):
        self.x = x
a1 = A(2)
a2 = A(3)

a1,a2都是同一個實例

.使用類,但是多線程時會出問題驼卖,需要加鎖

.基于new方法實現(xiàn)
當(dāng)我們實例化一個對象時氨肌,是先執(zhí)行了類的new方法(默認(rèn)調(diào)用object.new),實例化對象酌畜;然后再執(zhí)行類的init方法儒飒,對這個對象進(jìn)行初始化,

class A(object):
    _instance =None
    def __new__(cls,*args,**kwargs):
        if cls._instance = None:
            cls._instance = object.__new__(cls)
            return cls._instance
        else:
            return cls._instance

應(yīng)用場景:

(1)資源共享的情況下檩奠,避免由于資源操作時導(dǎo)致的性能或損耗等桩了。如日志文件,應(yīng)用配置埠戳。
(2)控制資源的情況下井誉,方便資源之間的互相通信。如線程池等整胃。 1.網(wǎng)站的計數(shù)器 2.應(yīng)用配置 3.多線程池 4.數(shù)據(jù)庫配置颗圣,數(shù)據(jù)庫連接池 5.應(yīng)用程序的日志應(yīng)用....

2).工廠模式
鏈接
當(dāng)程序運行輸入一個“類型”的時候,需要創(chuàng)建于此相應(yīng)的對象。這就用到了工廠模式在岂。在如此情形中奔则,實現(xiàn)代碼基于工廠模式,可以達(dá)到可擴展蔽午,可維護(hù)的代碼易茬。當(dāng)增加一個新的類型,不在需要修改已存在的類及老,只增加能夠產(chǎn)生新類型的子類抽莱。
簡短的說,當(dāng)以下情形可以使用工廠模式:

1.不知道用戶想要創(chuàng)建什么樣的對象
2.當(dāng)你想要創(chuàng)建一個可擴展的關(guān)聯(lián)在創(chuàng)建類與支持創(chuàng)建對象的類之間骄恶。

3)裝飾器
本質(zhì)上是一個 Python 函數(shù)食铐,它可以在讓其他函數(shù)在不需要做任何代碼的變動的前提下增加額外的功能。裝飾器的返回值也是一個函數(shù)的對象.

  1. 生成器
    生成器僧鲁、迭代器的區(qū)別:
    生成器能做到迭代器能做的所有事,而使用生成器表達(dá)式取代列表解析可以同時節(jié)省內(nèi)存虐呻。使用yield變成generator
>>> X = (i for i in range(10))
>>> print type(X)
<type 'generator'>

用“一行代碼”實現(xiàn)將 1-N 的整數(shù)列表以 3 為單位分組,比如 1-100
分組后為:
print([[x for x in range(1,100)][i:i+3] for i in range(0,len(list_a),3)])

  1. 面向?qū)ο?br> 類和對象
  1. Python 中 is 和==的區(qū)別:
    is 判斷的是 a 對象是否就是 b 對象寞秃,是通過 id 來判斷的铃慷。

==判斷的是 a 對象的值是否和 b 對象的值相等,是通過 value 來判斷的蜕该。

2.python 魔法方法
魔法方法就是可以給你的類增加魔力的特殊方法犁柜,如果你的對象實現(xiàn) (重載)了這些方法中的某一個,那么這個方法就會在特殊的情況下被 Python 所調(diào)用堂淡,如init馋缅,newcall绢淀,等等

3.面向?qū)ο笾性趺磳崿F(xiàn)只讀屬性

使用@property萤悴,將以訪問屬性的方式訪問方法
>>> class Person(object):
...     _age =38
...     @property
...     def age(self):
...             return self._age
...
>>> p = Person()
>>> print p.age
38
>>> p.age = 12
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
>>>

4.談?wù)勀銓γ嫦驅(qū)ο蟮睦斫猓?br> 面向?qū)ο笫窍鄬τ诿嫦蜻^程而言的。面向過程語言是一種基于功能分析的皆的、以算法為中心的程序設(shè)計方法覆履;而面
向?qū)ο笫且环N基于結(jié)構(gòu)分析的、以數(shù)據(jù)為中心的程序設(shè)計思想费薄。在面向?qū)ο笳Z言中有一個有很重要東西硝全,叫做類。
面向?qū)ο笥腥筇匦裕悍庋b楞抡、繼承伟众、多態(tài)。

6)正則表達(dá)式

.match 與 search 的區(qū)別:
match()函數(shù)只檢測 RE 是不是在 string 的開始位置匹配召廷,
search()會掃描整個 string 查找匹配凳厢;

.字符串查找和替換:
re.findall(r’目的字符串’账胧,’原有字符串’) #查詢
re.findall(r'cast','itcast.cn')[0]
re.sub(r‘要替換原字符’先紫,’要替換新字符’治泥,’原始字符串’)
re.sub(r'cast','heima'遮精,'itcast.cn')

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末居夹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仑鸥,更是在濱河造成了極大的恐慌吮播,老刑警劉巖变屁,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眼俊,死亡現(xiàn)場離奇詭異,居然都是意外死亡粟关,警方通過查閱死者的電腦和手機疮胖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闷板,“玉大人澎灸,你說我怎么就攤上這事≌谕恚” “怎么了性昭?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長县遣。 經(jīng)常有香客問我糜颠,道長,這世上最難降的妖魔是什么萧求? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任其兴,我火速辦了婚禮,結(jié)果婚禮上夸政,老公的妹妹穿的比我還像新娘元旬。我一直安慰自己,他們只是感情好守问,可當(dāng)我...
    茶點故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布匀归。 她就那樣靜靜地躺著,像睡著了一般耗帕。 火紅的嫁衣襯著肌膚如雪朋譬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天兴垦,我揣著相機與錄音徙赢,去河邊找鬼字柠。 笑死,一個胖子當(dāng)著我的面吹牛狡赐,可吹牛的內(nèi)容都是我干的窑业。 我是一名探鬼主播,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼枕屉,長吁一口氣:“原來是場噩夢啊……” “哼常柄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搀擂,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤西潘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哨颂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喷市,經(jīng)...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年威恼,在試婚紗的時候發(fā)現(xiàn)自己被綠了品姓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,637評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡箫措,死狀恐怖腹备,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斤蔓,我是刑警寧澤植酥,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站弦牡,受9級特大地震影響友驮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喇伯,卻給世界環(huán)境...
    茶點故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一喊儡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧稻据,春花似錦艾猜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至今缚,卻和暖如春算柳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背姓言。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工瞬项, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蔗蹋,地道東北人。 一個月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓囱淋,卻偏偏與公主長得像猪杭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妥衣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,500評論 2 348

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

  • 包(lib)皂吮、模塊(module) 在Python中,存在包和模塊兩個常見概念税手。 模塊:編寫Python代碼的py...
    清清子衿木子水心閱讀 3,801評論 0 27
  • 時間蜂筹,總在不經(jīng)意間流逝, 如絲芦倒,靜謐柔滑艺挪; 如水,悄無聲息熙暴; 月圓月缺闺属,流年幾轉(zhuǎn)慌盯。 回首過去周霉,幾多歡樂幾多愁。 過...
    念念不忘的番薯閱讀 225評論 0 0
  • 轉(zhuǎn)眼四月天 唱響點亮四面風(fēng)亚皂, 情可縷空俱箱,情可縷空, 原來是在精雕細(xì)刻中灭必。 愛情若是精致了狞谱, 怎會衍生柴米油鹽! 心...
    梁汝閱讀 119評論 2 4
  • 2017/9/12 奇跡感恩日記 奇跡 1. 今天我很開心禁漓。一早上就和師父師母及朋友一起到七浦大商城來購物跟衅。師母對...
    木易江鳥閱讀 460評論 0 0