來源:https://www.cnblogs.com/lmx123/p/9230589.html
1惩激、Python基礎(chǔ)
Q1. 什么是Python?
答:Python是一種面向?qū)ο蟮幕蕖⒔换ナ降摹⒔忉屝?/strong>的計(jì)算機(jī)程序設(shè)計(jì)語言淳蔼。
Python具有高可讀性,它使用英語關(guān)鍵詞而非標(biāo)點(diǎn)符號(hào)脐彩,語法結(jié)構(gòu)也比其他語言簡(jiǎn)單酿矢。
Q2. Python的主要功能是什么?
- (1)Python是一種解釋型語言盔夜;
- (2)聲明變量和類似變量時(shí)负饲,不需要重復(fù)聲明變量的類型堤魁;
- (3)Python非常適合面向?qū)ο蟮木幊涛沽矗驗(yàn)樗试S類的定義以及組合和繼承;
- (4)函數(shù)是第一類對(duì)象妥泉,這意味著它們可以分配給變量椭微,從其他函數(shù)返回并傳遞給函數(shù),類也是第一類對(duì)象盲链;
- (5)用于許多領(lǐng)域蝇率,包括Web應(yīng)用程序、自動(dòng)化刽沾、科學(xué)建模本慕、大數(shù)據(jù)應(yīng)用程序等。
Q3. 一行代碼實(shí)現(xiàn)1-100的和
print(sum(range(1,101)))
Q4. 如何在一個(gè)函數(shù)內(nèi)部修改全局變量侧漓?
答:利用global修改全局變量
>>> a = 5
>>> def fun():
global a
a = 4
>>> fun()
>>> print(a)
4
Q5. 列出5個(gè)標(biāo)準(zhǔn)Python庫(kù)
答:
庫(kù) | 作用 |
---|---|
os | 提供不少與操作系統(tǒng)相關(guān)的函數(shù) |
sys | 通常用于命令行參數(shù) |
re | 正則匹配 |
math | 數(shù)學(xué)運(yùn)算 |
datetime | 處理日期時(shí)間 |
Q6. 字典如何刪除鍵和合并兩個(gè)字典
答:del和update方法
>>> dic = {'name':'zs','age':'18'}
>>> del dic['name'] # 刪除鍵
>>> dic
{'age': '18'}
>>> dic2 = {'name':'lm'}
>>> dic.update(dic2)
>>> dic
{'age': '18', 'name': 'lm'}
Q7. 談一下python的GIL
答:GIL是python的全局解鎖器锅尘,同一進(jìn)程中假如有多個(gè)線程運(yùn)行,一個(gè)線程在運(yùn)行python程序的時(shí)候會(huì)霸占python解釋器(加了一把鎖即GIL)布蔗,使該進(jìn)程內(nèi)其他線程無法運(yùn)行藤违,等該線程運(yùn)行完成后其他線程才能運(yùn)行。如果線程運(yùn)行過程中遇到耗時(shí)操作纵揍,則解釋器解開顿乒,使其他線程運(yùn)行。所以在多線程中泽谨,線程的運(yùn)行仍是有先后順序的璧榄,并不是同時(shí)進(jìn)行特漩。
多進(jìn)程中因?yàn)槊總€(gè)進(jìn)程都能被系統(tǒng)分配資源,相當(dāng)于每個(gè)進(jìn)程有了一個(gè)python解釋器犹菱,所以多進(jìn)程可以實(shí)現(xiàn)多個(gè)進(jìn)程的同時(shí)運(yùn)行拾稳,缺點(diǎn)是進(jìn)程系統(tǒng)資源開銷大。
Q8. python實(shí)現(xiàn)列表去重的方法
答:先通過集合去重腊脱,再轉(zhuǎn)列表访得。
>>> list = [11,12,13,12,15,16,13]
>>> a = set(list)
>>> a
{11, 12, 13, 15, 16}
>>> [x for x in a]
[11, 12, 13, 15, 16]
Q9. fun(args,kwargs)中的args, **kwargs是什么意思?
def demo(args_f,*args_v):
print(args_f)
a = []
for x in args_v:
a.append(x)
print(a)
demo('a','b','c','d')
a
['b', 'c', 'd']
kwargs允許你將不定長(zhǎng)度的鍵值對(duì)陕凹,作為參數(shù)傳遞給一個(gè)函數(shù)悍抑。如果你想要在一個(gè)函數(shù)里處理帶名字的參數(shù),你應(yīng)該使用kwargs杜耙。這里有個(gè)例子幫你理解這個(gè)概念:
def demo(**args_v):
for k,v in args_v.items():
print(k,v)
demo(name='njcx')
#輸出
name njcx
Q10. python2 和 python3 的range(100)的區(qū)別
答:python2返回列表搜骡,python3返回迭代器,節(jié)約內(nèi)存佑女。
Q11. 一句話解釋什么樣的語言能夠用裝飾器?
答:函數(shù)可以作為參數(shù)傳遞的語言记靡,可以使用裝飾器。
Q12. python內(nèi)建數(shù)據(jù)類型有哪些团驱?
答:
類型 | 表示 |
---|---|
整型 | int |
布爾型 | bool |
字符串 | str |
列表 | list |
元組 | tuple |
字典 | dict |
Q13. 簡(jiǎn)述面向?qū)ο笾衉_new__和__init__區(qū)別?
答:__init__是初始化方法摸吠,創(chuàng)建對(duì)象后,就立刻被默認(rèn)調(diào)用了嚎花,可接收參數(shù)寸痢,如下示例:
class Bike:
def __init__(self,newWheelNum,newColor): # __init__方法自動(dòng)被調(diào)用,可以創(chuàng)建對(duì)象接收參數(shù)
self.wheelNum = newWheelNum
self.color = newColor
def move(self):
print('車會(huì)跑')
# 創(chuàng)建對(duì)象
BM = Bike(2,'green')
print('車的顏色為:%s' %BM.color)
print('車輪子的數(shù)量為:%d' %BM.wheelNum)
#輸出 只打印__init__方法執(zhí)行的結(jié)果紊选,move方法未執(zhí)行
車的顏色為:green
車輪子的數(shù)量為:2
1啼止、__new__至少要有一個(gè)參數(shù)cls,代表當(dāng)前類兵罢,此參數(shù)在實(shí)例化時(shí)由Python解釋器自動(dòng)識(shí)別;
2献烦、__new__必須要有返回值,返回實(shí)例化出來的實(shí)例卖词,這點(diǎn)在自己實(shí)現(xiàn)__new__時(shí)要特別注意巩那,可以return父類(通過super(當(dāng)前類名, cls))__new__出來的實(shí)例,或者直接是object的__new__出來的實(shí)例
3坏平、__init__有一個(gè)參數(shù)self拢操,就是這個(gè)__new__返回的實(shí)例,__init__在__new__的基礎(chǔ)上可以完成一些其它初始化的動(dòng)作舶替,__init__不需要返回值
4令境、如果__new__創(chuàng)建的是當(dāng)前類的實(shí)例,會(huì)自動(dòng)調(diào)用__init__函數(shù)顾瞪,通過return語句里面調(diào)用的__new__函數(shù)的第一個(gè)參數(shù)是cls來保證是當(dāng)前類實(shí)例舔庶,如果是其他類的類名抛蚁,那么實(shí)際創(chuàng)建返回的就是其他類的實(shí)例,其實(shí)就不會(huì)調(diào)用當(dāng)前類的__init__函數(shù)惕橙,也不會(huì)調(diào)用其他類的__init__函數(shù)瞧甩。
class A(object):
def __init__(self):
print('這是 init 方法',self)
def __new__(cls):
print('這是cls的ID',id(cls))
print('這是 new 方法',object.__new__(cls))
return object.__new__(cls)
A()
print('這是類A的ID',id(A))
#輸出
這是cls的ID 2880637165512
這是 new 方法 <__main__.A object at 0x0000029EB39222E8>
這是 init 方法 <__main__.A object at 0x0000029EB39222E8> #init方法和new方法中返回值地址一樣,說明返回值是對(duì)象
這是類A的ID 2880637165512 #cls和類ID一樣弥鹦,說明指向同一個(gè)類肚逸,也就是cls就是創(chuàng)建的實(shí)例類
Q14. 簡(jiǎn)述with方法打開處理文件幫我我們做了什么?
答:
f = open("./1.txt","wb")
try:
f.write("hello world")
except:
pass
finally:
f.close()
打開文件在進(jìn)行讀寫的時(shí)候可能會(huì)出現(xiàn)一些異常狀況彬坏,如果按照常規(guī)的f.open寫法朦促,我們需要try,except,finally,做異常判斷栓始,并且文件最終不管遇到什么情況务冕,都要執(zhí)行finally f.close()關(guān)閉文件,with方法幫我們實(shí)現(xiàn)了finally中f.close幻赚,更簡(jiǎn)潔有效禀忆。
with open("./2.txt","w") as f:
f.write("hello python")
(當(dāng)然還有其他自定義功能,有興趣可以研究with方法源碼)
Q15. 列表[1,2,3,4,5],請(qǐng)使用map()函數(shù)輸出[1,4,9,16,25]落恼,并使用列表推導(dǎo)式提取出大于10的數(shù)箩退,最終輸出[16,25]
答:map()函數(shù)第一個(gè)參數(shù)是fun,第二個(gè)參數(shù)是一般是list领跛,第三個(gè)參數(shù)可以寫list乏德,也可以不寫撤奸,根據(jù)需求
>>> print(list(map(lambda x:x**2,[1,2,3,4,5])))
[1, 4, 9, 16, 25]
>>> a = [1, 4, 9, 16, 25]
>>> b = [i for i in a if i>10]
>>> b
[16, 25]
Q16. python中生成隨機(jī)整數(shù)吠昭、隨機(jī)小數(shù)、0--1之間小數(shù)方法胧瓜。
答:
- 隨機(jī)整數(shù):random.randint(a,b),生成區(qū)間內(nèi)的整數(shù)
- 隨機(jī)小數(shù):習(xí)慣用numpy庫(kù)矢棚,利用np.random.randn(5)生成5個(gè)隨機(jī)小數(shù)
- 0-1隨機(jī)小數(shù):random.random(),括號(hào)中不傳參
import random
import numpy as np
result = random.randint(10,20)
res = np.random.randn(5)
ret = random.random()
print('隨機(jī)正整數(shù)',result)
print('5個(gè)隨機(jī)小數(shù)',res)
print('0-1隨機(jī)一個(gè)小數(shù)',ret)
#輸出:
隨機(jī)正整數(shù) 16
5個(gè)隨機(jī)小數(shù) [ 0.60713108 0.31552514 -1.38000673 -0.5888923 0.1802922 ]
0-1隨機(jī)一個(gè)小數(shù) 0.09464817136015036
Q17. 避免轉(zhuǎn)義給字符串加哪個(gè)字母表示原始字符串?
答:r , 表示需要原始字符串府喳,不轉(zhuǎn)義特殊字符蒲肋。
Q18. <div class="nam">中國(guó)</div>,用正則匹配出標(biāo)簽里面的內(nèi)容(“中國(guó)”)钝满,其中class的類名是不確定的兜粘。
答:
import re
str = '<div class="nam">中國(guó)</div>'
res = re.findall(r'<div class=".*">(.*?)</div>',str)
print(res)
# . 代表可有可無
# * 代表任意字符,滿足類名可以變化
# (.*?)提取文本
補(bǔ)充:常用正則匹配規(guī)則
Q19. Python中斷言方法舉例
答:
a = 3
assert(a>1)
print("斷言成功弯蚜,程序繼續(xù)向下執(zhí)行")
b = 4
assert(b>7)
print("斷言失敗孔轴,程序報(bào)錯(cuò)(這條不會(huì)被執(zhí)行)")
輸出:
斷言成功,程序繼續(xù)向下執(zhí)行
Traceback (most recent call last):
File "C:/Users/dybhh/Desktop/pypractice/q18.py", line 6, in <module>
assert(b>7)
AssertionError
Q20. 數(shù)據(jù)表student有id,name,score,city字段碎捺,其中name中的名字可有重復(fù)路鹰,需要消除重復(fù)行,請(qǐng)寫sql語句贷洲。
答:SELECT DISTINCT name FROM student
Q21. python2和python3區(qū)別?列舉5個(gè)
- 1晋柱、Python3 使用 print 必須要以小括號(hào)包裹打印內(nèi)容优构,比如 print('hi')
Python2 既可以使用帶小括號(hào)的方式,也可以使用一個(gè)空格來分隔打印內(nèi)容雁竞,比如 print 'hi' - 2钦椭、python2 range(1,10)返回列表,python3中返回迭代器碑诉,節(jié)約內(nèi)存
- 3玉凯、python2中使用ascii編碼,python3中使用utf-8編碼
- 4联贩、python2中unicode表示字符串序列漫仆,str表示字節(jié)序列
python3中str表示字符串序列,byte表示字節(jié)序列 - 5泪幌、python2中為正常顯示中文盲厌,引入coding聲明,python3中不需要
- 6祸泪、python2中是raw_input()函數(shù)吗浩,python3中是input()函數(shù)
Q22. 列出python中可變數(shù)據(jù)類型和不可變數(shù)據(jù)類型,并簡(jiǎn)述原理没隘。
答:
- 不可變數(shù)據(jù)類型:數(shù)值型懂扼、字符串型string和元組tuple
不允許變量的值發(fā)生變化,如果改變了變量的值右蒲,相當(dāng)于是新建了一個(gè)對(duì)象阀湿,而對(duì)于相同的值的對(duì)象,在內(nèi)存中則只有一個(gè)對(duì)象(一個(gè)地址)瑰妄,如下圖用id()方法可以打印對(duì)象的id
- 可變數(shù)據(jù)類型:列表list和字典dict陷嘴;
允許變量的值發(fā)生變化,即如果對(duì)變量進(jìn)行append间坐、+=等這種操作后灾挨,只是改變了變量的值,而不會(huì)新建一個(gè)對(duì)象竹宋,變量引用的對(duì)象的地址也不會(huì)變化劳澄,不過對(duì)于相同的值的不同對(duì)象,在內(nèi)存中則會(huì)存在不同的對(duì)象蜈七,即每個(gè)對(duì)象都有自己的地址秒拔,相當(dāng)于內(nèi)存中對(duì)于同值的對(duì)象保存了多份,這里不存在引用計(jì)數(shù)宪潮,是實(shí)實(shí)在在的對(duì)象溯警。
Q23. s = 'ajldjlajfdljfddd'趣苏,去重并從小到大排序輸出“adfjl”。
答:
>>> s = 'ajldjlajfdljfddd'
>>> s = set(s)
>>> s
{'d', 'a', 'f', 'j', 'l'}
>>> s = list(s)
>>> s
['d', 'a', 'f', 'j', 'l']
>>> s.sort()
>>> s
['a', 'd', 'f', 'j', 'l']
>>> res = "".join(s)
>>> res
'adfjl'
Q24. 用lambda實(shí)現(xiàn)兩個(gè)數(shù)相乘梯轻。
答:
>>> sum = lambda x,y:x*y
>>> sum(5,4)
20
Q25. 字典根據(jù)鍵從小到大排序食磕。
答:
dict = {"name":"zs","age":"18","city":"深圳","tel":"1818181818"}
list = sorted(dict.items(),key=lambda i:i[0],reverse=False)
print("sorted根據(jù)字典鍵排序",list)
new_dict = {}
for i in list:
new_dict[i[0]]=i[1]
print("新字典是:",new_dict)
#輸出
>>> sorted根據(jù)字典鍵排序 [('age', '18'), ('city', '深圳'), ('name', 'zs'), ('tel', '1818181818')]
新字典是: {'age': '18', 'city': '深圳', 'name': 'zs', 'tel': '1818181818'}
Q26. 利用collections庫(kù)的Counter方法統(tǒng)計(jì)字符串每個(gè)單詞出現(xiàn)的次數(shù)"kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h"
答:
from collections import Counter
a = "kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h"
res = Counter(a)
print(res)
>>>Counter({'l': 9, ';': 6, 'h': 6, 'f': 5, 'a': 4, 'j': 3, 'd': 3, 's': 2, 'k': 1, 'g': 1, 'b': 1})
Q27. 字符串a(chǎn) = "not 404 found 張三 99 深圳",每個(gè)詞中間是空格喳挑,用正則過濾掉英文和數(shù)字彬伦,最終輸出"張三 深圳"。
答:
import re
a = "not 404 found 張三 99 深圳"
list = a.split(" ")
print(list)
res = re.findall('\d+|[a-zA-Z]+',a)
for i in res:
if i in list:
list.remove(i)
new_str = " ".join(list)
print(res)
print(new_str)
>>>['not', '404', 'found', '張三', '99', '深圳']
['not', '404', 'found', '99']
張三 深圳
Q28. filter方法求出列表所有奇數(shù)并構(gòu)造新列表伊诵,a = [1,2,3,4,5,6,7,8,9,10]单绑。
答:filter()函數(shù)用于過濾序列,過濾掉不符合條件的元素,返回由符合條件組成的新列表。接收兩個(gè)參數(shù)旦装,第一個(gè)為函數(shù),第二個(gè)為序列区转,序列的每個(gè)元素作為參數(shù)傳遞給函數(shù)進(jìn)行判斷,然后返回True或False版扩,最后將返回True的元素放到新列表废离。
a = [1,2,3,4,5,6,7,8,9,10]
def fn(a):
return a%2 == 1
newlist = filter(fn,a)
newlist = [i for i in newlist]
print(newlist)
>>>[1, 3, 5, 7, 9]
Q29. 列表推倒式求列表所有奇數(shù)并構(gòu)造新列表,a = [1,2,3,4,5,6,7,8,9,10]礁芦。
答:
a = [1,2,3,4,5,6,7,8,9,10]
res = [i for i in a if i % 2 == 1]
print(res)
>>>[1, 3, 5, 7, 9]
Q30. 正則re.complie作用蜻韭?
答:re.complie是將正則表達(dá)式編譯成一個(gè)對(duì)象,加快速度柿扣,并重復(fù)使用肖方。
例如:
import re
def main():
content = 'Hello, I am Jerry, from Chongqing, a montain city, nice to meet you……'
regex = re.compile('\w*o\w*') # 查找所有含有“o”的單詞
x = regex.findall(content)
print(x)
if __name__ == '__main__':
main()
>>>['Hello', 'from', 'Chongqing', 'montain', 'to', 'you']
Q31. a = (1,) b = (1) c = ('1') 分別是什么類型的數(shù)據(jù)?
答:
>>> type((1))
<class 'int'>
>>> type((1,))
<class 'tuple'>
>>> type(('1'))
<class 'str'>
Q32. 將兩個(gè)列表[1,5,7,9]和[2,2,6,8]并為[1,2,2,5,6,7,8,9].
答:
list1 = [1,5,7,9]
list2 = [2,2,6,8]
list1.extend(list2)
print(list1)
list1.sort(reverse=False)
print(list1)
>>>[1, 5, 7, 9, 2, 2, 6, 8]
[1, 2, 2, 5, 6, 7, 8, 9]
Q33. 用python和Linux命令刪除文件的方法窄刘。
答:python: os.remove(文件名)
linux: rm 文件名
Q34. log 日志種窥妇,我們需要時(shí)間戳記錄error,warning等發(fā)生的時(shí)間舷胜,請(qǐng)用datetime模塊打印當(dāng)前時(shí)間戳“ ”娩践。
答:順便把星期的代碼也貼上:
import datetime
a = str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + ' 星期' + str(datetime.datetime.now().isoweekday())
print(a)
>>>2019-10-22 09:06:26 星期2
Q35. 數(shù)據(jù)庫(kù)優(yōu)化查詢方法?
答:外鍵烹骨、索引翻伺、聯(lián)合查詢、選擇特定字段等沮焕。
Q36. 寫一段自定義異常代碼吨岭。
答:自定義異常使用raise拋出異常:
def fn():
try:
for i in range(5):
if i >2:
raise Exception('數(shù)字大于2了')
except Exception as ret:
print(ret)
fn()
>>>數(shù)字大于2了
Q37. 正則表達(dá)式匹配中,(.)和(.?)匹配區(qū)別峦树?
答:
(.*)是貪婪匹配辣辫,會(huì)把滿足正則的盡可能多的往后匹配
(.*?)是非貪婪匹配旦事,會(huì)把滿足正則的盡可能少匹配
import re
s = '<a>哈哈</a><a>呵呵</a>'
res1 = re.findall('<a>(.*)</a>',s)
print('貪婪匹配',res1)
res2 = re.findall('<a>(.*?)</a>',s)
print('非貪婪匹配',res2)
>>>貪婪匹配 ['哈哈</a><a>呵呵']
非貪婪匹配 ['哈哈', '呵呵']
Q38. 簡(jiǎn)述Django的orm。
Q39. 一行代碼展開列表a = [[1,2],[3,4],[5,6]],得出[1, 2, 3, 4, 5, 6]急灭。
答:
#一行代碼展開列表
a = [[1,2],[3,4],[5,6]]
x = [j for i in a for j in i]
print(x)
>>>[1, 2, 3, 4, 5, 6]
Q40. x = 'abc', y = 'def', z = ['d','e','f']姐浮,分別求出x.join(y)和 x.join(z)的結(jié)果。
答:join()括號(hào)里面的是可迭代對(duì)象葬馋,x插入可迭代對(duì)象中間卖鲤,結(jié)果一致。
x = 'abc'
y = 'def'
z = ['d','e','f']
m = x.join(y)
n = x.join(z)
print(m)
print(n)
>>>dabceabcf
dabceabcf
Q41. 舉例說明異常模塊中try except else finally的相關(guān)意義畴嘶。
答:try...except...else 沒有捕獲到異常蛋逾,執(zhí)行else語句。
try...except...finally 不管是否捕獲到異常窗悯,都執(zhí)行finally語句
例如:
try:
num = 100
print(num)
except NameError as errorMsg:
print('產(chǎn)生錯(cuò)誤了:%s' %errorMsg)
else:
print('沒有捕獲到異常区匣,則執(zhí)行該語句')
try:
num = 100
print(num)
except NameError as errorMsg:
print('產(chǎn)生錯(cuò)誤了:%s' %errorMsg)
finally:
print('不管是否捕獲到異常,都執(zhí)行該句')
>>>100
沒有捕獲到異常蒋院,則執(zhí)行該語句
100
不管是否捕獲到異常沉颂,都執(zhí)行該句
Q42. python中交換兩個(gè)數(shù)值。
答:
>>> a,b = 3,4
>>> print(a,b)
3 4
>>> a,b = b,a
>>> print(a,b)
4 3
Q43. 舉例說明zip()函數(shù)的用法悦污。
答:zip()函數(shù)在運(yùn)算時(shí)铸屉,會(huì)以一個(gè)或多個(gè)序列(可迭代對(duì)象)作為參數(shù),返回一個(gè)元組的列表切端。同時(shí)將這些序列中并排的元素配對(duì)彻坛。
zip()參數(shù)可以接受任何類型的序列,同時(shí)也可以有兩個(gè)以上的參數(shù)踏枣;當(dāng)傳入?yún)?shù)的長(zhǎng)度不同時(shí)昌屉,zip()能自動(dòng)以最短序列長(zhǎng)度為準(zhǔn)進(jìn)行截取,獲得元組茵瀑。
>>> # 列表
>>> a = [1,2]
>>> b = [3,4]
>>> res = [i for i in zip(a,b)]
>>> print(res)
[(1, 3), (2, 4)]
>>> # 元組
>>> a = (1,2)
>>> b = (3,4)
>>> res = [i for i in zip(a,b)]
>>> print(res)
[(1, 3), (2, 4)]
>>> # 字符串
>>> a = 'ab'
>>> b = 'xyz'
>>> res = [i for i in zip(a,b)]
>>> print(res)
[('a', 'x'), ('b', 'y')]
Q44. a="hello"和b="你好"編碼成bytes類型.
答:
>>> a = b'hello'
>>> b = '你好'.encode()
>>> print(a,b)
b'hello' b'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print(b)
b'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print(type(a),type(b))
<class 'bytes'> <class 'bytes'>
Q45. a = [1,2,3]和 b = [4,5,6]相加的結(jié)果是多少间驮?
答:兩個(gè)列表相加,等價(jià)于extend马昨。
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> res = a + b
>>> print(res)
[1, 2, 3, 4, 5, 6]
Q46. 提高python運(yùn)行效率的方法竞帽。
答:
1、使用生成器鸿捧,因?yàn)榭梢怨?jié)約大量?jī)?nèi)存
2屹篓、循環(huán)代碼優(yōu)化,避免過多重復(fù)代碼的執(zhí)行
3匙奴、核心模塊用Cython PyPy等堆巧,提高效率
4、多進(jìn)程、多線程谍肤、協(xié)程
5啦租、多個(gè)if elif條件判斷,可以把最有可能先發(fā)生的條件放到前面寫荒揣,這樣可以減少程序判斷的次數(shù)刷钢,提高效率
Q47. 簡(jiǎn)述mysql和redis區(qū)別。
答:
- redis: 內(nèi)存型非關(guān)系數(shù)據(jù)庫(kù)乳附,數(shù)據(jù)保存在內(nèi)存中内地,速度快
- mysql:關(guān)系型數(shù)據(jù)庫(kù),數(shù)據(jù)保存在磁盤中赋除,檢索的話阱缓,會(huì)有一定的Io操作,訪問速度相對(duì)慢举农。
Q48. 遇到bug如何處理荆针?
答:
- 1、細(xì)節(jié)上的錯(cuò)誤颁糟,通過print()打印航背,能執(zhí)行到print()說明一般上面的代碼沒有問題,分段檢測(cè)程序是否有問題棱貌,如果是js的話可以alert或console.log
- 2玖媚、如果涉及一些第三方框架,會(huì)去查官方文檔或者一些技術(shù)博客婚脱。
- 3今魔、對(duì)于bug的管理與歸類總結(jié),一般測(cè)試將測(cè)試出的bug用teambin等bug管理工具進(jìn)行記錄障贸,然后我們會(huì)一條一條進(jìn)行修改错森,修改的過程也是理解業(yè)務(wù)邏輯和提高自己編程邏輯縝密性的方法,我也都會(huì)收藏做一些筆記記錄篮洁。
- 4涩维、導(dǎo)包問題、城市定位多音字造成的顯示錯(cuò)誤問題
Q49. 正則匹配日期2018-03-20,
url='https://sycm.taobao.com/bda/tradinganaly/overview/get_summary.json?dateRange=2018-03-20%7C2018-03-20&dateType=recent1&device=1&token=ff25b109b&_=1521595613462'
答:提取一段特征語句袁波,用(.*?)即可瓦阐。
import re
url='https://sycm.taobao.com/bda/tradinganaly/overview/get_summary.json?dateRange=2018-03-20%7C2018-03-20&dateType=recent1&device=1&token=ff25b109b&_=1521595613462'
result = re.findall(r'dateRange=(.*?)%7C(.*?)&',url)
print(result)
>>>[('2018-03-20', '2018-03-20')]
Q50. list = [2,3,5,4,9,6]。從小到大排列锋叨,不許用sort,輸出[2,3,4,5,6,9]垄分。
答:利用min()方法求出最小值,原列表刪除最小值娃磺,新列表加入最小值,遞歸調(diào)用獲取最小值的函數(shù)叫倍,反復(fù)操作偷卧。
list = [2,3,5,4,9,6]
new_list = []
def get_min(list):
# 獲取列表最小值
a = min(list)
# 刪除最小值
list.remove(a)
# 將最小值加入新列表
new_list.append(a)
# 保證最后列表里面有值豺瘤,遞歸調(diào)用獲取最小值
# 直到所有值獲取完,并加入新列表返回
if len(list)>0:
get_min(list)
return new_list
new_list = get_min(list)
print(new_list)
>>>[2, 3, 4, 5, 6, 9]
Q51. 保留兩位小數(shù)听诸。
答:round(x,n)方法:返回浮點(diǎn)數(shù)x的四舍五入值(保留小數(shù)點(diǎn)后n位)坐求。
a = '%.03f' %1.3335 # 3前面的0表示補(bǔ)0
print(a,type(a))
b = round(float(a),1)
print(b)
c = round(float(a),2)
print(c)
>>>1.333 <class 'str'>
1.3
1.33
Q52. 求三個(gè)方法打印結(jié)果.
答:
- fn("one",1)直接將鍵值對(duì)傳給字典;
- fn("two",2)因?yàn)樽值湓趦?nèi)存中是可變數(shù)據(jù)類型晌梨,所以指向同一個(gè)地址桥嗤,傳了新的額參數(shù)后,會(huì)相當(dāng)于給字典增加鍵值對(duì)
- fn("three",3,{})因?yàn)閭髁艘粋€(gè)新字典仔蝌,所以不再是原先默認(rèn)參數(shù)的字典
def fn(k,v,dic={}):
dic[k] = v
print(dic)
fn('one',1)
fn('two',2)
fn('three',3,{})
>>>
{'one': 1}
{'one': 1, 'two': 2}
{'three': 3}
Q53. 列出常見的狀態(tài)碼和意義泛领。
答:
狀態(tài)碼 | 意義 |
---|---|
200 OK | 請(qǐng)求正常處理完畢 |
204 No Content | 請(qǐng)求成功處理,沒有實(shí)體的主體返回 |
206 Partial Content | GET范圍請(qǐng)求已成功處理 |
301 Moved Permanently | 永久重定向敛惊,資源已永久分配新URI |
302 Found | 臨時(shí)重定向渊鞋,資源已臨時(shí)分配新URI |
303 See Other | 臨時(shí)重定向,期望使用GET定向獲取 |
304 Not Modified | 發(fā)送的附帶條件請(qǐng)求未滿足 |
307 Temporary Redirect | 臨時(shí)重定向瞧挤,POST不會(huì)變成GET |
400 Bad Request | 請(qǐng)求報(bào)文語法錯(cuò)誤或參數(shù)錯(cuò)誤 |
401 Unauthorized | 需要通過HTTP認(rèn)證锡宋,或認(rèn)證失敗 |
403 Forbidden | 請(qǐng)求資源被拒絕 |
404 Not Found | 無法找到請(qǐng)求資源(服務(wù)器無理由拒絕) |
500 Internal Server Error | 服務(wù)器故障或Web應(yīng)用故障 |
503 Service Unavailable | 服務(wù)器超負(fù)載或停機(jī)維護(hù) |
Q54. 分別從前端、后端特恬、數(shù)據(jù)庫(kù)闡述web項(xiàng)目的性能優(yōu)化执俩。
答:
前端優(yōu)化:
- 減少http請(qǐng)求、例如制作精靈圖
- html和CSS放在頁面上部癌刽,javascript放在頁面下面奠滑,因?yàn)閖s加載比HTML和Css加載慢,所以要優(yōu)先加載html和css,以防頁面顯示不全妒穴,性能差宋税,也影響用戶體驗(yàn)差
后端優(yōu)化: - 緩存存儲(chǔ)讀寫次數(shù)高,變化少的數(shù)據(jù)讼油,比如網(wǎng)站首頁的信息杰赛、商品的信息等。應(yīng)用程序讀取數(shù)據(jù)時(shí)矮台,一般是先從緩存中讀取乏屯,如果讀取不到或數(shù)據(jù)已失效,再訪問磁盤數(shù)據(jù)庫(kù)瘦赫,并將數(shù)據(jù)再次寫入緩存辰晕。
- 異步方式,如果有耗時(shí)操作确虱,可以采用異步含友,比如celery
- 代碼優(yōu)化,避免循環(huán)和判斷次數(shù)太多,如果多個(gè)if else判斷窘问,優(yōu)先判斷最有可能先發(fā)生的情況
數(shù)據(jù)庫(kù)優(yōu)化: - 如有條件辆童,數(shù)據(jù)可以存放于redis,讀取速度快
- 建立索引惠赫、外鍵等
Q55. 使用pop和del刪除字典中的"name"字段把鉴,dic={"name":"zs","age":18}
答:
>>> dic = {'name':'zs','age':18}
>>> dic.pop('name')
'zs'
>>> dic
{'age': 18}
>>> dic = {'name':'zs','age':18}
>>> del dic['name']
>>> dic
{'age': 18}
Q56. 列出常見MYSQL數(shù)據(jù)存儲(chǔ)引擎
答:
InnoDB:支持事務(wù)處理,支持外鍵儿咱,支持崩潰修復(fù)能力和并發(fā)控制庭砍。如果需要對(duì)事務(wù)的完整性要求比較高(比如銀行),要求實(shí)現(xiàn)并發(fā)控制(比如售票)混埠,那選擇InnoDB有很大的優(yōu)勢(shì)怠缸。如果需要頻繁的更新、刪除操作的數(shù)據(jù)庫(kù)岔冀,也可以選擇InnoDB凯旭,因?yàn)橹С质聞?wù)的提交(commit)和回滾(rollback)。
MyISAM:插入數(shù)據(jù)快使套,空間和內(nèi)存使用比較低罐呼。如果表主要是用于插入新記錄和讀出記錄,那么選擇MyISAM能實(shí)現(xiàn)處理高效率侦高。如果應(yīng)用的完整性嫉柴、并發(fā)性要求比 較低,也可以使用奉呛。
MEMORY:所有的數(shù)據(jù)都在內(nèi)存中计螺,數(shù)據(jù)的處理速度快,但是安全性不高瞧壮。如果需要很快的讀寫速度登馒,對(duì)數(shù)據(jù)的安全性要求較低,可以選擇MEMOEY咆槽。它對(duì)表的大小有要求陈轿,不能建立太大的表。所以秦忿,這類數(shù)據(jù)庫(kù)只使用在相對(duì)較小的數(shù)據(jù)庫(kù)表麦射。
Q57. 計(jì)算一些代碼運(yùn)行結(jié)果。
答:
A = zip(('a','b','c','d','e'),(1,2,3,4,5))
A0 = dict(A)
A1 = range(10)
A2 = [i for i in A1 if i in A0]
A3 = [A0[s] for s in A0]
print('A0:',A0)
print(list(zip(('a','b','c','d','e'),(1,2,3,4,5))))
print('A2:',A2)
print('A3:',A3)
>>>
A0: {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
A2: []
A3: [1, 2, 3, 4, 5]
dict()創(chuàng)建字典新方法
#創(chuàng)建字典新方法
#列表
s = dict([['name','zs'],['age',18]])
print(s)
# 元組
a = dict([('name','zs'),('age',18)])
print(a)
>>>
{'name': 'zs', 'age': 18}
{'name': 'zs', 'age': 18}
Q58. 簡(jiǎn)述同源策略.
答: 同源策略需要同時(shí)滿足以下三點(diǎn)要求:
- 協(xié)議相同
- 域名相同
- 端口相同
http:www.test.com與https:www.test.com 不同源——協(xié)議不同
http:www.test.com與http:www.admin.com 不同源——域名不同
http:www.test.com與http:www.test.com:8081 不同源——端口不同
只要不滿足其中任意一個(gè)要求灯谣,就不符合同源策略潜秋,就會(huì)出現(xiàn)“跨域”
Q59. 簡(jiǎn)述cookie和session的區(qū)別
答:
- session 在服務(wù)器端,cookie 在客戶端(瀏覽器)胎许。
- session 的運(yùn)行依賴 session id峻呛,而 session id 是存在 cookie 中的罗售,也就是說,如果瀏覽器禁用了 cookie 杀饵,同時(shí) session 也會(huì)失效莽囤,存儲(chǔ)Session時(shí)谬擦,鍵與Cookie中的sessionid相同切距,值是開發(fā)人員設(shè)置的鍵值對(duì)信息,進(jìn)行了base64編碼惨远,過期時(shí)間由開發(fā)人員設(shè)置谜悟。
- cookie安全性比session差。
Q60. 簡(jiǎn)述多進(jìn)程北秽、多線程葡幸。
答:
進(jìn)程:
- 操作系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,多個(gè)進(jìn)程之間相互獨(dú)立贺氓。
- 穩(wěn)定性好蔚叨,如果一個(gè)進(jìn)程崩潰,不影響其他進(jìn)程辙培,但是進(jìn)程消耗資源大蔑水,開啟的進(jìn)程數(shù)量有限制。
線程:
- CPU進(jìn)行資源分配和調(diào)度的基本單位扬蕊,線程是進(jìn)程的一部分搀别,是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位,一個(gè)進(jìn)程下的多個(gè)線程可以共享該進(jìn)程的所有資源尾抑。
- 如果IO操作密集歇父,則可以多線程運(yùn)行效率高,缺點(diǎn)是如果一個(gè)線程崩潰再愈,都會(huì)造成進(jìn)程的崩潰榜苫。
應(yīng)用:
- IO密集的用多線程,在用戶輸入翎冲,sleep 時(shí)候垂睬,可以切換到其他線程執(zhí)行,減少等待的時(shí)間府适。
- CPU密集的用多進(jìn)程羔飞,因?yàn)榧偃鏘O操作少,用多線程的話檐春,因?yàn)榫€程共享一個(gè)全局解釋器鎖逻淌,當(dāng)前運(yùn)行的線程會(huì)霸占GIL,其他線程沒有GIL疟暖,就不能充分利用多核CPU的優(yōu)勢(shì)卡儒。
Q61. 簡(jiǎn)述any()和all()方法田柔。
答:
- any():只要迭代器中有一個(gè)元素為真就為真
- all():迭代器中所有的判斷項(xiàng)返回都是真,結(jié)果才為真
python中什么元素為假骨望?
(0硬爆,空字符串,空列表擎鸠、空字典缀磕、空元組、None, False)
Q62. 常見異常類型及其說明劣光。
答:
異常類型 | 說明 |
---|---|
IOError | 輸入輸出異常 |
AttributeError | 試圖訪問一個(gè)對(duì)象沒有的屬性 |
ImportError | 無法引入模塊或包袜蚕,基本是路徑問題 |
IndentationError | 語法錯(cuò)誤,代碼沒有正確的對(duì)齊 |
IndexError | 下標(biāo)索引超出序列邊界 |
KeyError | 試圖訪問你字典里不存在的鍵 |
SyntaxError | Python代碼邏輯語法出錯(cuò)绢涡,不能執(zhí)行 |
NameError | 使用一個(gè)還未賦予對(duì)象的變量 |
Q63. 列出幾種魔法方法并簡(jiǎn)要介紹用途牲剃。
答:
方法 | 用途 |
---|---|
__init__ | 對(duì)象初始化方法 |
__new__ | 創(chuàng)建對(duì)象時(shí)候執(zhí)行的方法,單列模式會(huì)用到 |
__str__ | 當(dāng)使用print輸出對(duì)象的時(shí)候雄可,只要自己定義了__str__(self)方法凿傅,那么就會(huì)打印從在這個(gè)方法中return的數(shù)據(jù) |
__del__ | 刪除對(duì)象執(zhí)行的方法 |
Q64. 請(qǐng)將[i for i in range(3)]改成生成器。
答:生成器是特殊的迭代器
- 列表表達(dá)式 [] 改為 () 即可變成生成器数苫。
- 函數(shù)在返回值的時(shí)候出現(xiàn)yield就變成生成器聪舒,而不是函數(shù)了。
>>> a = [i for i in range(3)]
>>> type(a)
<class 'list'>
>>> b = (i for i in range(3))
>>> type(b)
<class 'generator'>
Q65. 去除字符串的空格文判。
答:
>>> a = ' hehehe '
>>> a
' hehehe '
>>> a.strip()
'hehehe'
Q66. 舉例sort和sorted對(duì)列表排序过椎,list = [0,-1,3,-10,5,9]
答:
list = [0,-1,3,-10,5,9]
list.sort(reverse=False) # 一種方法
print('list.sort在list基礎(chǔ)上修改,無返回值',list)
list2 = [0,-1,3,-10,5,9]
res = sorted(list2,reverse=False) #一種函數(shù)
print('sorted有返回值是新的list2',list2)
print('返回值',res)
>>>
list.sort在list基礎(chǔ)上修改戏仓,無返回值 [-10, -1, 0, 3, 5, 9]
sorted有返回值是新的list2 [0, -1, 3, -10, 5, 9]
返回值 [-10, -1, 0, 3, 5, 9]
Q67. 對(duì)list排序疚宇,foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4],使用lambda函數(shù)從小到大排列赏殃。
答:
foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4]
a = sorted(foo,key=lambda x:x)
print(a)
>>>
[-20, -5, -4, -4, -2, 0, 2, 4, 8, 8, 9]
Q68. 使用lambda函數(shù)對(duì)list排序foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4]敷待,輸出結(jié)果為[0, 2, 4, 8, 8, 9, -2, -4, -4, -5, -20]
答:傳兩個(gè)條件,x<0和abs(x)
foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4]
b = sorted(foo,key = lambda x:(x<0,abs(x)))
print(b)
>>>[0, 2, 4, 8, 8, 9, -2, -4, -4, -5, -20]
Q69. 列表嵌套字典的排序仁热,分別根據(jù)年齡和姓名排序榜揖。
答:
foo = [{'name':'zs','age':19},{'name':'ss','age':54},
{'name':'wa','age':17},{'name':'df','age':23}]
# 根據(jù)年齡從大到小排序
a = sorted(foo,key = lambda x:x['age'],reverse=True)
print('根據(jù)年齡從大到小排序:',a)
# 根據(jù)姓名從小到大
b = sorted(foo,key = lambda x:x['name'])
print('根據(jù)姓名從小到大排序:',b)
>>>根據(jù)年齡從大到小排序: [{'name': 'ss', 'age': 54}, {'name': 'df', 'age': 23}, {'name': 'zs', 'age': 19}, {'name': 'wa', 'age': 17}]
根據(jù)姓名從小到大排序: [{'name': 'df', 'age': 23}, {'name': 'ss', 'age': 54}, {'name': 'wa', 'age': 17}, {'name': 'zs', 'age': 19}]
Q70. 列表嵌套元組,分別按字母和數(shù)字排序抗蠢。
答:
foo = [('zs',19),('ss',54),
('wa',17),('df',23)]
# 根據(jù)年齡從大到小排序
a = sorted(foo,key = lambda x:x[1],reverse=True)
print('根據(jù)年齡從大到小排序:',a)
# 根據(jù)姓名從小到大
b = sorted(foo,key = lambda x:x[0])
print('根據(jù)姓名從小到大排序:',b)
>>> 根據(jù)年齡從大到小排序: [('ss', 54), ('df', 23), ('zs', 19), ('wa', 17)]
根據(jù)姓名從小到大排序: [('df', 23), ('ss', 54), ('wa', 17), ('zs', 19)]
Q71. 列表嵌套列表排序举哟,年齡數(shù)字相同怎么辦?
答:
foo =[['zs',19],['zl',54],
['wa',23],['df',23],['xf',23]]
a = sorted(foo,key=lambda x:(x[1],x[0])) #年齡相同迅矛,按字母排序
print(a)
b = sorted(foo,key=lambda x:x[0])
print(b)
>>>[['zs', 19], ['df', 23], ['wa', 23], ['xf', 23], ['zl', 54]]
[['df', 23], ['wa', 23], ['xf', 23], ['zl', 54], ['zs', 19]]
Q72. 根據(jù)鍵對(duì)字典排序(方法一妨猩,zip函數(shù))
答:
dic = {'name':'zs','sex':'man','city':'bj'}
foo = zip(dic.keys(),dic.values()) # 字典轉(zhuǎn)列表嵌套元組
foo = [i for i in foo]
print('字典轉(zhuǎn)成列表嵌套元組',foo)
b = sorted(foo,key=lambda x:x[0])
print('根據(jù)鍵排序',b)
new_dic = {i[0]:i[1] for i in b}
print('字典推倒式構(gòu)造新字典',new_dic)
>>>
字典轉(zhuǎn)成列表嵌套元組 [('name', 'zs'), ('sex', 'man'), ('city', 'bj')]
根據(jù)鍵排序 [('city', 'bj'), ('name', 'zs'), ('sex', 'man')]
字典推倒式構(gòu)造新字典 {'city': 'bj', 'name': 'zs', 'sex': 'man'}
Q73. 根據(jù)鍵對(duì)字典排序(方法二,不用zip)
答:
dic = {'name':'zs','sex':'man','city':'bj'}
print('字典轉(zhuǎn)成列表嵌套元組',dic.items())
b = sorted(dic.items(),key=lambda x:x[0])
print('根據(jù)鍵排序',b)
new_dic = {i[0]:i[1] for i in b}
print('字典推倒式構(gòu)造新字典',new_dic)
>>>字典轉(zhuǎn)成列表嵌套元組 dict_items([('name', 'zs'), ('sex', 'man'), ('city', 'bj')])
根據(jù)鍵排序 [('city', 'bj'), ('name', 'zs'), ('sex', 'man')]
字典推倒式構(gòu)造新字典 {'city': 'bj', 'name': 'zs', 'sex': 'man'}
Q74. 列表推導(dǎo)式秽褒、字典推導(dǎo)式壶硅、生成器
答:
>>> import random
>>> td_list = [i for i in range(10)]
>>> print('列表推導(dǎo)式',td_list,type(td_list))
列表推導(dǎo)式 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>
>>> ge_list=(i for i in range(10))
>>> print('生成器',ge_list)
生成器 <generator object <genexpr> at 0x00000200A4BD4570>
>>> dic = {k:random.randint(4,9) for k in ['a','b','c','d']}
>>> print('字典推導(dǎo)式',dic,type(dic))
字典推導(dǎo)式 {'a': 7, 'b': 5, 'c': 8, 'd': 5} <class 'dict'>
Q75. 根據(jù)字符串長(zhǎng)度進(jìn)行排序威兜。
答:
>>> s = ['ab','abc','a','djsk']
>>> b = sorted(s,key=lambda x:len(x))
>>> print(b,s)
['a', 'ab', 'abc', 'djsk'] ['ab', 'abc', 'a', 'djsk']
>>> s.sort(key=len) #sort無返回值,在s自身修改
>>> print(s)
['a', 'ab', 'abc', 'djsk']
Q76. s = 'info:xiaozhang 33 shandong'庐椒,用正則切分字符串輸出['info','xiaozhang','33','shandong']椒舵。
答:| 表示或,根據(jù)冒號(hào)或空格進(jìn)行切分约谈。
>>> import re
>>> s = 'info:xiaozhang 33 shandong'
>>> res = re.split(r':| ',s)
>>> print(res)
['info', 'xiaozhang', '33', 'shandong']
Q77. 正則匹配以163.com結(jié)尾的郵箱笔宿。
答:
import re
email_list = ['xiaowang@163.com','xiaowang@163.comhei','xiaowang@qq.com','xiaos@163.com']
for email in email_list:
ret = re.match('[\w]{4,20}@163\.com$',email)
if ret:
print('%s 是符合規(guī)定的郵箱地址,匹配后的結(jié)果是:%s' % (email,ret.group()))
else:
print('%s 不符合要求'% email)
>>>
xiaowang@163.com 是符合規(guī)定的郵箱地址窗宇,匹配后的結(jié)果是:xiaowang@163.com
xiaowang@163.comhei 不符合要求
xiaowang@qq.com 不符合要求
xiaos@163.com 是符合規(guī)定的郵箱地址措伐,匹配后的結(jié)果是:xiaos@163.com
Q78. 遞歸求和
答:
# 遞歸求1—10累加的和
def get_sum(num):
if num>=1:
res = num + get_sum(num-1)
else:
res = 0
return res
res = get_s
um(10)
print(res)
>>>55
Q79. python字典和json字符串相互轉(zhuǎn)化方法特纤。
答:json.dumps():字典轉(zhuǎn)json字符串 军俊,json.loads():json轉(zhuǎn)字典
import json
dic = {'name':'zs'}
res = json.dumps(dic) # 字典轉(zhuǎn)json字符串
print(res,type(res))
ret = json.loads(res) # json字符串轉(zhuǎn)字典
print(ret,type(ret))
>>>
{"name": "zs"} <class 'str'>
{'name': 'zs'} <class 'dict'>
Q80. 統(tǒng)計(jì)字符串中某字符出現(xiàn)的次數(shù)
答:
str = '張三 美國(guó) 張三 哈哈 張 三'
res = str.count('張三')
print(res)
>>>2
Q81. 字符串轉(zhuǎn)換大小寫。
答:
str = 'HHHuuu'
print(str.upper())
print(str.lower())
>>>
HHHUUU
hhhuuu
Q82. 用兩種方法去空格捧存。
答:
str = 'hello world ha ha'
res = str.replace(' ','')
print(res)
list = str.split(' ')
print(list)
ret = ''.join(list)
print(ret)
>>>
helloworldhaha
['hello', 'world', 'ha', 'ha']
helloworldhaha
Q83. 正則匹配不是以4和7結(jié)尾的手機(jī)號(hào)
答:
import re
tels = ['13100001234','18936774821','10086','17389274827']
for tel in tels:
ret = re.match('1\d{9}[0-3,5-6,8-9]',tel)
if ret:
print('想要的結(jié)果',ret.group())
else:
print('%s 不是想要的手機(jī)號(hào)' % tel)
>>>
13100001234 不是想要的手機(jī)號(hào)
想要的結(jié)果 18936774821
10086 不是想要的手機(jī)號(hào)
17389274827 不是想要的手機(jī)號(hào)
Q84. 正則表達(dá)式匹配第一個(gè)url粪躬。
答:findall結(jié)果無需加group(),search需要加group()提取昔穴。
import re
s = '<img data-original="https://ridc.sfhfh.cn/sffha/dghha/shams.jpg" src="https://shfsk/safj.jpg" dhdfksk;>'
res = re.findall(r"https://.*?\.jpg",s)[0]
print(res)
ret = re.search(r"https://.*?\.jpg",s)
print(ret.group())
>>>
https://ridc.sfhfh.cn/sffha/dghha/shams.jpg
https://ridc.sfhfh.cn/sffha/dghha/shams.jpg
Q85. 正則匹配中文镰官。
答:
import re
title = '你好,hello,世界'
pattern = re.compile(r'[\u4e00-\u9fa5]+') # 中文的 unicode 編碼范圍 主要在 [u4e00-u9fa5]
result = pattern.findall(title)
print(result)
>>>['你好', '世界']
Q86. r吗货、r+泳唠、rb、rb+文件打開模式區(qū)別
答:
Q87. 正則表達(dá)式匹配出<html><h1>www.itcast.cn</h1></html>
答:
import re
labels = ['<html><h1>www.itcast.cn</h1></html>','<html><h1>www.itcast.cn</h2></html>']
for label in labels:
ret = re.match(r'<(\w*)><(\w*)>.*?</\2></\1>',label)
if ret:
print('%s 是符合要求的標(biāo)簽'% ret.group())
else:
print('%s 不符合要求'% label)
>>>
<html><h1>www.itcast.cn</h1></html> 是符合要求的標(biāo)簽
<html><h1>www.itcast.cn</h2></html> 不符合要求
Q88. python傳參數(shù)是傳值還是傳址宙搬?
答:Python中函數(shù)參數(shù)是引用傳遞(注意不是值傳遞)笨腥。對(duì)于不可變類型(數(shù)值型、字符串勇垛、元組)脖母,因變量不能修改,所以運(yùn)算不會(huì)影響到變量自身闲孤;而對(duì)于可變類型(列表谆级、字典)來說,函數(shù)體運(yùn)算可能會(huì)更改傳入的參數(shù)變量讼积。
def selfAdd(a):
a += a
a_int = 1
print(a_int)
selfAdd(a_int)
print(a_int)
a_list = [1,2]
print(a_list)
selfAdd(a_list)
print(a_list)
>>>
1
1
[1, 2]
[1, 2, 1, 2]
Q89. 求兩個(gè)列表的交集肥照、差集、并集勤众。
答:
>>> a = [1,2,3,4]
>>> b = [4,3,5,6]
>>> jj1 = [i for i in a if i in b] # 在a中的i,并且也在b中舆绎,就是交集
>>> print('交集',jj1)
交集 [3, 4]
>>> jj2 = list(set(a).intersection(set(b))) #求交集的函數(shù)
>>> print('交集',jj2)
交集 [3, 4]
>>> bj1 = list(set(a).union(set(b))) # 用union求并集
>>> print('并集',bj1)
并集 [1, 2, 3, 4, 5, 6]
>>> cj1 = list(set(b).difference(set(a))) # b中有而a中沒有
>>> print('差集,b中有而a中沒有:',cj1)
差集决摧,b中有而a中沒有: [5, 6]
>>> cj1 = list(set(a).difference(set(b))) # a中有而b中沒有
>>> print('差集亿蒸,a中有而b中沒有:',cj1)
差集凑兰,a中有而b中沒有: [1, 2]
Q90. 生成0~100的隨機(jī)數(shù)
答:random.random()生成0~1之間的隨機(jī)小數(shù),所以乘100.
import random
res1 = 100*random.random() #隨機(jī)小數(shù)
res2 = random.choice(range(0,101)) #隨機(jī)整數(shù)
res3 = random.randint(1,100) #隨機(jī)整數(shù)
print(res1)
print(res2)
print(res3)
>>>
95.76401356168898
40
30
Q91. lambda匿名函數(shù)的好處
答:精簡(jiǎn)代碼边锁,lambda省去了定義函數(shù)姑食,map省去了寫for循環(huán)過程。
>>> a = ['蘇州','中國(guó)','','hh','','效率','']
>>> res = list(map(lambda x:'填充值' if x == '' else x,a))
>>> print(res)
['蘇州', '中國(guó)', '填充值', 'hh', '填充值', '效率', '填充值']
Q92. 常見的網(wǎng)絡(luò)傳輸協(xié)議茅坛。
答:UDP音半、TCP、FTP贡蓖、HTTP曹鸠、SMTP等等。
Q93. HTTP請(qǐng)求中g(shù)et和post區(qū)別斥铺。
答:
- GET請(qǐng)求是通過URL直接請(qǐng)求數(shù)據(jù)彻桃,數(shù)據(jù)信息可以在URL中直接看到,比如瀏覽器訪問晾蜘;而POST請(qǐng)求是放在請(qǐng)求頭中的邻眷,我們是無法直接看到的;
- GET提交有數(shù)據(jù)大小的限制剔交,一般是不超過1024個(gè)字節(jié)肆饶,而這種說法也不完全準(zhǔn)確,HTTP協(xié)議并沒有設(shè)定URL字節(jié)長(zhǎng)度的上限岖常,而是瀏覽器做了些處理驯镊,所以長(zhǎng)度依據(jù)瀏覽器的不同有所不同;POST請(qǐng)求在HTTP協(xié)議中也沒有做說明竭鞍,一般來說是沒有設(shè)置限制的板惑,但是實(shí)際上瀏覽器也有默認(rèn)值×耄總體來說洒放,少量的數(shù)據(jù)使用GET,大量的數(shù)據(jù)使用POST滨砍。
- GET請(qǐng)求因?yàn)閿?shù)據(jù)參數(shù)是暴露在URL中的往湿,所以安全性比較低,比如密碼是不能暴露的惋戏,就不能使用GET請(qǐng)求领追;POST請(qǐng)求中,請(qǐng)求參數(shù)信息是放在請(qǐng)求頭的响逢,所以安全性較高绒窑,可以使用。在實(shí)際中舔亭,涉及到登錄操作的時(shí)候些膨,盡量使用HTTPS請(qǐng)求蟀俊,安全性更好。
Q94. python中讀取Excel文件的方法订雾。
答:應(yīng)用數(shù)據(jù)分析庫(kù)pandas
import pandas as pd
df = pd.read_excel('123.xlsx')
print(df)
Q95. 簡(jiǎn)述多線程肢预、多進(jìn)程。
答:
進(jìn)程
- 操作系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位洼哎,多個(gè)進(jìn)程之間相互獨(dú)立烫映。
- 穩(wěn)定性好,如果一個(gè)進(jìn)程崩潰噩峦,不影響其他進(jìn)程锭沟,但是進(jìn)程消耗資源大,開啟的進(jìn)程數(shù)量有限制识补。
線程 - CPU進(jìn)行資源分配和調(diào)度的基本單位族淮,線程是進(jìn)程的一部分,是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位李请,一個(gè)進(jìn)程下的多個(gè)線程可以共享該進(jìn)程的所有資源瞧筛;
- 如果IO操作密集,則可以多線程運(yùn)行效率高导盅,缺點(diǎn)是如果一個(gè)線程崩潰,都會(huì)造成進(jìn)程的崩潰揍瑟。
應(yīng)用 - IO密集的用多線程白翻,在用戶輸入,sleep 時(shí)候绢片,可以切換到其他線程執(zhí)行滤馍,減少等待的時(shí)間;
- CPU密集的用多進(jìn)程底循,因?yàn)榧偃鏘O操作少巢株,用多線程的話,因?yàn)榫€程共享一個(gè)全局解釋器鎖熙涤,當(dāng)前運(yùn)行的線程會(huì)霸占GIL阁苞,其他線程沒有GIL,就不能充分利用多核CPU的優(yōu)勢(shì)祠挫。
Q96. python正則中search和match
答:
import re
s = '小明年齡18歲 工資10000'
res = re.search(r'\d+',s).group()
print('search結(jié)果(匹配到第一個(gè)匹配的數(shù)據(jù))',res)
res = re.findall(r'\d+',s)
print('findall結(jié)果(滿足正則那槽,都匹配,不用加group())',res)
res = re.match('小明',s).group()
print('match結(jié)果(匹配‘小明’開頭的字符串等舔,并匹配出小明)',res)
res = re.match('工資',s).group()
print('match結(jié)果(‘工資’不是字符串開頭骚灸,匹配不到,報(bào)錯(cuò))',res)
>>>
search結(jié)果(匹配到第一個(gè)匹配的數(shù)據(jù)) 18
findall結(jié)果(滿足正則慌植,都匹配甚牲,不用加group()) ['18', '10000']
match結(jié)果(匹配‘小明’開頭的字符串义郑,并匹配出小明) 小明
Traceback (most recent call last):
File "C:/Users/dybhh/Desktop/pypractice/100-96.py", line 12, in <module>
res = re.match('工資',s).group()
AttributeError: 'NoneType' object has no attribute 'group'