python 面試題1

標籤:python   面試題   

拿網絡上關於Python的面試題彙總了,給出了自認爲合理的答案,有些題目不錯,可以從中學到點什麼,答案如不妥,請指正……


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

題目:001| 說說你對zen of python的理解,你有什麼辦法看到它?

Python之禪,Python秉承一種獨特的簡潔和可讀行高的語法,以及高度一致的編程模式,符合“大腦思維習慣”,使Python易於學習、理解和記憶。Python同時採用了一條極簡主義的設計理念,瞭解完整的Python哲學理念,可以在任何一個Python交互解釋器中鍵入import this命令,這是Python隱藏的一個彩蛋:描繪了一系列Python設計原則。如今已是Python社區內流行的行話”EIBTI”,明瞭勝於晦澀這條規則的簡稱. 在Python的思維方式中,明瞭勝於晦澀,簡潔勝於複雜。

>>> import this  
The Zen of Python, by Tim Peters  

Beautiful is better than ugly.  
Explicit is better than implicit.  
Simple is better than complex.  
Complex is better than complicated.  
Flat is better than nested.  
Sparse is better than dense.  
Readability counts.  
Special cases aren't special enough to break the rules.  
Although practicality beats purity.  
Errors should never pass silently.  
Unless explicitly silenced.  
In the face of ambiguity, refuse the temptation to guess.  
There should be one-- and preferably only one --obvious way to do it.  
Although that way may not be obvious at first unless you're Dutch.  
Now is better than never.  
Although never is often better than *right* now.  
If the implementation is hard to explain, it's a bad idea.  
If the implementation is easy to explain, it may be a good idea.  
Namespaces are one honking great idea -- let's do more of those!  

題目:002| 說說你對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中的元素計算出總共需要申請的內存空間的大小,一次申請完。 題目:003| 你調試python代碼的方法有哪些?
具體IDE都有調試,比如:IDLE, Eclipse+Pydev都可以設置斷點調試。 
pdb模塊也可以做調試。
還有PyChecker和Pylint
PyChecker是一個python代碼的靜態分析工具,它可以幫助查找python代碼的bug, 會對代碼的複雜度和格式提出警告  
Pylint   是另外一個工具可以進行coding standard檢查。 
題目:004|  你在github上都fork過哪些python庫,列舉一下你經常使用的,每個庫用一句話描述下其功能

http://rogerdudler.github.io/git-guide/index.zh.html    #關於git簡明指南  
http://www.zhihu.com/question/20070065                  #關於git的BBS  
http://www.techug.com/githug-for-designer               #關於github的  
題目:005|  什麼是GIL?
什麼是GIL(Global Interpreter Lock)全局解釋器鎖? 簡單地說就是:
每一個interpreter進程,只能同時僅有一個線程來執行, 獲得相關的鎖, 存取相關的資源.
那麼很容易就會發現,如果一個interpreter進程只能有一個線程來執行, 
多線程的併發則成爲不可能, 即使這幾個線程之間不存在資源的競爭.
從理論上講,我們要儘可能地使程序更加並行, 能夠充分利用多核的功能.
題目:006|  什麼是元類(meta_class)?
元類就是用來創建類的“東西”
詳情操作: http://blog.jobbole.com/21351/
題目:007|  對比一下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循環遍歷出來;  
<dictionary-itemiterator object at 0x00000000026243B8>  
>>> 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中一般取消前者函數
題目:008|  是否遇到過python的模塊間循環引用的問題,如何避免它?

這是代碼結構設計的問題,模塊依賴和類依賴
如果老是覺得碰到循環引用,很可能是模塊的分界線劃錯地方了。可能是把應該在一起的東西硬拆開了,可能是某些職責放錯地方了,可能是應該抽象的東西沒抽象
總之微觀代碼規範可能並不能幫到太多,重要的是更宏觀的劃分模塊的經驗技巧,推薦uml,腦圖,白板等等圖形化的工具先梳理清楚整個系統的總體結構和職責分工

