Python 百度面试题
1、
def f(x,l=[]):for i in range(x):l.append(i*i)print(l) f(2) f(3,[3,2,1]) f(3)考查知識點:列表,深淺copy。弄清楚就ok
[0, 1] [3, 2, 1, 0, 1, 4] [0, 1, 0, 1, 4]2、
用python , 123456789變成987654321’
太簡單
考查知識點:切片
3、
python 的re模塊中match() search()findall() compile()的區別
match與search函數功能一樣,match匹配字符串開始的第一個位置,search是在字符串全局匹配第一個符合規則的。 簡單來說就是:re.match與re.search的區別:re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。 re.findall函數返回的總是正則表達式在字符串中所有匹配結果的列表list,此處主要討論列表中“結果”的展現方式,即findall中返回列表中每個元素包含的信息。 使用re的一般步驟是先使用re.compile()函數,將正則表達式的字符串形式編譯為Pattern實例, 然后使用Pattern實例處理文本并獲得匹配結果(一個Match實例),最后使用Match實例獲得信息,進行其他的操作。4、a/b/…/./c/test.jpg變成a/c/test.jpg
為上一級為本級
稍微欠缺的方法,這個寫死了:
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' s="a/b/.././c/test.jpg" s1=s.split("/") s1.pop(s1.index("..")-1) s1.pop(s1.index("..")) s1.pop(s1.index(".")) l = [] for i in s1:l.append(i) print("/".join(l))正常思路:
s="a/b/.././c/test.jpg" s1=s.split("/") l = [] for i in s1:if i == "..":l.pop()elif i == ".":continueelse:l.append(i) print("/".join(l))考查知識點:列表的幾個常用方法
5、
99乘法表
for x in range(1, 10):for y in range(1, x+1):print("%s*%s=%s" % (y, x, x * y), end=' ')print() # print默認參數‘換行’,沒有此條語句輸出打印時將不會換行一行代碼實現:
print('\n'.join([' '.join(['{}*{}={}'.format(y,x,y*x) for y in range(1, x+1)]) for x in range(1,10)]))6、
找到1000以內的龍騰數,各個位數的和為5的數為龍騰數 for i in range(1000):a = i // 100 # 獲得百位上的數字b = i // 10 % 10 # 獲得十位數的數字c = i % 10 # 獲得個位數的數字if a + b + c == 5:print(i)主要思路:怎么獲取百位數字,用這個數整除100就會得到百位上的數字
怎么獲取十位數字,用這個數整除10再對10取余,就會得到十位上的數字
怎么獲取個位上的數字,用這個數對10取余就會得到個位上的數字
7、
python給一個有序列表,求出插入值的索引
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def index(nlist, k):if k < nlist[0]: # 假如插入的元素比第一個元素小,則就直接插在第一個元素的位置,第一個元素的索引是0p = 0elif k > nlist[-1]: # 假如插入的元素比最后一個元素大,則就直接插在最后元素的位置,最后一個元素的索引為len(l)-1p = len(nlist) - 1else: p = 0 # p=0歸位for item in nlist: # 然后對傳過來的列表進行循環打印if k < item: # 判斷插入的元素的大小break # 直到插入的元素大于item了p += 1return plis = [1, 3, 5, 7, 8, 9, 11] result = index(lis, 10) print(result)8、
賦值是指向同一個對象嗎
在python中,對象的賦值就是簡單的對象引用 賦值操作(包括對象作為參數、返回值)不會開辟新的內存空間,它只是復制了新對象的引用。也就是說,除了list_b這個名字以外,沒有其它的內存開銷。 淺拷貝會創建新對象,其內容是原對象的引用。 深拷貝:和淺拷貝對應,深拷貝拷貝了對象的所有元素,包括多層嵌套的元素。因而,它的時間和空間開銷要高。 總結:賦值是指的同一個對象。 深淺拷貝都是創建了新對象。 賦值就是內存地址給另外一個被賦值的變量。 淺copy是第一層復制,創建新的內存地址,二層以上的內存地址不變。 深copy是完全復制,創建新的對象,跟被copy的對象沒有聯系9、
s1="aabacbcccab"輸出連續的最多的那個數 s1="aabacbcccab" li = [] count = 0 for i in list(s1):if not li:li.append(i)elif li[0] == i:li.append(i)if count < len(li):s = li[-1]count = len(li)else:li = []li.append(i) print(count, s)10、
s=[“a”,“b”,“c”,“d”,“e”,“f”]變成s1=[“a”,“e”,“d”,“c”,“b”,“f”]
s=["a","b","c","d","e","f"] s[1:5:1]=s[-2:0:-1] print(s)11、
題目:計算字符串倒數第二個單詞的長度,單詞以空格隔開。輸入一行字符串,非空,長度小于2000。 最后給出一個整數N,即倒數第二個單詞的長度。 示例 : 輸入:hello my world 輸出:2 s = input("請輸入一個字符串:") len = len(s.split()[-2:][0]) print(len)12、
哥德巴赫猜想:任一大于2的偶數都可寫成兩個質數之和,驗證輸入一個偶數,將所有的符合條件的等式輸出,如下所示 請輸入一個任意的偶數:22 22=3+19 22=5+17 22=11+11 ''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' import math def isEven(num):# 判斷是否是偶數if num % 2 == 0:return Trueelse:return Falsedef isPrime(n): #判斷素數if n == 1:return Falseelif n == 2:return Trueelse:for i in range(2,int(math.sqrt(n)+1)):if n%i == 0:return Falsereturn Truedef isNum(string):# 判斷是否是數值if string.isdigit():return Trueelse:return Falserespone = input('請輸入一個大于2的偶數:') if isNum(respone): #判斷輸入是否為整數respone = int(respone) #判斷是否是大于2的偶數if (respone > 2) and isEven(respone):#進行猜想判斷i_list = []for i in range(1,respone):j = respone - i #分解為兩個數字# print(j,i)if isPrime(i) and isPrime(j):i_list.append(i) #記錄已顯示的數字# print(i_list)if j in i_list and j != i:passelse:print('{0} = {1} + {2}'.format(respone, i, j))else:print('輸入錯誤!') else:print('輸入錯誤!')下面那個語句Python中是非法的
A、x=y=z=1 B、x=(y=z+1) C、x,y=y,x D、x + =y
答案:B 原因:因為將 x = (y = z + 1) 中右半部分括起來后,相當于把一個賦值表達式賦值給變量 x,因此出現語法錯誤。等號右邊是不能賦值的。 其實把x = (y = z + 1) 改為x = y = z + 1 這樣是正確的 這才是正確的賦值語句,這種賦值方式可稱為 連續賦值、批量賦值、多元賦值、多變量賦值 等14、關于python內存管理,下列說法錯誤的是
A、變量不必事先聲明 B、變量無須先創建和賦值而直接使用 C、變量無須指定類型 D、可以使用del釋放資源
答案:B 原因:變量如果不賦值的話,會報錯。is not defined15、下面哪個不是Python合法的標識符
A、int32 B、40XL C、self D、name
變量的規則:變量名只能是字母,數字或者下劃線的任意組合 但是變量名的第一個字符不能是數字16、下列哪種說法是錯誤的
A、除字典類型外,所有標準對象均可以用于布爾測試
B、空字符串的布爾值是False
C、空列表對象的布爾值是False
D、值為0的任何數字對象的布爾值是False
空字符串或空列表等不代表值為0,值為0是a=0,BOOL為TRUe17、下列表達式的值為True的是
A、5+4j >2-3j B、3>2>2
C、(3,2)<(‘a’,‘b’) D、’abc’ > ‘xyz’ # abc<xyz
C (在Py2.x版本中正確,在Py3.x運行錯誤)18、Python不支持的數據類型有
A、char B、int C、float D、list
答案:A(python里無char型數據,有string字符串類型;但C語言中有char數據類型)
19、關于Python中的復數,下列說法錯誤的是
A、表示復數的語法是real + imagej B、實部和虛部都是浮點數
C、虛部必須后綴j,且必須是小寫 D、方法conjugate返回復數的共軛復數
C(復數虛部的后綴也可以是大寫的J)20、關于字符串下列說法錯誤的是
A、字符應該視為長度為1的字符串
B、字符串以\0標志字符串的結束
C、既可以用單引號,也可以用雙引號創建字符串
D、在三引號字符串中可以包含換行回車等特殊字符
python因為字符串有長度限制,到了長度就標志字符串的結束21、以下不能創建一個字典的語句是
A、dict1 = {} B、dict2 = { 3 : 5 }
C、dict3 ={[1,2,3]: “uestc”} D、dict4 = {(1,2,3): “uestc”}
C(字典的鍵必須是不變的,而列表是可變的)可變數據類型如果改變值的話,其中內存地址是不變的,所以可以任意的修改里邊的值,這就是可變數據類型
不可變數據類型就是如果改變值的話,內存地址也會改變。
例如:
22、下列Python語句正確的是:
A、min = x if x < y = y
B、max = x > y ?x:y
C、if (x >y) print x
D、while True :pass
23、在(etc/ftab 文件中指定的文件系統加載參數中,以下參數般用于 CD-ROM等移動設備的是
A、defaults B、sW C、rw和ro D、noauto
參數 default表示和使用默認設置sw 表示自動掛載的可讀寫分區ro 表示掛載只讀權限的rw 表示掛載讀寫權限的 所以選擇D。表示手動掛載的,也用于CD-ROW等移動設備24、Linux文件權限一共10位長度,分成四段,第三段表示的內容是()。
A、文件類型 B、文件所有者的權限 C、文件所有者所在組的權限 D、其他用戶的權限
- rwx rwx rwx 類型 用戶權限 用戶所在組權限 其他用戶權限25、__ new __ 和__ init __ 有什么區別
__init__實際上不能算得上的構造函數,__new__才能創建實例的方法。 __init__是當實例對象創建完成后被調用的,然后設置對象屬性的一些初始值。 __new__是在實例創建之前被調用的,因為他的任務就是創建實例然后返回該實例,是個靜態方法。 也就是__new__是在__init__之前被調用的,__new__的返回值(實例)將傳遞給__init__方法的第一個參數,然后__init__給這個實例設置一些參數26、python是解釋型語言嗎?會編譯嗎?pyc文件是什么?
Python是一門解釋性語言,直到發現了*.pyc文件的存在。如果是解釋型語言,那么生成的pyc文件又是什么? 編譯型語言在程序執行之前,先會通過編譯器對程序執行一個編譯的過程,把程序轉變成機器語言。運行時就不需要翻譯,而直接執行就可以了。最典型的例子就是C語言。 解釋型語言就沒有這個編譯的過程,而是在程序運行的時候,通過解釋器對程序逐行作出解釋,然后直接運行,最典型的例子是Ruby。 但是我們也不能一概而論,一些解釋型語言也可以通過解釋器的優化來在對程序做出翻譯時對整個程序做出優化,從而在效率上超過編譯型語言。 在程序運行期間,編譯結果存在于內存的PyCodeObject對象中,當Python結束運行后,編譯結果會被保存到pyc文件中, 在下一次運行相同程序時,Python會根據pyc文件中記錄的編譯結果直接在內存中重新建立PyCodeObject對象,而不用再次對源文件進行編譯。 PyCodeObject結構體在C源代碼中有相應的聲明,Python的import機制會觸發pyc文件的生成, 實際這不是生成pyc文件的唯一姿勢。我們可以通過compile內建函數來查看這個PyCodeObject對象的一些信息 pyc文件是導包或者是引用的時候產生的,舉個例子我有一個b.py文件,我從a.py中引用b.py文件,執行a.py文件時,就會產生b.py文件的pyc文件, 這個pyc文件是字節碼文件。當再次運行a.py時,如果a.py沒有發生變化,則運行pyc文件,當a.py發生變化時,就會重新生成pyc文件,然后在執行pyc文件。 pyc文件是再次轉化成機器碼才執行的。還有那個正在運行的py文件,在未運行的代碼處修改時不會執行的,也就是運行原代碼,原因是代碼是加載到內存中執行的,你手動修改時只是在硬盤中的。27、生成器、迭代器的區別
可以被迭代要滿足的要求就叫做可迭代協議。可迭代協議的定義非常簡單,就是內部實現了__iter__方法。 可以被for循環的都是可迭代的,要想可迭代,內部必須有一個__iter__方法。 迭代器遵循迭代器協議:必須擁有__iter__方法和__next__方法。 我們知道的迭代器有兩種:一種是調用方法直接返回的,一種是可迭代對象通過執行iter方法得到的,迭代器有的好處是可以節省內存。如果在某些情況下,我們也需要節省內存,就只能自己寫。我們自己寫的這個能實現迭代器功能的東西就叫生成器。 yield可以為我們從函數中返回值,但是yield又不同于return,return的執行意味著程序的結束, 調用生成器函數不會得到返回的具體的值,而是得到一個可迭代的對象。每一次獲取這個可迭代對象的值,就能推動函數的執行,獲取新的返回值。直到函數執行結束。 ''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' import time def func1():a=1print("a變量")yield ab=2print("b變量")yield bg1=func1() print(g1) print(next(g1)) # next一次,取出來一次值 print(next(g1)) # 再next一次,再取值 def func():print(123)content = yield 1print("——",content)print(333)yield 2 g = func() # ret = g.__next__() # print("****",ret) print(next(g)) ret = g.send("hh") #send的效果和next一樣 print(ret)#send 獲取下一個值的效果和next基本一致 #只是在獲取下一個值的時候,給上一yield的位置傳遞一個數據 #使用send的注意事項# 第一次使用生成器的時候 是用next獲取下一個值# 最后一個yield不能接受外部的值 #列表解析 sum([i for i in range(100000000)])#內存占用大,機器容易卡死#生成器表達式 sum(i for i in range(100000000))#幾乎不占內存使用生成器的優點:
1.延遲計算,一次返回一個結果。也就是說,它不會一次生成所有的結果,這對于大數據量處理,將會非常有用。 2.提高代碼可讀性28、@classmethod和@staticmethod的區別
@classmethod和@staticmethod都可以不實例化類而直接使用類名.類方法名()的方式進行調用,二者都是修飾方式。 區別就是當基類被刪除時,再次使用@staticmethod方式進行調用時,會報錯;但是@classmethod不會受到影響。可以繼續使用。 @classmethod和@staticmethod都不需要再傳入self,但是@classmethod裝飾的函數第一位必須傳入一個參數, 多用cls,這個cls則代表當前的類。其他參數則看自己的使用情況進行傳參。 class A(object):a = "哈哈哈"def b(self):return self.a@staticmethoddef c():return A.a@classmethoddef d(cls):return cls.aclass B(A):pass print(A.a) print(A.b()) # 報錯 必須實例化類才可以 print(A.c()) print(A.d()) del A # print(B.a) print(B.b()) # 報錯 必須實例化類 print(B.c()) #報錯 A not defined print(B.d())29、判斷回文多種方式
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # 方法一:遞歸切片def is_huiwen(s):if len(s) < 2:return Trueif s[0] == s[-1]:return is_huiwen(s[1:-1])else:return Falseprint(is_huiwen("abcdcba")) # 方法二:將首尾依次對比 s = input("請輸入一個字符串:") if not s:print("請不要輸入空字符串:")s = input("請重新輸入一個字符串:") a = len(s) i = 0 count = 1 while i <= (a/2):if s[i] == s[a-i-1]:count = 1i +=1else:count = 0break if count == 1:print("您輸入的字符串是回文") else:print("您輸入的字符串不是回文") # 方法三:reversed()方法 s = input("請輸入一個字符串:") if not s:print("請不要輸入空字符串")s = input("請重新輸入一個字符串") s1 = reversed(list(s)) if list(s1) == list(s):print("您輸入的是一個回文字符串") else:print("您輸入的不是一個回文字符串")30、寫代碼尋找一個字符串中的所有回文子串,回文串是一個正讀和反讀都一樣的字符串,比如“level”或者“noon”等就是回文串。
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def is_huiwen(s):# 判斷當前字符串是否是回文字符串for i in range(len(s)):if s[i] != s[len(s)-i-1]:return Falsereturn Truedef find_huiwen(s):huiwenchuan = []for i in range(len(s)):for j in range(i+1,len(s)):s1 = s[i:j+1]if is_huiwen(s1):huiwenchuan.append(s1)return huiwenchuanif __name__ == '__main__':s = "aabcbaadedffcde"huiwen = find_huiwen(s)print(huiwen)31、編寫一個查詢及打印功能的話數要求能在當前目錄以及當前目錄的所有子目錄下查找文件名包含指定字符串的文件。井打印出完整路徑
import osdef search_file(path, str): # 傳入當前的絕對路徑以及指定字符串# 首先先找到當前目錄下的所有文件for file in os.listdir(path): # os.listdir(path)是當前這個path路徑下的所有文件的列表this_path = os.path.join(path, file)if os.path.isfile(this_path): # 判斷這個路徑對應的是目錄還是文件,是文件就走下去if str in file:print(this_path)else: # 不是就再繼續再次執行這個函數,遞歸下去search_file(this_path, str) # 遞歸else:return Nonesearch_file(os.path.abspath("."), "t") # 返回path規范化的絕對路徑 os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄 os.removedirs('dirname1') 若目錄為空,則刪除,并遞歸到上一級目錄,如若也為空,則刪除,依此類推 os.mkdir('dirname') 生成單級目錄;相當于shell中mkdir dirname os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當于shell中rmdir dirname os.listdir('dirname') 列出指定目錄下的所有文件和子目錄,包括隱藏文件,并以列表方式打印 os.remove() 刪除一個文件 os.rename("oldname","newname") 重命名文件/目錄 os.stat('path/filename') 獲取文件/目錄信息os.system("bash command") 運行shell命令,直接顯示 os.popen("bash command).read() 運行shell命令,獲取執行結果 os.getcwd() 獲取當前工作目錄,即當前python腳本工作的目錄路徑 os.chdir("dirname") 改變當前腳本工作目錄;相當于shell下cdos.path os.path.abspath(path) 返回path規范化的絕對路徑 os.path.split(path) 將path分割成目錄和文件名二元組返回 os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素 os.path.basename(path) 返回path最后的文件名。如何path以/或\結尾,那么就會返回空值。即os.path.split(path)的第二個元素 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是絕對路徑,返回True os.path.isfile(path) 如果path是一個存在的文件,返回True。否則返回False os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False os.path.join(path1[, path2[, ...]]) 將多個路徑組合后返回,第一個絕對路徑之前的參數將被忽略 os.path.getatime(path) 返回path所指向的文件或者目錄的最后訪問時間 os.path.getmtime(path) 返回path所指向的文件或者目錄的最后修改時間 os.path.getsize(path) 返回path的大小百度面試總結
基礎知識點
列表:切片
當時第一反應就是普通思路
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # 1、l = [2, 3, 4, 7, 9] 用切片實現取出偶數位+1的值求和 l = [2, 3, 4, 7, 9] l1 = l[::2] sum = 0 for i in l1:i1 = i + 1sum += i1 print(sum)但是面試官提醒說用lambda會更簡單
l = [2, 3, 4, 7, 9] print((lambda l: sum(l[::2])+len(l[::2]))(l))數據庫:
table: user|dep|salary uuu | A |22222 jjj | B |3333 kkk | C |33333 kas | A |3456查詢部門中前三名的工資(原生sql)
select * from t1 order by salary desc limit 3;用django實現
ret = models.Userinfo.objects.values("salary").order_by("salary").reverse().values("dept","salary")[:3]或者 reverse = 對order_by 數據反向排序和 - 字段 一樣 ret = models.Userinfo.objects.values("salary").order_by("-salary").values("dept","salary")[:3]查詢各部門的員工工資總和
select sum(salary) from t1 group by dep用django實現
from django.db.models import Sum models.Userinfo.objects.values("dept").annotate(sum=Sum("salary")).values("dept", "sum")CORS跨域問題:
目前基本上主流的瀏覽器都支持CORS。所以只要后端服務支持CORS,就能夠實現跨域。
簡單請求的處理方式:
在跨域場景下,當瀏覽器發送簡單請求時,瀏覽器會自動在請求頭中添加表明請求來源的 Origin 字段
我們的后端程序只需要在返回的響應頭中加上 Access-Control-Allow-Origin 字段,并且把該字段的值設置為 跨域請求的來源地址或簡單的設置為 * 就可以了。
例如:我們可以在Django中間件中的process_response方法來給相應對象添加該字段。
非簡單請求的處理方式:
我們開發中常用到的那些請求方法是PUT或DELETE,或者Content-Type字段的類型是application/json的都是非簡單請求。
對于非簡單請求,瀏覽器通常都會在請求之前發送一次 OPTIONS 預檢 請求。該請求會像后端服務詢問是否允許從當前源發送請求并且詢問允許的 請求方法 和 請求頭字段。
解決辦法也很簡單,我們可以在后端簡單的給響應對象添加上 常用請求方法(PUT、DELETE)的支持就可以了。
from django.utils.deprecation import MiddlewareMixinclass CorsMiddleware(MiddlewareMixin):def process_response(self, request, response):# 給響應頭加上 Access-Control-Allow-Origin 字段 并簡單的設置為 *response['Access-Control-Allow-Origin'] = '*'if request.method == 'OPTIONS':# 允許發送 PUT 請求response['Access-Control-Allow-Methods'] = 'PUT, DELETE'# 允許在請求頭中攜帶 Content-type字段,從而支持發送json數據response['Access-Control-Allow-Headers'] = 'Content-type'return response使用django-cors-headers
我們這個中間件確實能解決目前的CORS跨域問題,但是我們的土方法肯定是不夠嚴謹的,已經有人造好輪子-- django-cors-headers 了。
我們只需要安裝這個包,然后按需要配置一下就可以了。
安裝
pip install django-cors-headers注冊APP
INSTALLED_APPS = [...'app01.apps.App01Config','corsheaders', # 將 corsheaders 這個APP注冊 ]添加中間件
必須放在最前面,因為要先解決跨域的問題。只有允許跨域請求,后續的中間件才會正常執行。
MIDDLEWARE = ['corsheaders.middleware.CorsMiddleware', # 添加中間件'django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware', ]配置
你可以選擇不限制跨域訪問
CORS_ORIGIN_ALLOW_ALL = True或者你可以選擇設置允許訪問的白名單
CORS_ORIGIN_ALLOW_ALL = False CORS_ORIGIN_WHITELIST = (# '<YOUR_DOMAIN>[:PORT]','127.0.0.1:8080' )總結
以上是生活随笔為你收集整理的Python 百度面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RS(纠删码)技术浅析及Python实现
- 下一篇: python中break、continu