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

歡迎訪問 生活随笔!

生活随笔

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

python

python中类型错误、计数不采用关键字的错误怎么改_Learning/Python-面试问题.md at master · yxxyyx1314/Learning · GitHub...

發(fā)布時間:2025/3/21 python 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python中类型错误、计数不采用关键字的错误怎么改_Learning/Python-面试问题.md at master · yxxyyx1314/Learning · GitHub... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python-面試問題

參考鏈接

面:Python 中什么元素為假?

答:(0,空字符串,空列表、空字典、空元組、None, False)

面:Python 中查看某個關鍵字的屬性?

答:dir ( key ),help() 函數返回幫助文檔和參數說明,dir() 函數返回對象中的所有成員 (任何類型)

面:Python 全局變量 global 的使用?

面:Python 中的 pass 語句有什么作用?

答:我們在寫代碼時,有時可能只寫了函數聲明而沒想好函數怎么寫,但為了保證語法檢查的正確必須輸入一些東西。在這種情況下,我們使用 pass 語句。

面:舉例說明異常模塊中 try except else finally 的相關意義?

答:try..except..else 沒有捕獲到異常,執(zhí)行 else 語句;try..except..finally 不管是否捕獲到異常,都執(zhí)行 finally 語句。

面:with 方法打開處理文件幫我們做了什么?yield 的使用-生成器?

答:功能類似 try,except,finally 中 finally 的用法,with:除了有更優(yōu)雅的語法,真正強大的地方:with 還可以很好的處理上下文環(huán)境產生的異常。with 后面的函數需要有 __ exit __ 方法,當程序出現異常的時候會幫助我們打印異常,清理資源,關閉文件。with 參考博客,yield 參考博客

面:Python 中斷言方法舉例?

答:使用 assert 斷言是學習 Python 一個非常好的習慣,Python assert 斷言句語格式及用法很簡單。在沒完善一個程序之前,我們不知道程序在哪里會出錯,與其讓它在運行最崩潰,不如在出現錯誤條件時就崩潰。

面:列出 Python 中可變數據類型 和 不可變數據類型,并簡述原理?

答:不可變數據類型:數值型、字符串型、和 元組;不允許變量的值發(fā)生變化,如果改變了變量的值,相當于是新建了一個對象,而對于相同的值的對象,在內存中則只有一個對象(一個地址)可變數據類型:列表 和 字典,允許變量的值發(fā)生變化,即如果對變量進行 append、+= 等這種操作后,只是改變了變量的值,而不會新建一個對象,變量引用的對象的地址也不會變化,不過對于相同的值的不同對象,在內存中則會存在不同的對象,即每個對象都有自己的地址,相當于內存中對于同值的對象保存了多份,這里不存在引用計數,是實實在在的對象。

面:賦值,淺拷貝,深拷貝的區(qū)別?

**賦值:**簡單地拷貝對象的引用,兩個對象的 id (內存中的地址)相同,并且共用一個對象,刪除 a 也不會刪除數組,原因見下一題 引用計數機制。

**淺拷貝-copy():**創(chuàng)建一個新的組合對象,這個新對象與原對象共享內存中的子對象。當改變原對象時,才會創(chuàng)建一個實例。僅僅是最頂層開辟了新的空間,里層的元素地址還是一樣的。

**深拷貝-deepcopy():**創(chuàng)建一個新的組合對象,同時遞歸地拷貝所有子對象,新的組合對象與原對象沒有任何關聯(lián)。雖然實際上會共享不可變的子對象,但不影響它們的相互獨立性。

#賦值

a = [1,2,3]

b = a #賦值 id(a) == id(b),直接引用計數

#淺拷貝

import copy

a = 1 #對于不可變數據類型 數字a=1; 字符串a='hello'; 元組a=(1,2,3),不存在啥淺拷貝的,和賦值一樣

b = copy.copy(a) #id(a) == id(b)

a = [1,2,3] #對于可變數據類型 列表,字典,僅僅是最頂層開辟了新的空間,里層的元素地址還是一樣的。

