整理了一些python麵試可能遇到的題,提供給大家,希望能對大家有用!
1.下麵的代碼會輸出什麽?
defextend_list(val,list=[]):list.append(val)returnlistlist1=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所綁定的地址發生了改變。
如果這樣說你還不清楚的話,那麽我借助代碼來看一看。
defextend_list(val,list=[]):list.append(val)returnlistlist1=extend_list(10)print(list1)#[10]print(id(list1))#140427568644424list2=extend_list(123,[])print(list2)#[123]print(id(list2))#140427568644360list3=extend_list(''a'')print(list3)#[10,''a'']print(id(list3))#140427568644424print(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]]defgetnum(num,data=none):whiledata:#當data不為空,如果num大於data數組第個元素的最後一項#刪除此元素,再執行此比較ifnum>data[0][-1]:deldata[0]getnum(num,data=none)#如果num小於此時的data數組第一個元素的最後一項#那麽利用zip轉換矩陣,將所有元素的最後一項都刪除掉#然後再次用zip還原數組,回到第一步再次開始比較elifnum<data[0][-1]:data=list(zip(*data))deldata[-1]data=list(zip(*data))getnum(num,data=none)#如果num不大於也不小於此時data數組第一個元素的最後一項#那麽num就是這一項,返回trueelse:returntrue#當data為空時,num已經和原data數組比較完畢,且沒有找到相同的數字#返回falsereturnfalse#如果是在當前文本打開,則執行printif__==''__main__'':print(getnum(18,arr))
3.求兩個數的最大公約數、最小公倍數。
這個是送分題,我們可以用最笨的辦法
def(a,b):
#兩數的最大公因數最大為較小的數,所以我們遍曆從1到較小的數foriinrange(1,b+1):
#如果a和b除以i餘數都為0,那麽i就是a和b的公因數ifa%i==0andb%i==0:
#將i賦值給變量mx,因為i會從1到b,所以隻要滿足條件的i,都會對mx賦值
#新值會替代舊值,所以最後返回的是最大公因數
mx=ireturnmx
print((36,21))#3
這種笨辦法我們稱之為“窮舉法”,既然有笨辦法,那就有聰明的辦法!
接下來我們就來看聰名的辦法:歐幾裏得算法(碾轉相除法),叫歐幾裏得算法顯得高大上,碾轉相除法貼切的多。
defmoduntil(a,b):whileb:
#循環,uu看書.uuanhuco 序列賦值a,b=b,a%breturnaprint(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。
是不是漲見識了?在歐幾裏得算法的基礎上,有沒有受到啟發,有沒有想到其它算法?
不吹不黑,我沒想到,你如果想到了,那麽你牛筆了。。。。
我們再來看下一種算法:尼考曼徹斯法(碾轉相減法、更相減損術),如果你想到的也是這種算法,那麽恭喜你,你的思維可以和尼考曼徹斯比肩了。
defdeuntil(a,b):whilea!=b:ifa>b:a=a-belse:b=b-areturnb
不會又一臉懵逼了吧?碾轉相除的道理還記得嗎?兩者一個道理,既然能除就能減,多減幾次,剩下的等同於餘數。。。
最大公約數的算法會了,那麽最小公倍數就簡單了
將兩個數相乘再除以最大公約數就是最小公倍數,這裏就不做演示了。
1.下麵的代碼會輸出什麽?
defextend_list(val,list=[]):list.append(val)returnlistlist1=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所綁定的地址發生了改變。
如果這樣說你還不清楚的話,那麽我借助代碼來看一看。
defextend_list(val,list=[]):list.append(val)returnlistlist1=extend_list(10)print(list1)#[10]print(id(list1))#140427568644424list2=extend_list(123,[])print(list2)#[123]print(id(list2))#140427568644360list3=extend_list(''a'')print(list3)#[10,''a'']print(id(list3))#140427568644424print(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]]defgetnum(num,data=none):whiledata:#當data不為空,如果num大於data數組第個元素的最後一項#刪除此元素,再執行此比較ifnum>data[0][-1]:deldata[0]getnum(num,data=none)#如果num小於此時的data數組第一個元素的最後一項#那麽利用zip轉換矩陣,將所有元素的最後一項都刪除掉#然後再次用zip還原數組,回到第一步再次開始比較elifnum<data[0][-1]:data=list(zip(*data))deldata[-1]data=list(zip(*data))getnum(num,data=none)#如果num不大於也不小於此時data數組第一個元素的最後一項#那麽num就是這一項,返回trueelse:returntrue#當data為空時,num已經和原data數組比較完畢,且沒有找到相同的數字#返回falsereturnfalse#如果是在當前文本打開,則執行printif__==''__main__'':print(getnum(18,arr))
3.求兩個數的最大公約數、最小公倍數。
這個是送分題,我們可以用最笨的辦法
def(a,b):
#兩數的最大公因數最大為較小的數,所以我們遍曆從1到較小的數foriinrange(1,b+1):
#如果a和b除以i餘數都為0,那麽i就是a和b的公因數ifa%i==0andb%i==0:
#將i賦值給變量mx,因為i會從1到b,所以隻要滿足條件的i,都會對mx賦值
#新值會替代舊值,所以最後返回的是最大公因數
mx=ireturnmx
print((36,21))#3
這種笨辦法我們稱之為“窮舉法”,既然有笨辦法,那就有聰明的辦法!
接下來我們就來看聰名的辦法:歐幾裏得算法(碾轉相除法),叫歐幾裏得算法顯得高大上,碾轉相除法貼切的多。
defmoduntil(a,b):whileb:
#循環,uu看書.uuanhuco 序列賦值a,b=b,a%breturnaprint(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。
是不是漲見識了?在歐幾裏得算法的基礎上,有沒有受到啟發,有沒有想到其它算法?
不吹不黑,我沒想到,你如果想到了,那麽你牛筆了。。。。
我們再來看下一種算法:尼考曼徹斯法(碾轉相減法、更相減損術),如果你想到的也是這種算法,那麽恭喜你,你的思維可以和尼考曼徹斯比肩了。
defdeuntil(a,b):whilea!=b:ifa>b:a=a-belse:b=b-areturnb
不會又一臉懵逼了吧?碾轉相除的道理還記得嗎?兩者一個道理,既然能除就能減,多減幾次,剩下的等同於餘數。。。
最大公約數的算法會了,那麽最小公倍數就簡單了
將兩個數相乘再除以最大公約數就是最小公倍數,這裏就不做演示了。