濮阳杆衣贸易有限公司

主頁 > 知識庫 > 非常全面的Python常見基礎(chǔ)面試題及答案

非常全面的Python常見基礎(chǔ)面試題及答案

熱門標簽:銀川電話機器人電話 企業(yè)微信地圖標注 地圖標注多個 沈陽防封電銷電話卡 萊蕪電信外呼系統(tǒng) 鶴壁手機自動外呼系統(tǒng)違法嗎 B52系統(tǒng)電梯外呼顯示E7 高德地圖標注收入咋樣 怎么辦理400客服電話

Python

1 Python垃圾回收機制是什么

作為Python的使用者來說,Python中的垃圾回收主要以引用計數(shù)為主,再引入標記、清除,分代為輔來解決循環(huán)引用的問題。

一個對象被引用時,引用計數(shù)加1,當(dāng)對象被del時,引用計數(shù)減去1,為0時,對象就被清除,一般情況下用戶不會去操作Python 的垃圾回收機制,但它留有API接口。

2 元組和列表的區(qū)別

主要區(qū)別是列表是可變的,而元組是不可變的。

>>> mylist=[1,3,3]
>>> mylist[1]=2


>>> mytuple=(1,3,3)
>>> mytuple[1]=2
Traceback (most recent call last):
File "pyshell#97>", line 1, in module>

3 元組可以作為字典的key?

首先一個對象能不能作為字典的key, 就取決于其有沒有__hash__方法。 所以除了容器對象(list/dict/set)和內(nèi)部包含容器對象的tuple 是不可作為字典的key, 其他的對象都可以。

4 進程 線程 協(xié)程

4.1 進程

1、操作系統(tǒng)進行資源分配和調(diào)度的基本單位,多個進程之間相互獨立

2、穩(wěn)定性好,如果一個進程崩潰,不影響其他進程,但是進程消耗資源大,開啟的進程數(shù)量有限制

4.2 線程

1、CPU進行資源分配和調(diào)度的基本單位,線程是進程的一部分,是比進程更小的能獨立運行的基本單位,一個進程下的多個線程可以共享該進程的所有資源

2、如果IO操作密集,則可以多線程運行效率高,缺點是如果一個線程崩潰,都會造成進程的崩潰

4.3 協(xié)程

1、子程序調(diào)用總是一個入口,一次返回,調(diào)用順序是明確的。而協(xié)程的調(diào)用和子程序不同。

2、協(xié)程看上去也是子程序,但執(zhí)行過程中,在子程序內(nèi)部可中斷,然后轉(zhuǎn)而執(zhí)行別的子程序,在適當(dāng)?shù)臅r候再返回來接著執(zhí)行。

5 賦值、淺拷貝和深拷貝

深拷貝就是將一個對象拷貝到另一個對象中,這意味著如果你對一個對象的拷貝做出改變時,不會影響原對象。在Python中,我們使用函數(shù)deepcopy()執(zhí)行深拷貝

淺拷貝則是將一個對象的引用拷貝到另一個對象上,所以如果我們在拷貝中改動,會影響到原對象

6 GIL

GIL是python的全局解釋器鎖,同一進程中假如有多個線程運行,一個線程在運行python程序的時候會霸占python解釋器(加了一把鎖即GIL),使該進程內(nèi)的其他線程無法運行,等該線程運行完后其他線程才能運行。如果線程運行過程中遇到耗時操作,則解釋器鎖解開,使其他線程運行。所以在多線程中,線程的運行仍是有先后順序的,并不是同時進行。

多進程中因為每個進程都能被系統(tǒng)分配資源,相當(dāng)于每個進程有了一個python解釋器,所以多進程可以實現(xiàn)多個進程的同時運行,缺點是進程系統(tǒng)資源開銷大

7 列表去重

先通過轉(zhuǎn)換為集合去重,在轉(zhuǎn)列表

8 最常用的排序算法及其復(fù)雜度

8.1 冒泡排序

外層循環(huán)從1到n-1,內(nèi)循環(huán)從當(dāng)前外層的元素的下一個位置開始,依次和外層的元素比較,出現(xiàn)逆序就交換,通過與相鄰元素的比較和交換來把小的數(shù)交換到最前面。

def bubbleSort(array):
    if len(array)  2:
        return array
    else:
        isSorted = False
        counter = 0
        while not isSorted:
            isSorted = True
            for idx in range(len(array) - 1 - counter):
                if array[idx] > array[idx + 1]:
                    isSorted = False
                    (array[idx + 1], array[idx]) = (array[idx], array[idx + 1])
            counter += 1
        return array

8.3 快速排序