b = copy.copy(a) # id(a) != id(b)

id(a[0]) == id(b[0]) #True 里面的不可變類型地址是一樣的

#深拷貝,邏輯同上,但是淺拷貝不會遞歸拷貝元素是地址的值,淺拷貝對 c 也是簡單的拷貝。

import copy

c = [4,5]

a = [1,2,3,c]

b = copy.deepcopy(a) #會遞歸 a 中的引用,改變 c 的值,b 不會改變。

面:簡述 Python 引用計數機制?

答:GC(Garbage Collector(垃圾收集器))機制:以下三種都是;

Python 垃圾回收主要以引用計數為主,標記-清除 和 分代清除 為輔的機制,其中 標記-清除 和 分代回收 主要是為了處理循環(huán)引用的難題。

引用計數算法:當有 1 個變量保存了對象的引用時,此對象的引用計數就會加 1,變?yōu)?0 后才會真正清除對象。

優(yōu)點:高效、實時性[為 0 直接清除,其他可能需要等到合適的時機]、易于實現

缺點:消耗資源、無法解決循環(huán)引用;解決:標記-清除 和 分代清除

循環(huán)引用參考博客,下面簡要介紹。

#循環(huán)引用問題

list1 = [];list2 = []

list1.append(list2)

list2.append(list1)

'''

針對循環(huán)引用的情況:我們有一個“孤島”或是一組未使用的、互相指向的對象,但是誰都沒有外部引用。換句話說,我們的程序不再使用這些節(jié)點對象了,所以我們希望Python的垃圾回收機制能夠足夠智能去釋放這些對象并回收它們占用的內存空間。但是這不可能,因為所有的引用計數都是1而不是0。

『標記清除(Mark—Sweep)』算法是一種基于追蹤回收(tracing GC)技術實現的垃圾回收算法。它分為兩個階段:第一階段是標記階段,GC 會把所有的『活動對象』打上標記,第二階段是把那些沒有標記的對象『非活動對象』進行回收。那么 GC 又是如何判斷哪些是活動對象哪些是非活動對象的呢?

對象之間通過引用(指針)連在一起,構成一個有向圖,對象構成這個有向圖的節(jié)點,而引用關系構成這個有向圖的邊。從根對象(root object)出發(fā),沿著有向邊遍歷對象,可達的(reachable)對象標記為活動對象,不可達的對象就是要被清除的非活動對象。根對象就是全局變量、調用棧、寄存器。

'''

面:Python 中的 值傳遞 與 引用傳遞?

答:Python 不允許程序員選擇采用 傳值 還是 傳引用。Python 參數傳遞采用的肯定是 傳對象引用 的方式。實際上,這種方式相當于傳值和傳引用的一種綜合。如果函數收到的是一個可變對象(比如字典、列表)的引用,就能修改對象的原始值——相當于通過 傳引用 來傳遞對象。如果函數收到的是一個不可變對象(比如數字、字符或者元組)的引用,就不能 直接修改原始對象——相當于通過 傳值 來傳遞對象。 當人們復制 列表 或 字典 時,就復制了對象列表的引用值,如果改變引用的值,則修改了原始的參數。

基本概念

面:避免轉義給字符串加哪個字母表示原始字符串?

print(r'\abc') #輸出原始字符串 \abc,只有在不對 \ 進行轉義的時候用到

面:單引號,雙引號,三引號的區(qū)別?

name = 'tom'; sex = "male" #單引號和雙引號單獨使用沒什么區(qū)別

#下面才是單雙引號設計的本質目的,這樣里面 'A' 就可以不用添加 \,變?yōu)?\'A\'

sentense = "We all know that 'A' and 'B' are two capital letters."

#三個引號不經常用,用于原格式輸出

article = '''從哪來?

到哪去?

怎么去?

'''

面:Python2 和 Python3 的區(qū)別?

Python3 使用 print 必須要以小括號包裹打印內容。

2.x 中 range 函數返回一個列表,3.x 返回一個可迭代對象。

