python面試題大全(一)

python面試題大全(一)

最近開始整理python的資料,博主建立了一個qq羣,希望給大家提供一個交流的同平臺 938587844 。

1. (1)python下多線程的限制以及多進程中傳遞參數的方式

python多線程有個全局解釋器鎖(global interpreter lock),這個鎖的意思是任一時間只能有一個線程使用解釋器,跟單cpu跑多個程序一個意思,大家都是輪着用的,這叫“併發”,不是“並行”。
多進程間共享數據,可以使用 multiprocessing.Value 和 multiprocessing.Array.

(2)python多線程與多進程的區別  
在UNIX平臺上,當某個進程終結之後,該進程需要被其父進程調用wait,否則進程成爲殭屍進程(Zombie)。所以,有必要對每個Process對象調用join()方法 (實際上等同於wait)。對於多線程來說,由於只有一個進程,所以不存在此必要性。
多進程應該避免共享資源。在多線程中,我們可以比較容易地共享資源,比如使用全局變量或者傳遞參數。在多進程情況下,由於每個進程有自己獨立的內存空間,以上方法並不合適。此時我們可以通過共享內存和Manager的方法來共享資源。但這樣做提高了程序的複雜度,並因爲同步的需要而降低了程序的效率。

2.Python是如何進行內存管理的?

Python引用了一個內存池(memory pool)機制,即Pymalloc機制(malloc:n.分配內存),用於管理對小塊內存的申請和釋放
內存池(memory pool)的概念
當 創建大量消耗小內存的對象時,頻繁調用new/malloc會導致大量的內存碎片,致使效率降低。內存池的概念就是預先在內存中申請一定數量的,大小相等 的內存塊留作備用,當有新的內存需求時,就先從內存池中分配內存給這個需求,不夠了之後再申請新的內存。這樣做最顯著的優勢就是能夠減少內存碎片,提升效率。
內存池的實現方式有很多,性能和適用範圍也不一樣。
python中的內存管理機制——Pymalloc
python中的內存管理機制都有兩套實現,一套是針對小對象,就是大小小於256bits時,pymalloc會在內存池中申請內存空間;當大於256bits,則會直接執行new/malloc的行爲來申請內存空間。
關於釋放內存方面,當一個對象的引用計數變爲0時,python就會調用它的析構函數。在析構時,也採用了內存池機制,從內存池來的內存會被歸還到內存池中,以避免頻繁地釋放動作。

3.什麼是lambda函數?它有什麼好處?

lambda 函數是一個可以接收任意多個參數(包括可選參數)並且返回單個表達式值的函數。 lambda 函數不能包含命令,它們所包含的表達式不能超過一個。不要試圖向lambda 函數中塞入太多的東西;如果你需要更復雜的東西,應該定義一個普通函數,然後想讓它多長就多長。

4.如何用Python輸出一個Fibonacci數列?

a,b = 0, 1
while b<100:
    print (b)
    a;b = b;a+b

5.介紹一下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()方法來獲取。

6.解釋一下python的and-or語法

與C表達式 bool ? a : b類似,但是bool and a or b,當 a 爲假時,不會象C表達式 bool ? a : b 一樣工作
應該將 and-or 技巧封裝成一個函數:

def choose(bool, a, b):
    return (bool and [a] or [b])[0]

因爲 [a] 是一個非空列表,它永遠不會爲假。甚至 a 是 0 或 '' 或其它假值,列表[a]爲真,因爲它有一個元素。

7.how do I iterate over a sequence in reverse order

for x in reversed(sequence):
    ... # do something with x..

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

for i in range(len(sequence)-1, -1, -1):
    x = sequence[i]
    <do something with x>

8.Python是如何進行類型轉換的?

最近開始整理python的資料,博主建立了一個qq羣,希望給大家提供一個交流的同平臺 938587844 。

函數                      描述
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 轉換爲一個列表
chr(x )                 將一個整數轉換爲一個字符
unichr(x )              將一個整數轉換爲Unicode字符
ord(x )                 將一個字符轉換爲它的整數值
hex(x )                 將一個整數轉換爲一個十六進制字符串
oct(x )                 將一個整數轉換爲一個八進制字符串

9.Python裏面如何實現tuple和list的轉換?

>>> l = tuple(iplist)
>>> print l
('217.169.209.2:6666', '192.227.139.106:7808', '110.4.12.170:83', '69.197.132.80:7808', '205.164.41.101:3128', '63.141.249.37:8089', '27.34.142.47:9090')
>>> t = list(l)
>>> print t
['217.169.209.2:6666', '192.227.139.106:7808', '110.4.12.170:83', '69.197.132.80:7808', '205.164.41.101:3128', '63.141.249.37:8089', '27.34.142.47:9090']

10.請寫出一段Python代碼實現刪除一個list裏面的重複元素