通過一趟排序?qū)⒋庞涗浄指舫瑟毩⒌膬刹糠郑渲幸徊糠钟涗浀年P(guān)鍵字均比另一部分的關(guān)鍵字小,則可分別對這兩部分記錄繼續(xù)進行排序,以達到整個序列有序。

1、選定Pivot中心軸

2、從R指針開始,將大于Pivot的數(shù)字放在Pivot的右邊

3、將小于Pivot的數(shù)字放在Pivot的左邊

4、分別對左右子序列重復(fù)前三步操作

def quickSort(array):
    print(array)
    if len(array)  2:
        return array
    else:
        pivot_index = 0
        pivot = array[pivot_index]
        less_part = [i for i in array[pivot_index+1:] if i = pivot]
        large_part = [i for i in array[pivot_index+1:] if i > pivot]
        return quickSort(less_part) + [pivot] + quickSort(large_part)

9 閉包

函數(shù)的返回值是函數(shù)對象,只有外部函數(shù)才可以對他進行訪問,提高了安全性

10 with

with語句的使用,可以簡化了代碼,有效避免資源泄露的發(fā)生

打開文件在進行讀寫的時候可能會出現(xiàn)一些異常狀況,如果按照常規(guī)的f.open

寫法,我們需要try,except,finally,做異常判斷,并且文件最終不管遇到什么情況,都要執(zhí)行finally f.close()關(guān)閉文件,with方法幫我們實現(xiàn)了finally中f.close

11 實例方法 靜態(tài)方法

實例方法只能被實例調(diào)用,靜態(tài)方法(@由staticmethod裝飾器的方法)、類方法(由@classmethod裝飾器的方法),可以被類或類的實例對象調(diào)用。

1、實例方法,第一個參數(shù)必須要默認傳遞實例對象,一般使用self。

2、靜態(tài)方法,參數(shù)沒有必要。

3、類方法,第一個參數(shù)必須要默認傳遞,一般使用cls。

12 迭代器和生成器

12.1 迭代器

迭代器是一個可以記住遍歷的位置的對象。

迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結(jié)束。迭代器只能往前不會后退。

迭代器有兩個基本的方法:iter() 和 next()。

字符串,列表或元組對象都可用于創(chuàng)建迭代器:

>>> list=[1,2,3,4]
>>> it = iter(list)    # 創(chuàng)建迭代器對象
>>> print (next(it))   # 輸出迭代器的下一個元素
1
>>> print (next(it))
2
>>>

12.2 生成器

使用了yield的函數(shù)被稱為生成器

生成器是一個返回迭代器的函數(shù),只能用于迭代操作,更簡單點理解生成器就是一個迭代器

在調(diào)用生成器運行的過程中,每次遇到 yield 時函數(shù)會暫停并保存當(dāng)前所有的運行信息,返回 yield 的值, 并在下一次執(zhí)行 next() 方法時從當(dāng)前位置繼續(xù)運行

13 匿名函數(shù)

print [(lambda x:x*x)(x)for x in range(5)]
[0, 1, 4, 9, 16, 25]

14 map reduce filter

14.1 map

對可迭代對象中的每個元素進行相同的操作

def fn(x):
    return x+1

resp = map(fn,li)
print(list(resp))

[2, 3, 4]

14.2 reduce

從左到右對一個序列的項累計地應(yīng)用有兩個參數(shù)的函數(shù),以此合并序列到一個單一值。(例如累加或累乘列表元素等等)

from functools import reduce
nums=[1, 2, 3, 4]
def fn(x, y):
    return x * y

resp = reduce(fn, nums)
print(resp)

24

14.3 filter

filter函數(shù)用于過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。該接收兩個參數(shù): 第一個為函數(shù),第二個為序列,序列的每個元素作為參數(shù)傳遞給函數(shù)進行判,然后返回 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]

Django

1 什么是wsgi

Python Web Server Gateway Interface,翻譯過來是Python web服務(wù)器網(wǎng)關(guān)接口,實際上就是一種協(xié)議,我們的應(yīng)用(Django,Flask)實現(xiàn)了WSGI,就可以配合實現(xiàn)了WSGI(uWSGI,gunicorn)的服務(wù)器工作了