採取辦法,從設計模式上來規避這個問題,比如:
1. 使用 “__all__” 白名單開放接口
2. 儘量避免 import
題目:009|  有用過with statement嗎?它的好處是什麼?

>>> 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語句的導入 題目:010|用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)
題目:011|  Python裏如何生產隨機數
>>> import random
>>> random.random()
0.29495314937268713
>>> random.randint(1,11)
8
>>> random.choice(range(11))
3
題目:012|  Python裏如何反序的迭代一個序列
如果是一個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]
題目:013|  Python中如何定義一個函數

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

lambda x: x **2                   #匿名函數
題目:014|  Python匹配HTML tag的時候,<.*>和<.*?>有什麼區別

import re
s = ‘<html><head><title>Title</title>’
print(re.match(‘<.*>’, s).group())

會返回一個匹配<html><head><title>Title</title>而不是<html>

而

import re
s = ‘<html><head><title>Title</title>’
print(re.match(‘<.*?>’, s).group())

則會返回<html>

<.*>這種匹配稱作貪心匹配 <.*?>稱作非貪心匹配
題目:015|  Python裏面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匹配整個字符串,直到找到一個匹配。題目:016|  Python程序中文輸出問題怎麼解決
在Python3中,對中文進行了全面的支持,但在Python2.x中需要進行相關的設置才能使用中文。否則會出現亂碼。
Python默認採取的ASCII編碼,字母、標點和其他字符只使用一個字節來表示,但對於中文字符來說,一個字節滿足不了需求。
爲了能在計算機中表示所有的中文字符,中文編碼採用兩個字節表示。如果中文編碼和ASCII混合使用的話,就會導致解碼錯誤,從而才生亂碼。
解決辦法:
交互式命令中:一般不會出現亂碼,無需做處理 
py腳本文件中:跨字符集必須做設置,否則亂碼
1. 首先在開頭一句添加:




# coding = utf-8 # 或 # coding = UTF-8 # 或 # -*- coding: utf-8 -*- 2. 其次需將文件保存爲UTF-8的格式! 3. 最後: s.decode('utf-8').encode('gbk')題目:017|  什麼是lambda函數

函數使用:
1. 代碼塊重複,這時候必須考慮到函數,降低程序的冗餘度
2. 代碼塊複雜,這時候必須考慮到函數,降低程序的複雜度
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]
題目:018|  Python裏面如何實現tuple和list的轉換
#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]題目:019|  請寫出一段Python代碼實現刪除一個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]
題目:020|  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)
題目:021|  如何知道一個Python對象的類型
>>> type([]);type('');type(0);type({});type(0.0);type((1,))
<type 'list'>
<type 'str'>
<type 'int'>
<type 'dict'>
<type 'float'>
<type 'tuple'>

題目:022|  Python裏面如何拷貝一個對象

切片S[:]  # 注不能應用於字典
深淺寶貝  # 能應用於所有序列和字典
1. 淺拷貝D.copy()方法
2. 深拷貝deepcopy(D)方法
題目:023|  Python中pass語句的作用是什麼
pass語句什麼也不做,一般作爲佔位符或者創建佔位程序
題目:024|  寫一段程序逐行讀入一個文本文件,並在屏幕上打印出來
f = open(filename)  
while True:  
    line = f.readline()  
    if not line: break  
    print(line)  
f.close()  
題目:025|  如何用Python刪除一個文件
import os
os.remove(filename)
題目:026|  Python代碼得到列表list的交集與差集
>>> list1 = [1, 3, 4, 6]
>>> list2 = [1, 2, 3, 4]
>>> [i for i in list1 if i not in list2]
[6]
>>> [i for i in list1 if i in list2]
[1, 3, 4]
題目:027|  Python是如何進行內存管理的
python內部使用引用計數,來保持追蹤內存中的對象,Python內部記錄了對象有多少個引用,即引用計數,當對象被創建時就創建了一個引用計數,當對象不再需要時,這個對象的引用計數爲0時,它被垃圾回收。所有這些都是自動完成,不需要像C一樣,人工干預,從而提高了程序員的效率和程序的健壯性。
題目:028|  介紹一下Python下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()函數上