2.x 中 sort 有 cmp 參數可接受兩個參數的函數,3.x 中只有 key 接受一個參數的函數。

2.x 默認編碼:ascii 解決辦法:在首行 # -- encoding:utf-8--;3.x 中編碼:utf-8。

2.x 整數除法為 /,3.x 為 //。

面:提高 Python 運行效率的方法?

答:1.使用生成器,因為可以節(jié)約大量內存。2.循環(huán)代碼優(yōu)化,避免在循環(huán)中調用太多函數,可以用變量代替。

面:列舉 3 條以上 PEP8 編碼規(guī)范?

不要在行尾加分號, 也不要用分號將兩條命令放在同一行。

不要使用反斜杠連接行,與左括號對齊,Python 會將圓括號的行隱式的連接起來。

頂層函數和類的定義,前后用兩個空行隔開。

一般使用 4 個空格來縮進代碼

面:Python 中標識符的命名規(guī)則?

答:Python 中的標識符可以是任意長度,但必須遵循以下命名規(guī)則:

只能以下劃線或者 A-Z/a-z 中的字母開頭。

其余部分只能使用 A-Z/a-z/0-9。

Python 標識符區(qū)分大小寫。

關鍵字不能作為標識符。

面:IOError、AttributeError、ImportError、IndentationError IndexError、KeyError、SyntaxError、NameError分別代表什么異常?

答:IOError:輸入輸出異常

AttributeError:試圖訪問一個對象沒有的屬性

ImportError:無法引入模塊或包,基本是路徑問題

IndentationError:語法錯誤,代碼沒有正確的對齊

IndexError:下標索引超出序列邊界

KeyError:試圖訪問你字典里不存在的鍵

SyntaxError:Python 代碼邏輯語法出錯,不能執(zhí)行

NameError:使用一個還未賦予對象的變量

面:Python中的身份運算符 is 和 == 的區(qū)別?

答:is 判斷兩個對象 id 是否相同,== 判斷兩個對象值是否相同,具體參考我的博客

面:Python 中運算符?

