日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 百度面试题

發(fā)布時間:2025/3/20 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 百度面试题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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()的區(qū)別

match與search函數(shù)功能一樣,match匹配字符串開始的第一個位置,search是在字符串全局匹配第一個符合規(guī)則的。 簡單來說就是:re.match與re.search的區(qū)別:re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數(shù)返回None;而re.search匹配整個字符串,直到找到一個匹配。 re.findall函數(shù)返回的總是正則表達式在字符串中所有匹配結(jié)果的列表list,此處主要討論列表中“結(jié)果”的展現(xiàn)方式,即findall中返回列表中每個元素包含的信息。 使用re的一般步驟是先使用re.compile()函數(shù),將正則表達式的字符串形式編譯為Pattern實例, 然后使用Pattern實例處理文本并獲得匹配結(jié)果(一個Match實例),最后使用Match實例獲得信息,進行其他的操作。

4、a/b/…/./c/test.jpg變成a/c/test.jpg

為上一級為本級

稍微欠缺的方法,這個寫死了:

''' 遇到問題沒人解答?小編創(chuàng)建了一個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默認參數(shù)‘換行’,沒有此條語句輸出打印時將不會換行

一行代碼實現(xiàn):

print('\n'.join([' '.join(['{}*{}={}'.format(y,x,y*x) for y in range(1, x+1)]) for x in range(1,10)]))

6、

找到1000以內(nèi)的龍騰數(shù),各個位數(shù)的和為5的數(shù)為龍騰數(shù) for i in range(1000):a = i // 100 # 獲得百位上的數(shù)字b = i // 10 % 10 # 獲得十位數(shù)的數(shù)字c = i % 10 # 獲得個位數(shù)的數(shù)字if a + b + c == 5:print(i)

主要思路:怎么獲取百位數(shù)字,用這個數(shù)整除100就會得到百位上的數(shù)字

怎么獲取十位數(shù)字,用這個數(shù)整除10再對10取余,就會得到十位上的數(shù)字

怎么獲取個位上的數(shù)字,用這個數(shù)對10取余就會得到個位上的數(shù)字

7、

python給一個有序列表,求出插入值的索引

''' 遇到問題沒人解答?小編創(chuàng)建了一個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: # 然后對傳過來的列表進行循環(huán)打印if k < item: # 判斷插入的元素的大小break # 直到插入的元素大于item了p += 1return plis = [1, 3, 5, 7, 8, 9, 11] result = index(lis, 10) print(result)

8、

賦值是指向同一個對象嗎

在python中,對象的賦值就是簡單的對象引用 賦值操作(包括對象作為參數(shù)、返回值)不會開辟新的內(nèi)存空間,它只是復制了新對象的引用。也就是說,除了list_b這個名字以外,沒有其它的內(nèi)存開銷。 淺拷貝會創(chuàng)建新對象,其內(nèi)容是原對象的引用。 深拷貝:和淺拷貝對應,深拷貝拷貝了對象的所有元素,包括多層嵌套的元素。因而,它的時間和空間開銷要高。 總結(jié):賦值是指的同一個對象。 深淺拷貝都是創(chuàng)建了新對象。 賦值就是內(nèi)存地址給另外一個被賦值的變量。 淺copy是第一層復制,創(chuàng)建新的內(nèi)存地址,二層以上的內(nèi)存地址不變。 深copy是完全復制,創(chuàng)建新的對象,跟被copy的對象沒有聯(lián)系

9、

s1="aabacbcccab"輸出連續(xù)的最多的那個數(shù) 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、

題目:計算字符串倒數(shù)第二個單詞的長度,單詞以空格隔開。輸入一行字符串,非空,長度小于2000。 最后給出一個整數(shù)N,即倒數(shù)第二個單詞的長度。 示例 : 輸入:hello my world 輸出:2 s = input("請輸入一個字符串:") len = len(s.split()[-2:][0]) print(len)

12、