題目:029|  Python異常處理介紹一下

程序中出現異常情況時就需要異常處理。比如當你打開一個不存在的文件時。當你的程序中有
一些無效的語句時,Python會提示你有錯誤存在。下面是一個拼寫錯誤的例子,print寫成了Print
下面是異常最常見的幾種角色
1. 錯誤處理
>>>可以在程序代碼中捕捉和相應錯誤,或者忽略已發生的異常。
>>>如果忽略錯誤,PYTHON默認的異常處理行爲將啓動:停止程序,打印錯誤信息。
>>>如果不想啓動這種默認行爲,就用try語句來捕捉異常並從異常中恢復。
2. 事件通知
>>>異常也可用於發出有效狀態的信號,而不需在程序間傳遞結果標誌位。或者刻意對其進行測試
3. 特殊情況處理
>>>有時,發生了某種很罕見的情況,很難調整代碼區處理。通常會在異常處理中處理,從而省去應對特殊情況的代碼
4. 終止行爲
>>>try/finally語句可確保一定會進行需要的結束運算,無論程序是否有異常
5. 非常規控制流程
題目:030|  介紹一下Python中的filter方法
filter就像map,reduce,apply,zip等都是內置函數,用C語言實現,具有速度快,功能強大等

優點。
用於過濾與函數func()不匹配的值, 類似於SQL中select value != 'a'
相當於一個迭代器,調用一個布爾函數func來迭代seq中的每個元素,返回一個是bool_seq返

回爲True的序列
>>>第一個參數: function or None, 函數或None
>>>第二個參數: sequence,序列
題目:031|  介紹一下except的用法和作用
try/except:          捕捉由PYTHON自身或寫程序過程中引發的異常並恢復
except:              捕捉所有其他異常
except name:         只捕捉特定的異常
except name, value:  捕捉異常及格外的數據(實例)
except (name1,name2) 捕捉列出來的異常
except (name1,name2),value: 捕捉任何列出的異常,並取得額外數據
else:                如果沒有引發異常就運行
finally:             總是會運行此處代碼
題目:032|  如何用Python來進行查詢和替換一個文本字符串
>>> words = 'Python is a very funny language!'
>>> words.find('Python')             # 返回的爲0或正數時,爲其索引號
0
>>> words.find('is')
7
>>> words.find('dafa')               # 返回-1表示查找失敗
-1
>>> words.replace('Python', 'Perl')  # replace()替換
'Perl is a very funny language!'
題目:033|  Python如何copy一個文件
import shutil
shutil.copyfile('a.py', 'copy_a.py')

題目:034|  Python判斷當前用戶是否是root

import os
if os.getuid() != 0:    # root賬號的uid=0
    print os.getuid()
    print 'Should run as root account'
else:
    print 'Hello, Root!'
題目:035|  用Python寫一個for循環的例子

for循環可以遍歷序列(列表,字符串,元祖),range()及迭代對象,如xrange()
names = ['Alice', 'Betty', 'Fred', 'Tom']
for index, name in enumerate(names):
    print 'index:',index,'=>', name





# 輸出結果 index: 0 => Alice index: 1 => Betty index: 2 => Fred index: 3 => Tom題目:036|  介紹一下Python中webbrowser的用法
webbrowser模塊提供了一個高級接口來顯示基於Web的文檔,大部分情況下只需要簡單的調用open()方法。

webbrowser定義瞭如下的異常:exception webbrowser.Error, 當瀏覽器控件發生錯誤是會拋出這個異常

webbrowser有以下方法:

webbrowser.open(url[, new=0[, autoraise=1]])

這個方法是在默認的瀏覽器中顯示url, 如果new = 0, 那麼url會在同一個瀏覽器窗口下打開,如果new = 1, 會打開一個新的窗口,如果new = 2, 會打開一個新的tab, 如果autoraise = true, 窗口會自動增長。