[+,-,*,/,%,//,**] #算術運算符

[>,>=,

[&,|,~,^,<>] #位運算符

[in] #成員運算符

[and,or,not] #邏輯運算符

面:在 Python 中使用多進制數字?

bin(10) #轉為二進制,python 中二進制表示0b1010

oct(10) #轉為八進制, 0o12

hex(10) #轉為十六進制,0xa

面:什么是元組的解封裝?

x,y,z = (1,2,3) #用變量取出 tuple 里面的值

內部函數

面:列出幾種魔法方法并簡要介紹用途?

答:兩邊的下劃線省略了, init :對象初始化方法

new :創(chuàng)建對象時候執(zhí)行的方法,單列模式會用到

str :當使用 print 輸出對象的時候,只要自己定義了 __ str __(self) 方法,那么就會打印從在這個方法中 return 的數據

del :刪除對象執(zhí)行的方法

面:Python 中的 sort 是用什么排序實現的,時間復雜度是多少?

答:TimSort 算法是一種起源于 歸并排序 和 插入排序 的混合排序算法,設計初衷是為了在真實世界中的各種數據中可以有較好的性能。基本工作過程是:1.掃描數組,確定其中的單調上升段和嚴格單調下降段,將嚴格下降段反轉;2.定義最小基本片段長度,短于此的單調片段通過 插入排序集中為長于此的段;3.反復歸并一些相鄰片段,過程中避免歸并長度相差很大的片段,直至整個排序完成,所用分段選擇策略可以保證O(n log n)時間復雜性。 可以看到,原則上TimSort是歸并排序,但小片段的合并中用了插入排序。

注意:2.x 中 cmp 可以接受兩個參數的函數,3.x 中 key 接受一個參數的函數,需要用key = cmp_to_key(func) 進行模擬。

面:Python 的高階函數有哪些?

#更多可參考 Python 常用函數

map(lambda x: x*x ,[1,2,3])

zip([1,2,3],[4,5,6])

filter(lambda x: True if x%2==0 else False, [1,2,3,4])

import functools

functools.reduce(lambda x,y: x+y, [1,2,3,4])

#問:中的 *args,**kwargs 什么意思?

fun(*args,**kwargs)

#主要用于函數定義,將不定數量的參數傳遞給fun函數,參數存在args中,args是一個元組(tuple)。允許你將不定長度的鍵值對作為參數傳遞給一個函數,參數則存儲為一個字典(dict)。

面:Python 中生成隨機整數、隨機小數、0 - 1 之間小數方法?

import random

random.randint(a,b) #生成區(qū)間內的整數包括區(qū)間 [a,b]

random.random() #生成 [0.0,1.0) 中的隨機小數

import numpy

numpy.random.randn(5) #返回一個列表,生成 5 個隨機數

進階問題

面:簡述 Python GIL 的概念, 以及它對 Python 多線程的影響?編寫一個多線程抓取網頁的程序,并闡明多線程抓取程序是否可比單線程性能有提升,并解釋原因。?

答:目的:為了利用多核,Python 開始支持多線程。而解決多線程之間數據完整性和狀態(tài)同步,最簡單方法自然就是加鎖,于是有了 GIL 這把超級大鎖。

影響:開始當然是為了支持多線程,但后來發(fā)現對效率有很多影響。看到過一個測試,

一個循環(huán) 1 億次的計數器函數。一個通過單線程執(zhí)行兩次,一個多線程執(zhí)行。多線程竟然慢了大約45%。

原因:按照 Python 社區(qū)的想法,為了讓各個線程能夠平均利用 CPU 時間,Python 會計算當前已執(zhí)行。這種模式在只有一個 CPU 核心的情況下毫無問題。任何一個線程被喚起時都能成功獲得到 GIL,但當 CPU 有多個核心的時候,問題就來了。從 release GIL 到 acquire GIL 之間幾乎是沒有間隙的。所以當其他在其他核心上的線程被喚醒時,大部分情況下主線程已經又再一次獲取到 GIL了。這個時候被喚醒執(zhí)行的線程只能白白的浪費 CPU 時間。參考博客

面:什么是猴子補丁?

答:在運行時動態(tài)修改類和模塊,這種場景也比較多,比如我們引用團隊通用庫里的一個模塊,又想豐富模塊的功能,除了繼承之外也可以考慮用 Monkey Patch。個人感覺 Monkey Patch 帶來了便利的同時也有搞亂源代碼優(yōu)雅的風險。

面:如何在 Python 中管理內存?

答:Python 用一個私有堆內存空間來放置所有對象和數據結構,我們無法訪問它,由解釋器來管理它,不過使用一些核心 API,我們可以訪問一些 Python 內存管理工具控制內存分配。

面:當退出 Python 時是否釋放所有內存分配?

答:答案是否定的。那些具有對象循環(huán)引用或者全局命名空間引用的變量,在 Python 退出是往往不會被釋放另外不會釋放 C 庫保留的部分內容。

面:一句話解釋什么樣的語言能夠用(decorator)裝飾器?

答:函數可以作為參數傳遞的語言,可以使用裝飾器

def prin_fun_name(func):

def new_method(*args, **kw):#適用于任意參數的裝飾器

print('used function' + func.__name__)

return func(*args, **kw)

return new_method

面:請解釋 Python 中的閉包?

答:1. 假如你需要寫一個帶參數的裝飾器,那么一般都會生成閉包。

我個人認為,閉包存在的意義就是它夾帶了外部變量(私貨),如果它不夾帶私貨,它和普通的函數就沒有任何區(qū)別。參考博客

面:解釋 Python 中 metaclass 關鍵字?

面:?

答:

面:?

答:

面:?

答:

面:?

答:

面:?

答:

《新程序員》:云原生和全面數字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的python中类型错误、计数不采用关键字的错误怎么改_Learning/Python-面试问题.md at master · yxxyyx1314/Learning · GitHub...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。