哥德巴赫猜想:任一大于2的偶數(shù)都可寫成兩個質(zhì)數(shù)之和,驗證輸入一個偶數(shù),將所有的符合條件的等式輸出,如下所示 請輸入一個任意的偶數(shù):22 22=3+19 22=5+17 22=11+11 ''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' import math def isEven(num):# 判斷是否是偶數(shù)if num % 2 == 0:return Trueelse:return Falsedef isPrime(n): #判斷素數(shù)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):# 判斷是否是數(shù)值if string.isdigit():return Trueelse:return Falserespone = input('請輸入一個大于2的偶數(shù):') if isNum(respone): #判斷輸入是否為整數(shù)respone = int(respone) #判斷是否是大于2的偶數(shù)if (respone > 2) and isEven(respone):#進行猜想判斷i_list = []for i in range(1,respone):j = respone - i #分解為兩個數(shù)字# print(j,i)if isPrime(i) and isPrime(j):i_list.append(i) #記錄已顯示的數(shù)字# 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,因此出現(xiàn)語法錯誤。等號右邊是不能賦值的。 其實把x = (y = z + 1) 改為x = y = z + 1 這樣是正確的 這才是正確的賦值語句,這種賦值方式可稱為 連續(xù)賦值、批量賦值、多元賦值、多變量賦值 等

    14、關(guān)于python內(nèi)存管理,下列說法錯誤的是

    A、變量不必事先聲明 B、變量無須先創(chuàng)建和賦值而直接使用 C、變量無須指定類型 D、可以使用del釋放資源

    答案:B 原因:變量如果不賦值的話,會報錯。is not defined

    15、下面哪個不是Python合法的標識符

    A、int32 B、40XL C、self D、name

    變量的規(guī)則:變量名只能是字母,數(shù)字或者下劃線的任意組合 但是變量名的第一個字符不能是數(shù)字

    16、下列哪種說法是錯誤的

    A、除字典類型外,所有標準對象均可以用于布爾測試

    B、空字符串的布爾值是False

    C、空列表對象的布爾值是False

    D、值為0的任何數(shù)字對象的布爾值是False

    空字符串或空列表等不代表值為0,值為0是a=0,BOOL為TRUe

    17、下列表達式的值為True的是

    A、5+4j >2-3j B、3>2>2

    C、(3,2)<(‘a(chǎn)’,‘b’) D、’abc’ > ‘xyz’ # abc<xyz

    C (在Py2.x版本中正確,在Py3.x運行錯誤)

    18、Python不支持的數(shù)據(jù)類型有

    A、char B、int C、float D、list

    答案:A(python里無char型數(shù)據(jù),有string字符串類型;但C語言中有char數(shù)據(jù)類型)

    19、關(guān)于Python中的復數(shù),下列說法錯誤的是

    A、表示復數(shù)的語法是real + imagej B、實部和虛部都是浮點數(shù)

    C、虛部必須后綴j,且必須是小寫 D、方法conjugate返回復數(shù)的共軛復數(shù)

    C(復數(shù)虛部的后綴也可以是大寫的J)

    20、關(guān)于字符串下列說法錯誤的是

    A、字符應該視為長度為1的字符串

    B、字符串以\0標志字符串的結(jié)束

    C、既可以用單引號,也可以用雙引號創(chuàng)建字符串

    D、在三引號字符串中可以包含換行回車等特殊字符

    python因為字符串有長度限制,到了長度就標志字符串的結(jié)束

    21、以下不能創(chuàng)建一個字典的語句是

    A、dict1 = {} B、dict2 = { 3 : 5 }

    C、dict3 ={[1,2,3]: “uestc”} D、dict4 = {(1,2,3): “uestc”}

    C(字典的鍵必須是不變的,而列表是可變的)

    可變數(shù)據(jù)類型如果改變值的話,其中內(nèi)存地址是不變的,所以可以任意的修改里邊的值,這就是可變數(shù)據(jù)類型

    不可變數(shù)據(jù)類型就是如果改變值的話,內(nèi)存地址也會改變。

    例如:

    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 文件中指定的文件系統(tǒng)加載參數(shù)中,以下參數(shù)般用于 CD-ROM等移動設(shè)備的是

    A、defaults B、sW C、rw和ro D、noauto

    參數(shù) default表示和使用默認設(shè)置sw 表示自動掛載的可讀寫分區(qū)ro 表示掛載只讀權(quán)限的rw 表示掛載讀寫權(quán)限的 所以選擇D。表示手動掛載的,也用于CD-ROW等移動設(shè)備

    24、Linux文件權(quán)限一共10位長度,分成四段,第三段表示的內(nèi)容是()。

    A、文件類型 B、文件所有者的權(quán)限 C、文件所有者所在組的權(quán)限 D、其他用戶的權(quán)限

    - rwx rwx rwx 類型 用戶權(quán)限 用戶所在組權(quán)限 其他用戶權(quán)限

    25、__ new __ 和__ init __ 有什么區(qū)別

    __init__實際上不能算得上的構(gòu)造函數(shù),__new__才能創(chuàng)建實例的方法。 __init__是當實例對象創(chuàng)建完成后被調(diào)用的,然后設(shè)置對象屬性的一些初始值。 __new__是在實例創(chuàng)建之前被調(diào)用的,因為他的任務就是創(chuàng)建實例然后返回該實例,是個靜態(tài)方法。 也就是__new__是在__init__之前被調(diào)用的,__new__的返回值(實例)將傳遞給__init__方法的第一個參數(shù),然后__init__給這個實例設(shè)置一些參數(shù)

    26、python是解釋型語言嗎?會編譯嗎?pyc文件是什么?

    Python是一門解釋性語言,直到發(fā)現(xiàn)了*.pyc文件的存在。如果是解釋型語言,那么生成的pyc文件又是什么? 編譯型語言在程序執(zhí)行之前,先會通過編譯器對程序執(zhí)行一個編譯的過程,把程序轉(zhuǎn)變成機器語言。運行時就不需要翻譯,而直接執(zhí)行就可以了。最典型的例子就是C語言。 解釋型語言就沒有這個編譯的過程,而是在程序運行的時候,通過解釋器對程序逐行作出解釋,然后直接運行,最典型的例子是Ruby。 但是我們也不能一概而論,一些解釋型語言也可以通過解釋器的優(yōu)化來在對程序做出翻譯時對整個程序做出優(yōu)化,從而在效率上超過編譯型語言。 在程序運行期間,編譯結(jié)果存在于內(nèi)存的PyCodeObject對象中,當Python結(jié)束運行后,編譯結(jié)果會被保存到pyc文件中, 在下一次運行相同程序時,Python會根據(jù)pyc文件中記錄的編譯結(jié)果直接在內(nèi)存中重新建立PyCodeObject對象,而不用再次對源文件進行編譯。 PyCodeObject結(jié)構(gòu)體在C源代碼中有相應的聲明,Python的import機制會觸發(fā)pyc文件的生成, 實際這不是生成pyc文件的唯一姿勢。我們可以通過compile內(nèi)建函數(shù)來查看這個PyCodeObject對象的一些信息 pyc文件是導包或者是引用的時候產(chǎn)生的,舉個例子我有一個b.py文件,我從a.py中引用b.py文件,執(zhí)行a.py文件時,就會產(chǎn)生b.py文件的pyc文件, 這個pyc文件是字節(jié)碼文件。當再次運行a.py時,如果a.py沒有發(fā)生變化,則運行pyc文件,當a.py發(fā)生變化時,就會重新生成pyc文件,然后在執(zhí)行pyc文件。 pyc文件是再次轉(zhuǎn)化成機器碼才執(zhí)行的。還有那個正在運行的py文件,在未運行的代碼處修改時不會執(zhí)行的,也就是運行原代碼,原因是代碼是加載到內(nèi)存中執(zhí)行的,你手動修改時只是在硬盤中的。

    27、生成器、迭代器的區(qū)別

    可以被迭代要滿足的要求就叫做可迭代協(xié)議。可迭代協(xié)議的定義非常簡單,就是內(nèi)部實現(xiàn)了__iter__方法。 可以被for循環(huán)的都是可迭代的,要想可迭代,內(nèi)部必須有一個__iter__方法。 迭代器遵循迭代器協(xié)議:必須擁有__iter__方法和__next__方法。 我們知道的迭代器有兩種:一種是調(diào)用方法直接返回的,一種是可迭代對象通過執(zhí)行iter方法得到的,迭代器有的好處是可以節(jié)省內(nèi)存。如果在某些情況下,我們也需要節(jié)省內(nèi)存,就只能自己寫。我們自己寫的這個能實現(xiàn)迭代器功能的東西就叫生成器。 yield可以為我們從函數(shù)中返回值,但是yield又不同于returnreturn的執(zhí)行意味著程序的結(jié)束, 調(diào)用生成器函數(shù)不會得到返回的具體的值,而是得到一個可迭代的對象。每一次獲取這個可迭代對象的值,就能推動函數(shù)的執(zhí)行,獲取新的返回值。直到函數(shù)執(zhí)行結(jié)束。 ''' 遇到問題沒人解答?小編創(chuàng)建了一個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的位置傳遞一個數(shù)據(jù) #使用send的注意事項# 第一次使用生成器的時候 是用next獲取下一個值# 最后一個yield不能接受外部的值 #列表解析 sum([i for i in range(100000000)])#內(nèi)存占用大,機器容易卡死#生成器表達式 sum(i for i in range(100000000))#幾乎不占內(nèi)存

    使用生成器的優(yōu)點:

    1.延遲計算,一次返回一個結(jié)果。也就是說,它不會一次生成所有的結(jié)果,這對于大數(shù)據(jù)量處理,將會非常有用。 2.提高代碼可讀性

    28、@classmethod和@staticmethod的區(qū)別

    @classmethod和@staticmethod都可以不實例化類而直接使用類名.類方法名()的方式進行調(diào)用,二者都是修飾方式。 區(qū)別就是當基類被刪除時,再次使用@staticmethod方式進行調(diào)用時,會報錯;但是@classmethod不會受到影響。可以繼續(xù)使用。 @classmethod和@staticmethod都不需要再傳入self,但是@classmethod裝飾的函數(shù)第一位必須傳入一個參數(shù), 多用cls,這個cls則代表當前的類。其他參數(shù)則看自己的使用情況進行傳參。 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、判斷回文多種方式

    ''' 遇到問題沒人解答?小編創(chuàng)建了一個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、寫代碼尋找一個字符串中的所有回文子串,回文串是一個正讀和反讀都一樣的字符串,比如“l(fā)evel”或者“noon”等就是回文串。

    ''' 遇到問題沒人解答?小編創(chuàng)建了一個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、編寫一個查詢及打印功能的話數(shù)要求能在當前目錄以及當前目錄的所有子目錄下查找文件名包含指定字符串的文件。井打印出完整路徑

    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: # 不是就再繼續(xù)再次執(zhí)行這個函數(shù),遞歸下去search_file(this_path, str) # 遞歸else:return Nonesearch_file(os.path.abspath("."), "t") # 返回path規(guī)范化的絕對路徑 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命令,獲取執(zhí)行結(jié)果 os.getcwd() 獲取當前工作目錄,即當前python腳本工作的目錄路徑 os.chdir("dirname") 改變當前腳本工作目錄;相當于shell下cdos.path os.path.abspath(path) 返回path規(guī)范化的絕對路徑 os.path.split(path) 將path分割成目錄和文件名二元組返回 os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素 os.path.basename(path) 返回path最后的文件名。如何path以/或\結(jié)尾,那么就會返回空值。即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[, ...]]) 將多個路徑組合后返回,第一個絕對路徑之前的參數(shù)將被忽略 os.path.getatime(path) 返回path所指向的文件或者目錄的最后訪問時間 os.path.getmtime(path) 返回path所指向的文件或者目錄的最后修改時間 os.path.getsize(path) 返回path的大小

    百度面試總結(jié)

    基礎(chǔ)知識點

    列表:切片

    當時第一反應就是普通思路

    ''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # 1、l = [2, 3, 4, 7, 9] 用切片實現(xiàn)取出偶數(shù)位+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))

    數(shù)據(jù)庫:

    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實現(xiàn)

    ret = models.Userinfo.objects.values("salary").order_by("salary").reverse().values("dept","salary")[:3]或者 reverse = 對order_by 數(shù)據(jù)反向排序和 - 字段 一樣 ret = models.Userinfo.objects.values("salary").order_by("-salary").values("dept","salary")[:3]

    查詢各部門的員工工資總和

    select sum(salary) from t1 group by dep

    用django實現(xiàn)

    from django.db.models import Sum models.Userinfo.objects.values("dept").annotate(sum=Sum("salary")).values("dept", "sum")

    CORS跨域問題:

    目前基本上主流的瀏覽器都支持CORS。所以只要后端服務支持CORS,就能夠?qū)崿F(xiàn)跨域。

    簡單請求的處理方式:

    在跨域場景下,當瀏覽器發(fā)送簡單請求時,瀏覽器會自動在請求頭中添加表明請求來源的 Origin 字段

    我們的后端程序只需要在返回的響應頭中加上 Access-Control-Allow-Origin 字段,并且把該字段的值設(shè)置為 跨域請求的來源地址或簡單的設(shè)置為 * 就可以了。

    例如:我們可以在Django中間件中的process_response方法來給相應對象添加該字段。

    非簡單請求的處理方式:

    我們開發(fā)中常用到的那些請求方法是PUT或DELETE,或者Content-Type字段的類型是application/json的都是非簡單請求。

    對于非簡單請求,瀏覽器通常都會在請求之前發(fā)送一次 OPTIONS 預檢 請求。該請求會像后端服務詢問是否允許從當前源發(fā)送請求并且詢問允許的 請求方法請求頭字段

    解決辦法也很簡單,我們可以在后端簡單的給響應對象添加上 常用請求方法(PUT、DELETE)的支持就可以了。

    from django.utils.deprecation import MiddlewareMixinclass CorsMiddleware(MiddlewareMixin):def process_response(self, request, response):# 給響應頭加上 Access-Control-Allow-Origin 字段 并簡單的設(shè)置為 *response['Access-Control-Allow-Origin'] = '*'if request.method == 'OPTIONS':# 允許發(fā)送 PUT 請求response['Access-Control-Allow-Methods'] = 'PUT, DELETE'# 允許在請求頭中攜帶 Content-type字段,從而支持發(fā)送json數(shù)據(jù)response['Access-Control-Allow-Headers'] = 'Content-type'return response

    使用django-cors-headers

    我們這個中間件確實能解決目前的CORS跨域問題,但是我們的土方法肯定是不夠嚴謹?shù)?#xff0c;已經(jīng)有人造好輪子-- django-cors-headers 了。

    我們只需要安裝這個包,然后按需要配置一下就可以了。

    安裝

    pip install django-cors-headers

    注冊APP

    INSTALLED_APPS = [...'app01.apps.App01Config','corsheaders', # 將 corsheaders 這個APP注冊 ]

    添加中間件

    必須放在最前面,因為要先解決跨域的問題。只有允許跨域請求,后續(xù)的中間件才會正常執(zhí)行。

    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

    或者你可以選擇設(shè)置允許訪問的白名單

    CORS_ORIGIN_ALLOW_ALL = False CORS_ORIGIN_WHITELIST = (# '<YOUR_DOMAIN>[:PORT]','127.0.0.1:8080' )

    總結(jié)

    以上是生活随笔為你收集整理的Python 百度面试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。