python面試題(一)

2022-08-24 07:24:10 字數 3400 閱讀 5474

整理了一些python面試可能遇到的題,提供給大家,希望能對大家有用!

1.下面的**會輸出什麼?

def extend_list(val, list=):

return

list

list1 = extend_list(10)

list2 = extend_list(123,)

list3 = extend_list('a'

)print

(list1)

print

(list2)

print(list3)

extend_list函式有兩個引數,val和預設引數list,返回值為list

如果你認為輸出的值為:[10],[123],[a];那你就上當了,這正是出題者想讓你犯的錯誤。

正確答案是:[10, a],[123],[10, a];為什麼呢?

關鍵點就在extend_list返回的值,它返回的是乙個變數,繫結在乙個固定的位址,list3傳參之後改變了list,所以最後列印的時候,list1和list3的值相同。

那麼為什麼list2沒變呢?因為list2傳參的時候給傳入了乙個空的列表,list2所對應的list所繫結的位址發生了改變。

如果這樣說你還不清楚的話,那麼我借助**來看一看。

def extend_list(val, list=):

return

list

list1 = extend_list(10)

print(list1) #

[10]

print(id(list1)) #

140427568644424

list2 = extend_list(123, )

print(list2) #

[123]

print(id(list2)) #

140427568644360

list3 = extend_list('a'

)print(list3) #

[10, 'a']

print(id(list3)) #

140427568644424

print(list1) #

[10, 'a']

print(list2) #

[123]

print(list3) #

[10, 'a']

id(變數名) 可以查詢變數所繫結的位址。

2.有一陣列,從左到右漸增,從上到下漸增,給乙個數字,判斷它是否在這個陣列中。

arr = [[1,4,7,10,15], [2,5,8,12,19], [3,6,9,16,22],\

[10,13,14,17,24], [18,21,23,26,30]]

def getnum(num, data=none):

while

data:

#當data不為空,如果num大於data陣列第1個元素的最後一項

#刪除此元素,再執行此比較

if num > data[0][-1]:

deldata[0]

getnum(num, data=none)

#如果num小於此時的data陣列第乙個元素的最後一項

#那麼利用zip轉換矩陣,將所有元素的最後一項都刪除掉

#然後再次用zip還原陣列,回到第一步再次開始比較

elif num < data[0][-1]:

data = list(zip(*data))

del data[-1]

data = list(zip(*data))

getnum(num, data=none)

#如果num不大於也不小於此時data陣列第乙個元素的最後一項

#那麼num就是這一項,返回true

else

:

return

true

#當data為空時,num已經和原data陣列比較完畢,且沒有找到相同的數字

#返回false

return

false

#如果是在當前文字開啟,則執行print

if__name__ == '

__main__':

print(getnum(18, arr))

3.求兩個數的最大公約數、最小公倍數。

這個是送分題,我們可以用最笨的辦法

def

maxcommon(a, b):

# 兩數的最大公因數最大為較小的數,所以我們遍歷從1到較小的數

for i in range (1, b+1):

# 如果a和b除以i餘數都為0,那麼i就是a和b的公因數

if a % i == 0 and b % i ==0:

# 將i賦值給變數mx,因為i會從1到b,所以只要滿足條件的i,都會對mx賦值

# 新值會替代舊值,所以最後返回的是最大公因數

mx =i

return mx

print(maxcommon(36, 21)) # 3

這種笨辦法我們稱之為「窮舉法」,既然有笨辦法,那就有聰明的辦法!

接下來我們就來看聰名的辦法:歐幾里得演算法(碾轉相除法),叫歐幾里得演算法顯得高大上,碾轉相除法貼切的多。

def

moduntil(a, b):

while

b:# 迴圈,序列賦值

a, b = b, a%b

return

aprint(moduntil(36, 21)) # 3

這是什麼鬼?**怎麼可以這麼簡潔?怎麼就迴圈一直除一直除就可以得到最大公因數了?還除的是餘數?

容老夫給你娓娓道來。

假設x,y有一最大公因數z,x和y都可以被z整除,那麼對任意整數m和n,mx+ny也可以被z整除。

現在有x / y = q 餘數為 w,那麼x = qy + w,可知 x -qy = w,結合上一行可知 w 可以被z整除,也就是說,x除以y的餘數可以被他倆的最大公因數整除。

迴圈到最後,a的值為上一迴圈時的餘數,b的值為0。

是不是漲見識了?在歐幾里得演算法的基礎上,有沒有受到啟發,有沒有想到其它演算法?

不吹不黑,我沒想到,你如果想到了,那麼你牛筆了。。。。

def

deuntil(a, b):

while a !=b:

if a >b:

a = a -b

else

: b = b -a

return b

不會又一臉懵逼了吧?碾轉相除的道理還記得嗎?兩者乙個道理,既然能除就能減,多減幾次,剩下的等同於餘數。。。

最大公約數的演算法會了,那麼最小公倍數就簡單了

將兩個數相乘再除以最大公約數就是最小公倍數,這裡就不做演示了。

Python面試題(一)

def extendlist val,list return list list1 extendlist 10 list2 extendlist 123,list3 extendlist a print list1 print list2 print list3 執行結果和解析過程 10,a 123...

python面試題(一)

最近因為找工作,所以在牛客網上刷了一些題,想在部落格上記錄下來自己的想法 寫的不好還請大家多指教。1.二維陣列中的查詢 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含...

python語法面試題 python面試題

1.去重,集合 集合的乙個重要特點是 自動去除重複的值 li 1,2,3,1,1,2,2,3,3 去除重複的元素 set set li 轉換為集合,因為集合會自動去重。print set li list set 將集合轉換為列表print li 2.生成器 規則 生成器函式,或者生成器表示式,在呼叫...