一些知識整理:
在flask中使用jsonify和json.dumps的區(qū)別
本文轉載自很多地方守呜。
1. python中常用的四種數據結構(set, dict, list, tuple)是怎么使用的行剂?
列表(list):[ ]。有序,可更改(增加,刪除等)。
獲取方法:下標或者切片操作椰弊。
更改方法:直接賦值。
刪除:末尾刪除隙券,L.pop(元素)男应。刪除指定位置,L.pop(位置)娱仔。
增加:末尾增加沐飘,L.append(元素)。指定位置插入牲迫,L.insert(位置,元素)耐朴。
元組(tuple):( )。有序盹憎,不可變筛峭。賦值時候決定所有元素。
詞典(dict):{ }陪每。無序影晓,可更改¢莺蹋空間換時間挂签,提升效率。
集合(set):{ }盼产。元素不能重復饵婆。無序,可更改戏售。
2. python中函數式編程有哪幾種常用方法以及使用場景是什么侨核?
函數式編程關注數據的映射痰憎,命令式編程關注解決問題的步驟推沸。
用lambda創(chuàng)建匿名函數。匿名:沒有名字筑累。
3. python變量的作用域遵循怎樣的規(guī)范落萎?
遵循LEGB原則:
L(local)局部作用域诲侮。
E(Enclosing)閉包函數外的函數中血久。
G(Global)全局作用域。
B(Built-in)內建作用域轴总。
python中除了def/lambda/class外,其他如if/elif/else try/except for/while并不能改變其作用域博个。
閉包:如果在一個內部函數里怀樟,對在外部函數內(但不是在全局作用域)的變量進行引用,那么內部函數就被認為是閉包(closure)盆佣。
4. python關鍵字參數和位置參數的使用往堡?
python的位置參數、默認參數共耍、關鍵字參數虑灰、可變參數區(qū)別
位置參數:調用函數時根據函數定義的參數位置來傳遞函數。
? ? ? ? ? ? ? ? ? 必須一一對應痹兜,缺失一個都不行穆咐。
關鍵字參數:調用函數時通過“鍵-值”形式加以指定∽中瘢可以使函數更加清晰对湃、容易使用,同時清除了參數的順序需求遗淳。
當存在位置參數時拍柒,位置參數必須在關鍵字參數前面,但關鍵字之間不存在先后順序屈暗。
默認參數:定義函數時拆讯,為參數提供默認值,調用函數時可傳可不傳該默認參數的值养叛。
可變參數:定義函數時种呐,有時并不確定調用的時候需要傳遞多少個參數(不傳參也可以)。此時一铅,可用包裹(packing)位置參數陕贮,或packing關鍵字參數,來進行參數傳遞潘飘。
def func(*args):
? ? ? ...func()
func(a)
func(a,b,c)
傳進的所有參數會被args參數收集肮之,它會根據傳進參數的位置合并為一個元組(turple)掉缺,args是元組類型,即包裹位置傳遞戈擒。
def func(**kargs):
? ? ? ...func(a=1)
func(a=1,b=2,c=3)
5.? @classmethod和@staticmethod的差異是什么眶明,以及綁定方法和動態(tài)綁定函數的使用。
為何使用還需加深理解筐高。
一般情況下搜囱,需要使用某個類的方法,需要先實例化一個對象再調用方法柑土。
而使用@classmethod和@staticmethod蜀肘,可以不需要實例化,直接類名.方法名()來調用稽屏。
這有利于組織代碼扮宠,把某些應該屬于某個類的函數放到那個類里去,同時有利于命名空間的整潔狐榔。
有時坛增,僅需要和類交互而不是與實例交互。
而這兩種方法的區(qū)別是什么呢薄腻?
@staticmethod不需要表示自身對象的self和自身類的cls參數收捣,就跟使用函數一樣。
@classmethod也不需要self參數庵楷,但第一個參數需要是表示自身類的cls參數罢艾。
@classmethod是一個函數修飾符,它表示接下來是一個類方法尽纽,而對于我們平常見到的則叫做實例方法昆婿。類方法的第一個參數cls,而實例方法第一個參數是self蜓斧,表示該類的一個實例仓蛆。
普通對象方法至少需要一個self參數,代表類對象實例挎春。
類方法有類變量cls傳入看疙,從而可以用cls做一些相關的處理。并且有子類繼承時直奋,調用該類方法時能庆,傳入的類變量cls是子類,而非父類脚线。
6. 迭代器和生成器的使用以及協程的使用
python高級特性:減少代碼量搁胆。
切片:可以用于列表,元組,字符串渠旁,操作后類型不變攀例。切片可以替換一些循環(huán)操作。
迭代:任何可迭代對象對可作用于for循環(huán)顾腊。
要對list實現類似下標循環(huán)粤铭,利用enumerate將一個list變成索引-元素對。
dict迭代:默認情況下dict迭代的key杂靶。
如果要迭代value吗垮,可以用for value in d.itervalues()垛吗;如果同時迭代key和value,可以用 for k,v in d.iteritems()烁登。
生成器(Generator):一邊循環(huán)一邊計算的機制职烧。在循環(huán)的過程中不斷推算出后續(xù)元素,不必創(chuàng)建完整的list防泵,從而節(jié)省大量的空間。
yield和next()蝗敢。
7. AOP中裝飾器和OOP中裝飾器對象如何區(qū)分捷泞,如何使用?
裝飾器:設計模式寿谴。經常用于有切面需求的場景锁右,比如插入日志、性能測試讶泰、事務處理等咏瑟。
@語法。返回的是函數痪署。原來的函數func還存在码泞,只不過同名變量func指向了新的函數,調用func()將執(zhí)行新函數狼犯。
作者:知乎用戶
鏈接:https://www.zhihu.com/question/24863332/answer/48376158
來源:知乎
著作權歸作者所有。商業(yè)轉載請聯系作者獲得授權悯森,非商業(yè)轉載請注明出處宋舷。
面向切面編程(AOP是Aspect Oriented Program的首字母縮寫) ,我們知道瓢姻,面向對象的特點是繼承祝蝠、多態(tài)和封裝。而封裝就要求將功能分散到不同的對象中去,這在軟件設計中往往稱為職責分配绎狭。實際上也就是說细溅,讓不同的類設計不同的方法。這樣代碼就分散到一個個的類中去了坟岔。這樣做的好處是降低了代碼的復雜程度谒兄,使類可重用。
但是人們也發(fā)現社付,在分散代碼的同時承疲,也增加了代碼的重復性。什么意思呢鸥咖?比如說燕鸽,我們在兩個類中,可能都需要在每個方法中做日志啼辣。按面向對象的設計方法啊研,我們就必須在兩個類的方法中都加入日志的內容。也許他們是完全相同的鸥拧,但就是因為面向對象的設計讓類與類之間無法聯系党远,而不能將這些重復的代碼統(tǒng)一起來。
也許有人會說富弦,那好辦啊沟娱,我們可以將這段代碼寫在一個獨立的類獨立的方法里,然后再在這兩個類中調用腕柜。但是济似,這樣一來,這兩個類跟我們上面提到的獨立的類就有耦合了盏缤,它的改變會影響這兩個類砰蠢。那么,有沒有什么辦法唉铜,能讓我們在需要的時候台舱,隨意地加入代碼呢?這種在運行時潭流,動態(tài)地將代碼切入到類的指定方法柿赊、指定位置上的編程思想就是面向切面的編程。
一般而言幻枉,我們管切入到指定類指定方法的代碼片段稱為切面碰声,而切入到哪些類、哪些方法則叫切入點熬甫。有了AOP胰挑,我們就可以把幾個類共有的代碼,抽取到一個切片中,等到需要時再切入對象中去瞻颂,從而改變其原有的行為豺谈。
這樣看來,AOP其實只是OOP的補充而已贡这。OOP從橫向上區(qū)分出一個個的類來茬末,而AOP則從縱向上向對象中加入特定的代碼。有了AOP盖矫,OOP變得立體了丽惭。如果加上時間維度,AOP使OOP由原來的二維變?yōu)槿S了辈双,由平面變成立體了责掏。從技術上來說,AOP基本上是通過代理機制實現的湃望。
AOP在編程歷史上可以說是里程碑式的换衬,對OOP編程是一種十分有益的補充。
OOP(object-oriented programming)面向對象編程证芭,特點為繼承瞳浦、多態(tài)、封裝废士。
其中叫潦,封裝即將功能分散到不同的對象中去,即讓不同的類設計不同的方法湃密。不難理解,不同類之間有時會存在一些類似的功能(比如日志)四敞,即封裝分散的同時泛源,增加了代碼的重復性。但是忿危,如果倆個類共同使用一個方法达箍,則增加了耦合性,不符合設計理念铺厨。
什么方法可以讓我們在需要時缎玫,隨意地加入代碼呢?
即解滓,面向切面編程(aspect-oriented programming):在運行時赃磨,動態(tài)地將代碼切入到類的指定方法,指定位置上的編程思想洼裤。
8. python中新式類和老式類的差異
序列:字符串邻辉、列表、元組。
訪問模式:每一個元素可以通過一個指定的偏移量得到值骇。多個元素可以通過切片操作一次得到莹菱。
字符串的實際內容是單引號或者雙引號之間的內容,不包括引號本身吱瘩。
__future__ : 舊版本體驗新特性
字符串前加r道伟,防止字符串轉義。
字符串也可以做為list使碾。
__init__() 構造器方法:創(chuàng)建實例對象蜜徽。
實例對象作為第一個參數(self)被傳遞進去。調用類時部逮,傳進的任何參數都交給了__init__()娜汁。
在__init__方法內部,可以把各種屬性綁定到self兄朋,因為self指向創(chuàng)建的實例本身掐禁。
有關None:Python 里 and、or 的計算規(guī)則是怎樣的颅和?
作用域
__xxx__:特殊變量傅事,可被直接引用,但是有特殊用途峡扩。
_xxx和__xxx:非公開(private)