webbrowser.open_new(url)
在默認瀏覽器中打開一個新的窗口來顯示url, 否則,在僅有的瀏覽器窗口中打開url

webbrowser.open_new_tab(url)
在默認瀏覽器中當開一個新的tab來顯示url, 否則跟open_new()一樣

webbrowser.get([name]) 根據name返回一個瀏覽器對象,如果name爲空,則返回默認的瀏覽器

webbrowser.register(name, construtor[, instance])
註冊一個名字爲name的瀏覽器,如果這個瀏覽器類型被註冊就可以用get()方法來獲取。
題目:037|  默寫儘可能多的str對象的方法
#方法                                   #描述  
-------------------------------------------------------------------------------------------------  
S.capitalize()                          #返回首字母大寫的字符串的副本  
S.center(width[,fillchar])              #返回一個長度爲max(len(S),width),S居中,兩側fillchar填充  
S.count(sub[,start[,end]])              #計算子字符串sub的出現次數,可將搜索範圍限制爲S[start:end]  
S.decode([encoding[,error]])            #返回使用給定編碼方式的字符串的解碼版本,由error指定錯誤處理方式  
S.endswith(suffix[start[,end]])         #檢查S是否以suffix結尾,可給定[start:end]來選擇匹配的範圍  
S.expandtabs([tabsize])                 #返回字符串的副本,其中tab字符會使用空格進行擴展,可選擇tabsize  
S.find(sun[,start[,end]])               #返回子字符串sub的第一個索引,不存在則爲-1,可選擇搜索範圍  
S.index(sub[,start[,end]])              #返回子字符串sub的第一個索引,不存在則引發ValueError異常.  
S.isalnum()                             #檢查字符串是否由字母或數字字符組成  
S.isalpha()                             #檢查字符串是否由字母字符組成  
S.isdigit()                             #檢查字符串是否由數字字符組成  
S.islower()                             #檢查字符串是否由小寫字母組成  
S.isspace()                             #檢查字符串是否由空格組成  
S.istitle()                             #檢查字符串時候首字母大寫  
S.isupper()                             #檢查字符串是否由大寫字母組成  
S.join(sequence)                        #返回其中sequence的字符串元素由S連接的字符串  
S.ljust(width[,fillchar])               #返回S副本左對齊的字符串,長度max(len(S),W),右側fillchar填充  
S.lower()                               #返回所有字符串都爲小寫的副本  
S.lstrip([char])                        #向左移除所有char,默認移除(空格,tab,\n)  
S.partition(seq)                        #在字符串中搜索seq並返回  
S.replace(old,new[,max])                #將new替換olad,最多可替換max次  
S.rfind(sub[,start[,end]])              #返回sub所在的最後一個索引,不存在則爲-1,可定搜索範圍S[start:end]  
S.rindex(sub[,start[,end]])             #返回sub所在的最後一個索引,不存在則會引發ValueError異常。  
S.rjust(width[,fillchar])               #返回S副本右對齊的字符串,長度max(len(S),W),左側fillchar填充  
S.rpartition(seq)                       #同Partition,但從右側開始查找  
S.rstip([char])                         #向右移除所有char,默認移除(空格,tab,\n)  
S.rsplit(sep[,maxsplit])                #同split,但是使用maxsplit時是從右往左進行計數  
S.split(sep[,maxsplit])                 #使用sep做爲分割符,可使用maxsplit指定最大切分數  
S.zfill(width)                          #在S的左側以0填充width個字符  
S.upper()                               #返回S的副本,所有字符大寫  
S.splitlines([keepends])                #返回S中所有行的列表,可選擇是否包括換行符  
S.startswith(prefix[,start[,end]])      #檢查S是否以prefix開始,可用[start,end]來定義範圍  
S.strip([chars])                        #移除所有字符串中含chars的字符,默認移除(空格,tab,\n)  
S.swapcase()                            #返回S的副本,所有大小寫交換  
S.title()                               #返回S的副本,所有單詞以大寫字母開頭  
S.translate(table[,deletechars])        #返回S的副本,所有字符都使用table進行的轉換,可選擇刪除出現在deletechars中的所有字符  
題目:038|  現在有一個dict對象adict,裏面包含了一百萬個元素,查找其中的某個元素的平均需要多少次比較

