天天看點

python常問面試題_python常見面試題

pythonic 簡潔、靈活、可讀性強

#交換兩個變量值

a,b = b,a

#去掉list中的重複元素

old_list = [1,1,1,3,4]

new_list = list(set(old_list))

#翻轉一個字元串

s = 'abcde'

ss = s[::-1]

#用兩個元素之間有對應關系的list構造一個dict

names = ['jianpx', 'yue']

ages = [23, 40]

m = dict(zip(names,ages))

#将數量較多的字元串相連,如何效率較高,為什麼

fruits = ['apple', 'banana']

result = ''.join(fruits)

#python字元串效率問題之一就是在連接配接字元串的時候使用‘+’号,例如 s = ‘s1’ + ‘s2’ + ‘s3’ + ...+’sN’,總共将N個字元串連接配接起來, 但是使用+号的話,python需要申請N-1次記憶體空間, 然後進行字元串拷貝。原因是字元串對象PyStringObject在python當中是不可變 對象,是以每當需要合并兩個字元串的時候,就要重新申請一個新的記憶體空間 (大小為兩個字元串長度之和)來給這個合并之後的新字元串,然後進行拷貝。 是以用+号效率非常低。建議在連接配接字元串的時候使用字元串本身的方法 join(list),這個方法能提高效率,原因是它隻是申請了一次記憶體空間, 因為它可以周遊list中的元素計算出總共需要申請的記憶體空間的大小,一次申請完。

python調試工具

PyChecker是一個python代碼的靜态分析工具,它可以幫助查找python代碼的bug, 會對代碼的複雜度和格式提出警告

Pylint 是另外一個工具可以進行coding standard檢查。

GIL

什麼是GIL(Global Interpreter Lock)全局解釋器鎖? 簡單地說就是:

每一個interpreter程序,隻能同時僅有一個線程來執行, 獲得相關的鎖, 存取相關的資源.

那麼很容易就會發現,如果一個interpreter程序隻能有一個線程來執行,

多線程的并發則成為不可能, 即使這幾個線程之間不存在資源的競争.

從理論上講,我們要盡可能地使程式更加并行, 能夠充分利用多核的功能.

dict中的items和iteritems

>>> D = {'a':1,'b':2,'c':3,'d':4}

>>> D.items() #一次性取出所有

[('a', 1), ('c', 3), ('b', 2), ('d', 4)]

>>> D.iteritems() #疊代對象,每次取出一個。用for循環周遊出來;

>>> for i in D.iteritems():

print i,

('a', 1) ('c', 3) ('b', 2) ('d', 4)

>>> for k,v in D.iteritems():

print k,

a c b d

總結:

1.一般iteritems()疊代的辦法比items()要快,特别是資料庫比較大時。

2.在Python3中一般取消前者函數

with statements

>>> with open('text.txt') as myfile:

while True:

line = myfile.readline()

if not line:

break

print line,

with語句使用所謂的上下文管理器對代碼塊進行包裝,允許上下文管理器實作一些設定和清理操作。

例如:檔案可以作為上下文管理器使用,它們可以關閉自身作為清理的一部分。

NOTE:在PYTHON2.5中,需要使用from __future__ import with_statement進行with語句的導入

python生成制定長度的斐波那契數列

def fibs(x):

result = [0, 1]

for index in range(x-2):

result.append(result[-2]+result[-1])

return result

if __name__=='__main__':

num = input('Enter one number: ')

print fibs(num)

python生成随機數

>>> import random

>>> random.random()

0.29495314937268713

>>> random.randint(1,11)

8

>>> random.choice(range(11))

3

反序疊代一個序列

如果是一個list, 最快的解決方案是:

list.reverse()

try:

for x in list:

“do something with x”

finally:

list.reverse()

如果不是list, 最通用但是稍慢的解決方案是:

for i in range(len(sequence)-1, -1, -1):

x = sequence[i]

如何定義一個函數

def func(arg, *args, **kwagrs): #普通函數

func_body

return

lambda x: x **2 #匿名函數

<.*?> 和<.*>在正則比對中的含義

import re

s = ‘

Title’

print(re.match(‘<.*>’, s).group())

會傳回一個比對

Title而不是

import re

s = ‘

Title’

print(re.match(‘<.*?>’, s).group())

則會傳回

<.*>這種比對稱作貪心比對 <.*?>稱作非貪心比對

search與match的差別

>>> import re

>>> re.match(r'python','Programing Python, should be pythonic')

>>> obj1 = re.match(r'python','Programing Python, should be pythonic') #傳回None

>>> obj2 = re.search(r'python','Programing Python, should be pythonic') #找到pythonic

>>> obj2.group()

'python'

#re.match隻比對字元串的開始,如果字元串開始不符合正規表達式,則比對失敗,函數傳回None;

#re.search比對整個字元串,直到找到一個比對。

中文亂碼問題

在Python3中,對中文進行了全面的支援,但在Python2.x中需要進行相關的設定才能使用中文。否則會出現亂碼。

Python預設采取的ASCII編碼,字母、标點和其他字元隻使用一個位元組來表示,但對于中文字元來說,一個位元組滿足不了需求。

