整理一下最近被問到的一些高頻率的面試問題。總結一下方便日後複習鞏固用,同時希望可以幫助一些朋友們。
前兩期點這↓
python近期遇到的一些面試問題(一)
python近期遇到的一些面試問題(二)
電子郵件位址有統一的標準格式:使用者名稱@伺服器網域名稱。使用者名稱表示郵件信箱、註冊名或信件接收者的使用者標識,@符號後是你使用的郵件伺服器的網域名稱。@可以讀成「at」,也就是「在」的意思。整個電子郵件位址可理解為網路中某台伺服器上的某個使用者的位址。
答案
r"^[a-za-z0-9]+[a-za-z0-9_.+-]+@[a-za-z0-9-]+\.[a-za-z0-9-.]+$"
下面解釋上面的表示式
1.首先強調一點關於w的含義,w匹配英文本母和俄語字母或數字或下劃線或漢字
2.注意^和[^]的區別,表示字元集合,^表示已內的任意字符集開始,[^]表示
3.^[a-za-z0-9]+:這裡注意^和[^]的,第乙個^表示已什麼開頭,第二個的^表示不等於內。
所以這段表示以英文本母和數字開頭,後面緊跟的+,限定其個數》=1個。
4.[a-za-z0-9_.+-]+:表示匹配英文本母和數字開頭以及_.+-,的任意乙個字元,並限定其個數》=1個。
為了考慮@前面可能出現.+-(但是不在開頭出現)。
5.@就是郵箱必備符號了
6.@[a-za-z0-9-]+.:前面的不用說了,後面的.表示.轉義了,也是必備符號。
7.
[a-za-z0-9-.]+$
:dollar符表示以什麼結束,這裡表示以英文本和數字或-. 1個或多個結尾。
來個例子驗證一波:
import re
plt=re.compile(r"^[a-za-z0-9]+[a-za-z0-9_.+-]+@[a-za-z0-9-]+\.[a-za-z0-9-.]+$")
b=plt.findall('[email protected]')
print(b)
網上找了個驗證郵件位址的通用正規表示式(符合 rfc 5322 標準)
(?:[a-z0-9!#$%&'*+/=?^_`~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.)(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
第一段
l=
for i in range(10):
print(l)
第二段
l=
a=for i in range(10):
a['num']=i
print(l)
答案首先分析第一段,的迴圈裡面,每一次迴圈都產生乙個新的字典型別,所以這個比較簡單結果是
[, , , , , , , , , ]
第二段情況就有些特殊了,a=表示把對映型別字典的引用給了a,迴圈a['num']=i的時候,a的引用位址不變,所以取了最後一次迴圈的值。
[, , , , , , , , , ]
def test1():
for i in range(2):
print('+'+str(i))
yield str(i)
for a in test1():
print('-'+a)
for a in list(test1()):
print('-'+a)
答案首先我們分析test1()列印的是什麼,
可以看到是生成器一枚。
第乙個for迴圈
+0 -0 +1 -1
第二個for迴圈,首先我們看list(test1())就知道了,首先需要執行完生成器裡的迴圈獲取然後轉出list即[0,1]。
然後在迴圈這個list所以結果是。
+0 +1 -0 -1
a=zip(('a','b','c'),(1,2,3,4))
print(dict(a))
答案zip() 函式用於將可迭代的物件作為引數,將物件中對應的元素打包成乙個個元組,然後返回由這些元組組成的列表。
如果各個迭代器的元素個數不一致,則返回列表長度與最短的物件相同,利用 * 號操作符,可以將元組解壓為列表。
zip 方法在 python 2 和 python 3 中的不同:在 python 3.x 中為了減少記憶體,zip() 返回的是乙個物件。
所以這裡按照最短的元素組成的字典輸出是。
class user():
name='user1'
age=30
答案我們把變數從記憶體中變成可儲存或傳輸的過程稱之為序列化
反過來,把變數內容從序列化的物件重新讀到記憶體裡稱之為反序列化
另外我們使用的模組是pickle
1、只能在python中使用,只支援python的基本資料型別。
2、可以處理複雜的序列化語法。(例如自定義的類的方法,遊戲的存檔等)
3、序列化的時候,只是序列化了整個序列物件,而不是記憶體位址。
pickle.dumps()方法把任意物件序列化成乙個bytes.所以我們首先需要建立乙個物件即u=user()
然後我們再把這個物件序列化。即
bytes=pickle.dumps(u)
然後是反序列化:
用pickle.loads()方法反序列化出物件.即
object=pickle.loads(bytes)
for n in filter(lambda n:n%5,[n for n in range(100) if n%5==0]):
print(n)
else:
print('12345')
答案首先我們知道filter的用法
filter(function, iterable)
其中還function -- 判斷函式。
iterable -- 可迭代物件。
返回 true 或 false
但是這個題比較坑 n%5和n%5==0的區別 ,n%5是n除以5求其餘數。n%5==0是n的5整除。
lambda n:n%5這個返回的是個數字而不是乙個布林型別不符合filter的要求,所以輸出12345。
要達到篩選效果我們可以這樣改.
for n in filter(lambda n:n%5==0,[n for n in range(100) if n%5==0]):
print(n)
但是如果我們這樣改呢,
for i in filter(lambda n:n%5==0,[n for n in range(100) if n%5==0]):
print(n)
結果就比較有意思了,大家可以考慮下為什麼。 C 高頻面試問題總結
順序容器 vector,deque是隨機訪問迭代器 list是雙向迭代器 容器介面卡 stack,queue,priority queue沒有迭代器 關聯容器 set,map,multiset,multimap是雙向迭代器 unordered set,unordered map,unordered ...
面試反覆被問到的問題 高頻面試問題
方法1 寬度高度已知 父元素相對定位,子元素絕對定位,left 50 top 50 margin left 負的寬度一半 margin top 負的高度一板 方法二 flex布局,寬度高度已知 在父元素身上 display flex justify content center align item...
k8s相關面試問題 TCP相關的高頻面試問題
tcp是在osi模型傳輸層中的可靠傳輸協議,通過三次握手建立連線,傳送端對資料進行分組,然後通過套接字傳送到快取中,進行傳送。接收端將報文段接收到接收快取中,然後再讀取資料。接收方通過滑動視窗通知傳送方控制吞吐量。遇到資料報丟失了就會通過選擇重傳來重新獲得資料報,資料傳輸完後進行四次揮手關閉連線。首...