您好,登錄后才能下訂單哦!
python面試題大全(一)
最近開始整理python的資料,博主建立了一個qq群,希望給大家提供一個交流的同平臺 938587844 。
python多線程有個全局解釋器鎖(global interpreter lock),這個鎖的意思是任一時間只能有一個線程使用解釋器,跟單cpu跑多個程序一個意思,大家都是輪著用的,這叫“并發(fā)”,不是“并行”。
多進程間共享數(shù)據(jù),可以使用 multiprocessing.Value 和 multiprocessing.Array.
(2)python多線程與多進程的區(qū)別
在UNIX平臺上,當某個進程終結之后,該進程需要被其父進程調(diào)用wait,否則進程成為僵尸進程(Zombie)。所以,有必要對每個Process對象調(diào)用join()方法 (實際上等同于wait)。對于多線程來說,由于只有一個進程,所以不存在此必要性。
多進程應該避免共享資源。在多線程中,我們可以比較容易地共享資源,比如使用全局變量或者傳遞參數(shù)。在多進程情況下,由于每個進程有自己獨立的內(nèi)存空間,以上方法并不合適。此時我們可以通過共享內(nèi)存和Manager的方法來共享資源。但這樣做提高了程序的復雜度,并因為同步的需要而降低了程序的效率。
Python引用了一個內(nèi)存池(memory pool)機制,即Pymalloc機制(malloc:n.分配內(nèi)存),用于管理對小塊內(nèi)存的申請和釋放
內(nèi)存池(memory pool)的概念:
當 創(chuàng)建大量消耗小內(nèi)存的對象時,頻繁調(diào)用new/malloc會導致大量的內(nèi)存碎片,致使效率降低。內(nèi)存池的概念就是預先在內(nèi)存中申請一定數(shù)量的,大小相等 的內(nèi)存塊留作備用,當有新的內(nèi)存需求時,就先從內(nèi)存池中分配內(nèi)存給這個需求,不夠了之后再申請新的內(nèi)存。這樣做最顯著的優(yōu)勢就是能夠減少內(nèi)存碎片,提升效率。
內(nèi)存池的實現(xiàn)方式有很多,性能和適用范圍也不一樣。
python中的內(nèi)存管理機制——Pymalloc:
python中的內(nèi)存管理機制都有兩套實現(xiàn),一套是針對小對象,就是大小小于256bits時,pymalloc會在內(nèi)存池中申請內(nèi)存空間;當大于256bits,則會直接執(zhí)行new/malloc的行為來申請內(nèi)存空間。
關于釋放內(nèi)存方面,當一個對象的引用計數(shù)變?yōu)?時,python就會調(diào)用它的析構函數(shù)。在析構時,也采用了內(nèi)存池機制,從內(nèi)存池來的內(nèi)存會被歸還到內(nèi)存池中,以避免頻繁地釋放動作。
lambda 函數(shù)是一個可以接收任意多個參數(shù)(包括可選參數(shù))并且返回單個表達式值的函數(shù)。 lambda 函數(shù)不能包含命令,它們所包含的表達式不能超過一個。不要試圖向lambda 函數(shù)中塞入太多的東西;如果你需要更復雜的東西,應該定義一個普通函數(shù),然后想讓它多長就多長。
a,b = 0, 1
while b<100:
print (b)
a;b = b;a+b
webbrowser模塊提供了一個高級接口來顯示基于Web的文檔,大部分情況下只需要簡單的調(diào)用open()方法。
webbrowser定義了如下的異常:
exception webbrowser.Error, 當瀏覽器控件發(fā)生錯誤是會拋出這個異常
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]) 根據(jù)name返回一個瀏覽器對象,如果name為空,則返回默認的瀏覽器
webbrowser.register(name, construtor[, instance])
注冊一個名字為name的瀏覽器,如果這個瀏覽器類型被注冊就可以用get()方法來獲取。
與C表達式 bool ? a : b類似,但是bool and a or b,當 a 為假時,不會象C表達式 bool ? a : b 一樣工作
應該將 and-or 技巧封裝成一個函數(shù):
def choose(bool, a, b):
return (bool and [a] or [b])[0]
因為 [a] 是一個非空列表,它永遠不會為假。甚至 a 是 0 或 '' 或其它假值,列表[a]為真,因為它有一個元素。
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>
最近開始整理python的資料,博主建立了一個qq群,希望給大家提供一個交流的同平臺 938587844 。
函數(shù) 描述
int(x [,base ]) 將x轉換為一個整數(shù)
long(x [,base ]) 將x轉換為一個長整數(shù)
float(x ) 將x轉換到一個浮點數(shù)
complex(real [,imag ]) 創(chuàng)建一個復數(shù)
str(x ) 將對象 x 轉換為字符串
repr(x ) 將對象 x 轉換為表達式字符串
eval(str ) 用來計算在字符串中的有效Python表達式,并返回一個對象
tuple(s ) 將序列 s 轉換為一個元組
list(s ) 將序列 s 轉換為一個列表
chr(x ) 將一個整數(shù)轉換為一個字符
unichr(x ) 將一個整數(shù)轉換為Unicode字符
ord(x ) 將一個字符轉換為它的整數(shù)值
hex(x ) 將一個整數(shù)轉換為一個十六進制字符串
oct(x ) 將一個整數(shù)轉換為一個八進制字符串
>>> 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']
>>> 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())
#使用__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
標準庫中的copy模塊提供了兩個方法來實現(xiàn)拷貝.一個方法是copy,它返回和參數(shù)包含內(nèi)容一樣的對象.
使用deepcopy方法,對象中的屬性也被復制。
Python的except用來捕獲所有異常,因為Python里面的每次錯誤都會拋出一個異常,所以每個程序的錯誤都被當作一個運行時錯誤。
pass語句什么也不做,一般作為占位符或者創(chuàng)建占位程序,pass語句不會執(zhí)行任何操作
type()
range(start, stop[, step])
可以使用sub()方法來進行查詢和替換,sub方法的格式為:sub(replacement, string[, count=0])
replacement是被替換成的文本
string是需要被替換的文本
count是一個可選參數(shù),指最大被替換的數(shù)量
match()函數(shù)只檢測RE是不是在string的開始位置匹配,search()會掃描整個string查找匹配, 也就是說match()只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話,match()就返回none
前者是貪婪匹配,會從頭到尾匹配 <a>xyz</a>,而后者是非貪婪匹配,只匹配到第一個 >。
import random
random.random()
它會返回一個隨機的0和1之間的浮點數(shù)
python實現(xiàn)發(fā)送和接收郵件功能主要用到poplib和smtplib模塊。
poplib用于接收郵件,而smtplib負責發(fā)送郵件。
代碼如下:
#! /usr/bin/env python
#coding=utf-8
import sys
import time
import poplib
import smtplib
#郵件發(fā)送函數(shù)
def send_mail():
try:
handle = smtplib.SMTP('smtp.126.com',25)
handle.login('XXXX@126.com','**********')
msg = 'To: XXXX@qq.com\r\nFrom:XXXX@126.com\r\nSubject:hello\r\n'
handle.sendmail('XXXX@126.com','XXXX@qq.com',msg)
handle.close()
return 1
except:
return 0
#郵件接收函數(shù)
def accpet_mail():
try:
p=poplib.POP3('pop.126.com')
p.user('pythontab@126.com')
p.pass_('**********')
ret = p.stat() #返回一個元組:(郵件數(shù),郵件尺寸)
#p.retr('郵件號碼')方法返回一個元組:(狀態(tài)信息,郵件,郵件尺寸)
except poplib.error_proto,e:
print "Login failed:",e
sys.exit(1)
#運行當前文件時,執(zhí)行sendmail和accpet_mail函數(shù)
if __name__ == "__main__":
send_mail()
accpet_mail()
【搜索圓方圓,獲得“python教程”,“python下載”,“python入門”類相關信息?!?/p>
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。