整理了一些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


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


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


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

章節目錄

閱讀記錄

山海釋厄傳所有內容均來自互聯網,鉛筆小說網隻為原作者正版墨顏儒生的小說進行宣傳。歡迎各位書友支持正版墨顏儒生並收藏山海釋厄傳最新章節