為了能在計算機中表示所有的中文字元,中文編碼采用兩個位元組表示。如果中文編碼和ASCII混合使用的話,就會導緻解碼錯誤,進而才生亂碼。

解決辦法:

互動式指令中:一般不會出現亂碼,無需做處理

py腳本檔案中:跨字元集必須做設定,否則亂碼

首先在開頭一句添加:

# coding = utf-8

# 或

# coding = UTF-8

# 或

# -*- coding: utf-8 -*-

其次需将檔案儲存為UTF-8的格式!

最後: s.decode('utf-8').encode('gbk')

lambda函數,本執行個體實作了求素數

函數使用:

代碼塊重複,這時候必須考慮到函數,降低程式的備援度

代碼塊複雜,這時候必須考慮到函數,降低程式的複雜度

Python有兩種函數,一種是def定義,一種是lambda函數()

當程式代碼很短,且該函數隻使用一次,為了程式的簡潔,及節省變量記憶體占用空間,引入了匿名函數這個概念

>>> nums = range(2,20)

>>> for i in nums:

nums = filter(lambda x:x==i or x % i,nums)

>>> nums

[2, 3, 5, 7, 11, 13, 17, 19]

list和tuple之間的轉換

#From list to Tuple

tuple(a_list)

#From Tuple to List

def to_list(t):

return [i if not isinstance(i,tuple) else to_list(i) for i in t]

删除list中的重複元素

>>> L1 = [4,1,3,2,3,5,1]

>>> L2 = []

>>> [L2.append(i) for i in L1 if i not in L2]

>>> print L2

[4, 1, 3, 2, 5]

python中的類型轉換

>>> int('1234') # 将數字型字元串轉為整形

1234

>>> float(12) # 将整形或數字字元轉為浮點型

12.0

>>> str(98) # 将其他類型轉為字元串型

'98'

>>> list('abcd') # 将其他類型轉為清單類型

['a', 'b', 'c', 'd']

>>> dict.fromkeys(['name','age']) # 将其他類型轉為字典類型

{'age': None, 'name': None}

>>> tuple([1, 2, 3, 4]) # 将其他類型轉為元祖類型

(1, 2, 3, 4)

詳細類型轉換

函數 描述

int(x [,base]) 将x轉換為一個整數

long(x [,base] ) 将x轉換為一個長整數

float(x) 将x轉換到一個浮點數

complex(real [,imag]) 建立一個複數

str(x) 将對象 x 轉換為字元串

repr(x) 将對象 x 轉換為表達式字元串

eval(str) 用來計算在字元串中的有效Python表達式,并傳回一個對象

tuple(s) 将序列 s 轉換為一個元組

list(s) 将序列 s 轉換為一個清單

set(s) 轉換為可變集合

dict(d) 建立一個字典。d 必須是一個序列 (key,value)元組。

frozenset(s) 轉換為不可變集合

chr(x) 将一個整數轉換為一個字元

unichr(x) 将一個整數轉換為Unicode字元

ord(x) 将一個字元轉換為它的整數值

hex(x) 将一個整數轉換為一個十六進制字元串

oct(x) 将一個整數轉換為一個八進制字元串

擷取python對象類型

>>> type([]);type('');type(0);type({});type(0.0);type((1,))

copy一個對象

切片S[:] # 注不能應用于字典

深淺寶貝 # 能應用于所有序列和字典

淺拷貝D.copy()方法

深拷貝deepcopy(D)方法

python如何實作記憶體管理

python内部使用引用計數,來保持追蹤記憶體中的對象,Python内部記錄了對象有多少個引用,即引用計數,當對象被建立時就建立了一個引用計數,當對象不再需要時,這個對象的引用計數為0時,它被垃圾回收。所有這些都是自動完成,不需要像C一樣,人工幹預,進而提高了程式員的效率和程式的健壯性。

range函數的用法

>>> range(10)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> range(1, 10)

[1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> range(0, 9, 2)

[0, 2, 4, 6, 8]

>>> range(99,0,-10)

[99, 89, 79, 69, 59, 49, 39, 29, 19, 9]

相差別的是xrange(),每次隻取出一個疊代對象,如果是資料量比較大時,效率較高

在Python3中,沒有xrange()函數,其功能放在了range()函數上

異常處理的作用

程式中出現異常情況時就需要異常處理。比如當你打開一個不存在的檔案時。當你的程式中有

一些無效的語句時,Python會提示你有錯誤存在。下面是一個拼寫錯誤的例子,print寫成了Print

下面是異常最常見的幾種角色

錯誤處理

>>>可以在程式代碼中捕捉和相應錯誤,或者忽略已發生的異常。

>>>如果忽略錯誤,PYTHON預設的異常處理行為将啟動:停止程式,列印錯誤資訊。

>>>如果不想啟動這種預設行為,就用try語句來捕捉異常并從異常中恢複。

事件通知

>>>異常也可用于發出有效狀态的信号,而不需在程式間傳遞結果标志位。或者刻意對其進行測試

特殊情況處理

>>>有時,發生了某種很罕見的情況,很難調整代碼區處理。通常會在異常進行中處理,進而省去應對特殊情況的代碼

終止行為

>>>try/finally語句可確定一定會進行需要的結束運算,無論程式是否有異常

非正常控制流程