O(1)  哈希字典,快速查找,鍵值映射,鍵唯一!
題目:039|  有一個list對象alist,裏面的所有元素都是字符串,編寫一個函數對它實現一個大小寫無關的排序

words = ['This','is','a','dog','!']
words.sort(key=lambda x:x.lower())
print words




#輸出結果 >>> ['!', 'a', 'dog', 'is', 'This']題目:040|  有一個排好序地list對象alist,查找其中是否有某元素a

alist = ['a','s','d','f']

try:
    alist.index('a')
    print 'Find it.'
except ValueError:
    print 'Not Found.'
題目:041|  請用Python寫一個獲取用戶輸入數字,並根據數字大小輸出不同信息的腳本

num = input('Enter number: ')

if num > 100:
    print 'The number is over 100'
elif 0 < num <= 100:
    print 'The number is between 0~100'
elif num < 0:
    print 'The number is negative.'
else:
    print 'Not a number'
題目:042|  打亂一個排好序的list對象alist

# random模塊中的shuffle(洗牌函數)
import random
alist = [1, 2, 3, 4]
random.shuffle(alist)   
print alist
題目:043|  有二維的list對象alist,假定其中的所有元素都具有相同的長度,寫一段程序根據元素的第二個元素排序

def sort_lists(lists, sord, idx):
    if sord == 'desc':
        lists.sort(key=lambda x:x[idx], reverse=True)
    else:
        lists.sort(key=lambda x:x[idx])
    return lists
lists = [['cd','ab'],['ef','ac']]
sort_lists(lists,'desc',1)
print lists





# 輸出結果 >>> [['ef', 'ac'], ['cd', 'ab']]題目:044|  inspect模塊有什麼用

inspect模塊提供了一系列函數用於幫助使用自省。

檢查對象類型
is{module|class|function|method|builtin}(obj): 檢查對象是否爲模塊、類、函數、方法、內建函數或方法。
isroutine(obj): 用於檢查對象是否爲函數、方法、內建函數或方法等等可調用類型。

獲取對象信息
getmembers(object[, predicate]): 這個方法是dir()的擴展版,它會將dir()找到的名字對應的屬性一併返回。
getmodule(object): 它返回object的定義所在的模塊對象。
get{file|sourcefile}(object): 獲取object的定義所在的模塊的文件名|源代碼文件名(如果沒有則返回None)。
get{source|sourcelines}(object): 獲取object的定義的源代碼,以字符串|字符串列表返回。
getargspec(func): 僅用於方法,獲取方法聲明的參數,返回元組,分別是(普通參數名的列表, *參數名, **參數名, 默認值元組)。 
題目:045|  Python處理命令行參數示例代碼

# 最簡單、最原始的方法就是手動解析了
import sys
for arg in sys.argv[1:]:
    print(arg)

題目:045|  介紹一下Python getopt模塊

# getopt模塊是原來的命令行選項解析器,支持UNIX函數getopt()建立的約定。




# 它會解析一個參數序列,如sys.argv,並返回一個元祖序列和一個非選項參數序列。 # 目前支持的選項語法包括短格式和長格式選項:-a, -bval, -b val, --noarg, --witharg=val, --witharg val。 # 如果只是簡單的命令行解析,getopt還是不錯的選擇。一個例子如下 import sys import getopt try: options, remainder = getopt.getopt(sys.argv[1:], 'o:v', ['output=', 'verbose', 'version=',]) except getopt.GetoptError as err: print 'ERROR:', err sys.exit(1) 總結下getopt的特點:1. getopt是從前到後解析 2. getopt不檢查額外參數的合法性,需要自行檢查 3. 短命令行和長命令行是分開解析的</span>



































Python面試題彙總

標籤:python   面試題   

原文地址:http://blog.csdn.net/jerry_1126/article/details/44023949

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章