>>> l = [1,1,2,3,4,5,4]
>>> list(set(l))
[1, 2, 3, 4, 5]
或者
d = {}
for x in mylist:
    d[x] = 1
mylist = list(d.keys())

11.Python如何實現單例模式?其他23種設計模式python如何實現?

#使用__metaclass__(元類)的高級python用法  
class Singleton2(type):  
    def __init__(cls, name, bases, dict):  
        super(Singleton2, cls).__init__(name, bases, dict)  
        cls._instance = None  
    def __call__(cls, *args, **kw):  
        if cls._instance is None:  
            cls._instance = super(Singleton2, cls).__call__(*args, **kw)  
        return cls._instance  

class MyClass3(object):  
    __metaclass__ = Singleton2  

one = MyClass3()  
two = MyClass3()  

two.a = 3  
print one.a  
#3  
print id(one)  
#31495472  
print id(two)  
#31495472  
print one == two  
#True  
print one is two  
#True
#使用裝飾器(decorator),  
#這是一種更pythonic,更elegant的方法,  
#單例類本身根本不知道自己是單例的,因爲他本身(自己的代碼)並不是單例的  
def singleton(cls, *args, **kw):  
    instances = {}  
    def _singleton():  
        if cls not in instances:  
            instances[cls] = cls(*args, **kw)  
        return instances[cls]  
    return _singleton  

@singleton  
class MyClass4(object):  
    a = 1  
    def __init__(self, x=0):  
        self.x = x  

one = MyClass4()  
two = MyClass4()  

two.a = 3  
print one.a  
#3  
print id(one)  
#29660784  
print id(two)  
#29660784  
print one == two  
#True  
print one is two  
#True  
one.x = 1  
print one.x  
#1  
print two.x  
#1

12.Python裏面如何拷貝一個對象?

標準庫中的copy模塊提供了兩個方法來實現拷貝.一個方法是copy,它返回和參數包含內容一樣的對象.
使用deepcopy方法,對象中的屬性也被複制。

13.介紹一下except的用法和作用?

Python的except用來捕獲所有異常,因爲Python裏面的每次錯誤都會拋出一個異常,所以每個程序的錯誤都被當作一個運行時錯誤。

14.Python中pass語句的作用是什麼?

pass語句什麼也不做,一般作爲佔位符或者創建佔位程序,pass語句不會執行任何操作

15.如何知道一個python對象的類型?

type()

16.介紹一下Python下range()函數的用法?

range(start, stop[, step])

17.如何用Python來進行查詢和替換一個文本字符串?

可以使用sub()方法來進行查詢和替換,sub方法的格式爲:sub(replacement, string[, count=0])
replacement是被替換成的文本
string是需要被替換的文本
count是一個可選參數,指最大被替換的數量

18.Python裏面search()和match()的區別?

match()函數只檢測RE是不是在string的開始位置匹配,search()會掃描整個string查找匹配, 也就是說match()只有在0位置匹配成功的話纔有返回,如果不是開始位置匹配成功的話,match()就返回none

19.用Python匹配HTML tag的時候,<.>和<.?>有什麼區別?

前者是貪婪匹配,會從頭到尾匹配 <a>xyz</a>,而後者是非貪婪匹配,只匹配到第一個 >。

20.Python裏面如何生成隨機數?

import random
random.random()

它會返回一個隨機的0和1之間的浮點數

21.如何用Python來發送郵件?

python實現發送和接收郵件功能主要用到poplib和smtplib模塊。

poplib用於接收郵件,而smtplib負責發送郵件。

代碼如下:

#! /usr/bin/env python
#coding=utf-8
import sys 
import time 
import poplib 
import smtplib 
#郵件發送函數
def send_mail(): 
     try: 
        handle = smtplib.SMTP('smtp.126.com',25) 
        handle.login('[email protected]','**********') 
        msg = 'To: [email protected]\r\nFrom:[email protected]\r\nSubject:hello\r\n'
        handle.sendmail('[email protected]','[email protected]',msg) 
        handle.close() 
        return 1
    except: 
        return 0
#郵件接收函數
def accpet_mail(): 
    try: 
        p=poplib.POP3('pop.126.com') 
        p.user('[email protected]') 
        p.pass_('**********') 
        ret = p.stat() #返回一個元組:(郵件數,郵件尺寸) 
       #p.retr('郵件號碼')方法返回一個元組:(狀態信息,郵件,郵件尺寸)   
    except poplib.error_proto,e: 
        print "Login failed:",e 
        sys.exit(1)

#運行當前文件時,執行sendmail和accpet_mail函數
if __name__ == "__main__": 
    send_mail() 
    accpet_mail()

【搜索圓方圓,獲得“python教程”,“python下載”,“python入門”類相關信息。】

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