python面試題大全(一)
最近開始整理python的資料,博主建立了一個qq群,希望給大家提供一個交流的同平臺 938587844 。
1. (1)python下多線程的限制以及多進程中傳遞參數的方式
python多線程有個全局解釋器鎖(global interpreter lock),這個鎖的意思是任一時間只能有一個線程使用解釋器,跟單cpu跑多個程序一個意思,大家都是輪著用的,這叫“並發”,不是“並行”。
多進程間共享數據,可以使用 multiprocessing.Value 和 multiprocessing.Array.
(2)python多線程與多進程的區別
在UNIX平臺上,當某個進程終結之後,該進程需要被其父進程調用wait,否則進程成為僵屍進程(Zombie)。所以,有必要對每個Process對象調用join()方法 (實際上等同於wait)。對於多線程來說,由於只有一個進程,所以不存在此必要性。
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入門”類相關信息。】
python面試題大全(一)