1 單引號漠畜,雙引號倦卖,三引號的區(qū)別
題目:分別闡述3種引號用的場景和區(qū)別
1. 單引號和雙引號主要用來表示字符串
比如:
單引號:'python'
雙引號:"python"
2. 三引號
三單引號:'''python ''',也可以表示字符串一般用來輸入多行文本,或者用于大段的注釋
三雙引號:"""python""",一般用在類里面,用來注釋類,這樣省的寫文檔,直接用類的對象__doc__
訪問獲得文檔
區(qū)別:
若你的字符串里面本身包含單引號,必須用雙引號
比如:"can't find the log\n"
2 Python的函數(shù)參數(shù)傳遞
題目:舉例說明Python函數(shù)參數(shù)傳遞的幾種形式窗悯,并說明函數(shù)傳參是值傳遞還是引用傳遞
1. Python的參數(shù)傳遞有:
- 位置參數(shù)
- 默認(rèn)參數(shù)
- 可變參數(shù)
- 關(guān)鍵字參數(shù)
2. 函數(shù)的傳值到底是值傳遞還是引用傳遞,要分情況:
-
不可變參數(shù)用值傳遞:
像整數(shù)和字符串這樣的不可變對象,是通過拷貝進(jìn)行傳遞的馁启,因為你無論如何都不可能在原處改變不可變對象 -
可變參數(shù)用引用傳遞:
比如像列表,字典這樣的對象是通過引用傳遞,和C語言里面的用指針傳遞數(shù)組很相似惯疙,可變對象能在函數(shù)內(nèi)部改變.
3. 具體例子:
#整數(shù)為不可變對象翠勉,用值傳遞
a = 1
def fun(a):
a = 2
fun(a)
print a # 1
#列表為可變對象,用引用傳遞
a = []
def fun(a):
a.append(1)
fun(a)
print a # [1]
3 lambda函數(shù)
題目:舉例說明lambda的用法霉颠,并說明用lambda的優(yōu)點
1. lambda的用法
lambda是匿名函數(shù)对碌,用法如下: lambda x,y : x+y
, 冒號前的x
,y
為自變量,冒號后x+y
為具體運算蒿偎。
2. lambda的優(yōu)點:
lambda能和def做同樣種類的工作朽们,特別是對于那些邏輯簡單的函數(shù),直接用lambda會更簡潔诉位,而且省去取函數(shù)名的麻煩(給函數(shù)取名是個技術(shù)活)
4 字符串格式化:%和.format的區(qū)別
題目:說明字符串格式化方法%和.format的區(qū)別
1. 字符串格式化: .format
字符串的format函數(shù)非常靈活骑脱,很強大,可以接受的參數(shù)不限個數(shù),并且位置可以不按順序苍糠,而且有較為強大的格式限定符(比如:填充叁丧,對齊,精度等)
具體用法如下,字符串中花括號 {}
的部分會被format
傳入的參數(shù)替代岳瞭,傳入的值可以是字符串拥娄,也可以是數(shù)字或者別的對象。
>>> '{} {} {}'.format('a', 'b', 'c')
'a b c'
可以用數(shù)字指定傳入?yún)?shù)的相對位置:
>>> '{2} {1} {0}'.format('a', 'b', 'c')
'c b a'
還可以指定傳入?yún)?shù)的名稱:
>>> '{color} {n} {x}'.format(n=10, x=1.5, color='blue')
'blue 10 1.5'
可以在一起混用:
>>> '{color} {0} {x} {1}'.format(10, 'foo', x = 1.5, color='blue')
'blue 10 1.5 foo'
可以用{<field name>:<format>}
指定格式:
>>> from math import pi
>>> '{0:10} {1:10d} {2:10.2f}'.format('foo', 5, 2 * pi)
'foo 5 6.28'
2. 字符串格式化: %
舊式的 %
方法進(jìn)行格式化寝优,具體規(guī)則與C中相同条舔。
>>> s = "some numbers:"
>>> x = 1.34
>>> y = 2
>>> # 用百分號隔開,括號括起來
... t = "%s %f, %d" % (s, x, y)
>>> t
'some numbers: 1.340000, 2'
5 寫函數(shù): 輸入一個字符串, 返回倒序排列的結(jié)果
題目:輸入: string_reverse(‘a(chǎn)bcdef’), 返回: ‘fedcba’,寫出你能想到的多種方法
1. 利用字符串本身的翻轉(zhuǎn)
def string_reverse1(text='abcdef'):
return text[::-1]
2. 把字符串變成列表乏矾,用列表的reverse函數(shù)
def string_reverse2(text='abcdef'):
lst = list(text)
lst.reverse()
return ''.join(lst)
3. 新建一個列表孟抗,從后往前取
def string_reverse3(text='abcdef'):
lst = []
for i in range(len(text)-1, -1, -1):
lst.append(text[i])
return ''.join(lst)
4. 利用雙向列表deque中的extendleft函數(shù)
from collections import deque
def string_reverse4(text='abcdef'):
d = deque()
d.extendleft(text)
return ''.join(d)
5. 遞歸
def string_reverse5(text='abcdef'):
if len(text) <= 1:
return text
else:
return string_reverse5(text[1:])+text[0]
6 按升序合并兩個list, 并去除重復(fù)的元素
題目:按升序合并如下兩個list, 并去除重復(fù)的元素
list1 = [2, 3, 8, 4, 9, 5, 6]
list2 = [5, 6, 10, 17, 11, 2]
1. 用set方法(最簡單)
list3 = list1 + list2
print(sorted(list(set(list3))))
2. 遞歸方法(略)
7 Pythonic的代碼
題目:寫出你認(rèn)為最Pythonic的代碼
Pythonic編程風(fēng)格是Python追求的一種風(fēng)格,精髓就是追求直觀钻心,簡潔而容易讀.
1. 交互變量
- 非pythonic
temp = a
a = b
b = temp
- pythonic
a, b = b, a
2. 判斷其值真假
name = 'Tim'
langs = ['AS3', 'Lua', 'C']
info = {'name': 'Tim', 'sex': 'Male', 'age':23 }
- 非pythonic
if name != '' and len(langs)>0 and info !={}:
print('All True!')
- pythonic
if name and langs and info:
print('All True!')
3. 列表推導(dǎo)式
[x for x in range(1,100) if x%2==0]
4. zip創(chuàng)建鍵值對
keys = ['Name', 'Sex', 'Age']
values = ['Jack', 'Male', 23]
dict(zip(keys,values))
8 range 和 xrange
題目:說明range和xrange的區(qū)別
xrange用法與 range 都在循環(huán)時使用且用法相同凄硼,所不同的是xrange生成的不是一個list對象,而是一個生成器捷沸。因此要生成很大的數(shù)字序列的時候摊沉,用xrange會比range性能優(yōu)很多,因為不需要一上來就開辟一塊很大的內(nèi)存空間痒给。
9 迭代器和生成器
題目:將列表生成式中[]改成() 之后數(shù)據(jù)結(jié)構(gòu)是否改變
答:是说墨,從列表變?yōu)樯善鳌?/p>
通過列表生成式,可以直接創(chuàng)建一個列表苍柏。但是尼斧,受到內(nèi)存限制,列表容量肯定是有限的试吁。而且棺棵,創(chuàng)建一個包含百萬元素的列表,不僅是占用很大的內(nèi)存空間,如:我們只需要訪問前面的幾個元素烛恤,后面大部分元素所占的空間都是浪費的母怜。因此,沒有必要創(chuàng)建完整的列表(節(jié)省大量內(nèi)存空間)缚柏。在Python中苹熏,我們可以采用生成器:邊循環(huán),邊計算的機制—>generator
10 *args 和 **kwargs
題目:說明*args 和 **kwargs的使用
1. *args 的使用
當(dāng)你不確定你的函數(shù)里將要傳遞多少參數(shù)時你可以用*args.例如,它可以傳遞任意數(shù)量的參數(shù):
>>> def print_everything(*args):
for count, thing in enumerate(args):
... print '{0}. {1}'.format(count, thing)
...
>>> print_everything('apple', 'banana', 'cabbage')
0. apple
1. banana
2. cabbage
2. **kwargs 的使用
**kwargs允許你使用沒有事先定義的參數(shù)名:
>>> def table_things(**kwargs):
... for name, value in kwargs.items():
... print '{0} = {1}'.format(name, value)
...
>>> table_things(apple = 'fruit', cabbage = 'vegetable')
cabbage = vegetable
apple = fruit
3. 其他
- *args和**kwargs可以同時在函數(shù)的定義中,但是*args必須在**kwargs前面.
- 任何函數(shù)都可以用 universal_func(*args, **kwargs)表達(dá)
- 當(dāng)調(diào)用函數(shù)時你也可以用*和**語法
def print_three_things(a, b, c):
print('a = {0}, b = {1}, c = {2}'.format(a,b,c))
mylist = ['aardvark', 'baboon', 'cat']
print_three_things(*mylist)
"""
a = aardvark, b = baboon, c = cat
"""
11 Python垃圾回收機制
題目:描述Python的垃圾回收機制
Python GC主要使用引用計數(shù)(reference counting)來跟蹤和回收垃圾币喧。在引用計數(shù)的基礎(chǔ)上柜裸,通過“標(biāo)記-清除”(mark and sweep)解決容器對象可能產(chǎn)生的循環(huán)引用問題,通過“分代回收”(generation collection)以空間換時間的方法提高垃圾回收效率粱锐。
1. 引用計數(shù)
PyObject是每個對象必有的內(nèi)容疙挺,其中ob_refcnt就是做為引用計數(shù)。當(dāng)一個對象有新的引用時怜浅,它的ob_refcnt就會增加铐然,當(dāng)引用它的對象被刪除,它的ob_refcnt就會減少.引用計數(shù)為0時恶座,該對象生命就結(jié)束了搀暑。
- 優(yōu)點:簡單、實時
- 缺點:維護(hù)引用計數(shù)消耗資源跨琳、循環(huán)引用
2. 標(biāo)記-清除機制
基本思路是先按需分配自点,等到?jīng)]有空閑內(nèi)存的時候從寄存器和程序棧上的引用出發(fā),遍歷以對象為節(jié)點脉让、以引用為邊構(gòu)成的圖桂敛,把所有可以訪問到的對象打上標(biāo)記,然后清掃一遍內(nèi)存空間溅潜,把所有沒標(biāo)記的對象釋放术唬。
3. 分代回收
分代回收的整體思想是:將系統(tǒng)中的所有內(nèi)存塊根據(jù)其存活時間劃分為不同的集合,每個集合就成為一個“代”滚澜,垃圾收集頻率隨著“代”的存活時間的增大而減小粗仓,存活時間通常利用經(jīng)過幾次垃圾回收來度量。
Python默認(rèn)定義了三代對象集合设捐,索引數(shù)越大借浊,對象存活時間越長。
舉例: 當(dāng)某些內(nèi)存塊M經(jīng)過了3次垃圾收集的清洗之后還存活時萝招,我們就將內(nèi)存塊M劃到一個集合A中去蚂斤,而新分配的內(nèi)存都劃分到集合B中去。當(dāng)垃圾收集開始工作時即寒,大多數(shù)情況都只對集合B進(jìn)行垃圾回收橡淆,而對集合A進(jìn)行垃圾回收要隔相當(dāng)長一段時間后才進(jìn)行,這就使得垃圾收集機制需要處理的內(nèi)存少了母赵,效率自然就提高了逸爵。在這個過程中,集合B中的某些內(nèi)存塊由于存活時間長而會被轉(zhuǎn)移到集合A中凹嘲,當(dāng)然师倔,集合A中實際上也存在一些垃圾,這些垃圾的回收會因為這種分代的機制而被延遲周蹭。