2 django請求的生命周期

  • 前端發(fā)送請求
  • wsgi, 他就是socket服務(wù)端,用于接收用戶請求并將請求進行初次封裝,然后將請求交給web框架(Flask、Django)
  • 中間件處理請求,幫助我們對請求進行校驗或在請求對象中添加其他相關(guān)數(shù)據(jù),例如:csrf、request.session
  • 路由匹配,根據(jù)當(dāng)前請求的URL找到視圖函數(shù),如果是FBV寫法,通過判斷method兩類型,找到對應(yīng)的視圖函數(shù);如果是CBV寫法,匹配成功后會自動去找dispatch方法,然后Django會通過dispatch反射的方式找到類中對應(yīng)的方法并執(zhí)行
  • 視圖函數(shù),在視圖函數(shù)中進行業(yè)務(wù)邏輯的處理,可能涉及到:orm、view視圖將數(shù)據(jù)渲染到template模板
  • 視圖函數(shù)執(zhí)行完畢之后,會把客戶端想要的數(shù)據(jù)返回給dispatch方法,由dispatch方法把數(shù)據(jù)返回經(jīng)客戶端
  • 中間件處理響應(yīng)
  • wsgi,將響應(yīng)的內(nèi)容發(fā)送給瀏覽器
  • 瀏覽器渲染

3 列舉django的內(nèi)置組件

  • Admin: 對model中對應(yīng)的數(shù)據(jù)表進行增刪改查提供的組件
  • model:負責(zé)操作數(shù)據(jù)庫
  • form:1.生成HTML代碼 2.數(shù)據(jù)有效性校驗 3校驗信息返回并展示
  • ModelForm: 即用于數(shù)據(jù)庫操作,也可用于用戶請求的驗證

4 列舉django中間件的5個方法?以及django中間件的應(yīng)用場景

  • process_request : 請求進來時,權(quán)限認證
  • process_view : 路由匹配之后,能夠得到視圖函數(shù)
  • process_exception : 異常時執(zhí)行
  • process_template_responseprocess : 模板渲染時執(zhí)行
  • process_response : 請求有響應(yīng)時執(zhí)行

5 簡述什么是FBV和CBV

FBV和CBV本質(zhì)是一樣的,基于函數(shù)的視圖叫做FBV,基于類的視圖叫做CBV

在python中使用CBV的優(yōu)點:

  • 提高了代碼的復(fù)用性,可以使用面向?qū)ο蟮募夹g(shù),比如Mixin(多繼承)
  • 可以用不同的函數(shù)針對不同的HTTP方法處理,而不是通過很多if判斷,提高代碼可讀性

6 django的request對象是在什么時候創(chuàng)建的

class WSGIHandler(base.BaseHandler):
    request = self.request_class(environ)

請求走到WSGIHandler類的時候,執(zhí)行cell方法,將environ封裝成了request

7 如何在CBV添加裝飾器

7.1 方法

from django.utils.decorators import method_decorator

@method_decorator(check_login)
def post(self, request):
...

7.2 dispatch

@method_decorator(check_login)
def dispatch(self, request, *args, **kwargs):

7.3 類

@method_decorator(check_login, name="get")
@method_decorator(check_login, name="post")
class HomeView(View):
...

8 列舉django orm 中所有的方法

  1> all():                  查詢所有結(jié)果
  2> filter(**kwargs):       它包含了與所給篩選條件相匹配的對象。獲取不到返回None
  3> get(**kwargs):          返回與所給篩選條件相匹配的對象,返回結(jié)果有且只有一個。
                              如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。
  4> exclude(**kwargs):      它包含了與所給篩選條件不匹配的對象
  5> order_by(*field):       對查詢結(jié)果排序
  6> reverse():              對查詢結(jié)果反向排序
  8> count():                返回數(shù)據(jù)庫中匹配查詢(QuerySet)的對象數(shù)量。
  9> first():                返回第一條記錄
  10> last():                返回最后一條記錄
  11> exists():              如果QuerySet包含數(shù)據(jù),就返回True,否則返回False
  12> values(*field):        返回一個ValueQuerySet——一個特殊的QuerySet,運行后得到的
                              并不是一系 model的實例化對象,而是一個可迭代的字典序列
  13> values_list(*field):   它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列
  14> distinct():            從返回結(jié)果中剔除重復(fù)紀錄

9 select_related 和 prefetch_related的區(qū)別

有外鍵存在時,可以很好的減少數(shù)據(jù)庫請求的次數(shù),提高性能

select_related 通過多表 join 關(guān)聯(lián)查詢, 一次性獲得所有數(shù)據(jù), 只執(zhí)行一次SQL查詢

prefetch_related 分別查詢每個表, 然后根據(jù)它們之間的關(guān)系進行處理, 執(zhí)行兩次查詢

10 django 中 csrf 的實現(xiàn)機制

第一步:django第一次響應(yīng)來自某個客戶端的請求時,后端隨機產(chǎn)生一個token值,把這個token保存在SESSION狀態(tài)中;同時,后端把這個token放到cookie中交給前端頁面;

第二步:下次前端需要發(fā)起請求(比如發(fā)帖)的時候把這個token值加入到請求數(shù)據(jù)或者頭信息中,一起傳給后端;Cookies:{csrftoken:xxxxx}

第三步:后端校驗前端請求帶過來的token和SESSION里的token是否一致。

11 django中如何實現(xiàn)orm表中添加數(shù)據(jù)時創(chuàng)建一條日志記錄

# 使用Django的信號機制,可以在添加、刪除數(shù)據(jù)前后設(shè)置日志記錄:
pre_init    # Django中的model對象執(zhí)行其構(gòu)造方法前,自動觸發(fā)
post_init   # Django中的model對象執(zhí)行其構(gòu)造方法后,自動觸發(fā)
pre_save    # Django中的model對象保存前,自動觸發(fā)
post_save   # Django中的model對象保存后,自動觸發(fā)
pre_delete  # Django中的model對象刪除前,自動觸發(fā)
post_delete # Django中的model對象刪除后,自動觸發(fā)

# 使用
@receiver(post_save, sender=Myclass)       # 信號接收裝飾器。由于內(nèi)置信號,所以直接接收
def signal_handler(sender, **kwargs):      # 接收到信號后,在此處理
   logger = logging.getLogger()
    logger.success('保存成功')

12 django緩存如何設(shè)置

CACHES = {
 'default': {
  'BACKEND': 'django.core.cache.backends.dummy.DummyCache',  # 緩存后臺使用的引擎
  'TIMEOUT': 300,            # 緩存超時時間(默認300秒,None表示永不過期,0表示立即過期)
  'OPTIONS':{
   'MAX_ENTRIES': 300,          # 最大緩存記錄的數(shù)量(默認300)
   'CULL_FREQUENCY': 3,          # 緩存到達最大個數(shù)之后,剔除緩存?zhèn)€數(shù)的比例,即:1/CULL_FREQUENCY(默認3)
  },
 }
}

13 django的緩存能使用redis嗎?如果可以的話,如何配置

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
            # "PASSWORD": "密碼",
        }
    }
}

14 django路由系統(tǒng)中name的作用

主要是通過name的值,來查找url地址,可以理解為反射作用。在html模板中使用name來反射url優(yōu)勢就是后期url規(guī)則發(fā)生改變之后,只需調(diào)整urls.py即可,所有的模板文件都不需要修改。

15 django rest framework框架中都有那些組件

  • 認證
  • 權(quán)限(授權(quán))
  • 用戶訪問次數(shù)/頻率限制
  • 版本
  • 解析器(parser)
  • 序列化
  • 分頁
  • 路由系統(tǒng)
  • 視圖
  • 渲染器

16 簡述 django rest framework框架的認證流程

  • 當(dāng)用戶進行登錄的時候,運行了登錄類的as_view()方法,進入了APIView類的dispatch方法
  • 執(zhí)行self.initialize_request這個方法,里面封裝了request和認證對象列表等其他參數(shù)
  • 執(zhí)行self.initial方法中的self.perform_authentication,里面運行了user方法
  • 再執(zhí)行了user方法里面的self._authenticate()方法

總結(jié)

到此這篇關(guān)于Python常見基礎(chǔ)面試題及答案的文章就介紹到這了,更多相關(guān)Python基礎(chǔ)面試題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 深入解答關(guān)于Python的11道基本面試題
  • Python程序員面試題 你必須提前準備!(答案及解析)
  • 5個很好的Python面試題問題答案及分析
  • Python工程師面試題 與Python Web相關(guān)
  • python正則表達式面試題解答
  • Python自動化測試筆試面試題精選
  • 搞定這套Python爬蟲面試題(面試會so easy)
  • Python 經(jīng)典面試題 21 道【不可錯過】
  • 分享幾道你可能遇到的python面試題
  • 值得收藏的10道python 面試題

標簽:三亞 銀川 呼倫貝爾 呼倫貝爾 烏魯木齊 湘西 安慶 葫蘆島

巨人網(wǎng)絡(luò)通訊聲明:本文標題《非常全面的Python常見基礎(chǔ)面試題及答案》,本文關(guān)鍵詞  非常,全,面的,Python,常見,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《非常全面的Python常見基礎(chǔ)面試題及答案》相關(guān)的同類信息!
  • 本頁收集關(guān)于非常全面的Python常見基礎(chǔ)面試題及答案的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    广昌县| 营口市| 成安县| 民权县| 广德县| 汾阳市| 隆林| 奈曼旗| 保定市| 府谷县| 阆中市| 宁夏| 尼玛县| 莱州市| 衡东县| 建湖县| 丘北县| 丰台区| 酉阳| 太原市| 张家港市| 松江区| 桂阳县| 都安| 修文县| 资源县| 公安县| 泸溪县| 呼玛县| 舟山市| 黄骅市| 城步| 衡山县| 双辽市| 旬阳县| 南岸区| 闻喜县| 万宁市| 灵寿县| 乌拉特前旗| 崇州市|