1. 最全的pandas面試基礎100題目
在進行下面的題目操作時,一定要先導入上面的兩個數據分析包 pandas、numpy
1. 如何用python的列表創建一個series?
輸出:
一個series是一個一維的標記數組,可以容納任何數據類型(整數、字元串、浮點數、Python對象等)。必須記住,與Python列表不同,一個series總是包含相同類型的數據。
2.如何使用列表創建一個DataFrame?
輸出:
3.如何使用Series 字典對象生成 DataFrame?
輸出:
4.如何在pandas中創建一個空的DataFrame?
要創建一個完全空的pandas dataframe,我們使用以下操作:
輸出:
已知有這樣的數據,如何進行查看
輸出:
2.如何查看尾部數據?
3.如何快速查看數據的統計摘要?
4.如何查詢索引和列名?
1.簡述Pandas Index
在panda中建立索引意味著簡單地從DataFrame中選擇特定的數據行和列。
pandas支持四種類型的多軸索引,它們是:
它們統稱為索引器。這些是迄今為止索引數據最常見的方法。這四個函數有助於從DataFrame獲取元素、行和列。
2.Pandas 定義重新索引(Reindexing)
重新索引會更改DataFrame的行標簽和列標簽。重新索引意味著使數據符合特定軸上給定的一組標簽。
多個操作可以通過像這樣的索引來完成:
輸出:
3.如何設置索引?
panda set_index() 是一種將列表、序列或dataframe設置為dataframe索引的方法。
語法:
DataFrame.set_index(keys, inplace=False)
參數:
改變索引列
在本例中,名稱列被用作DataFrame的索引列
輸出:
如輸出圖像所示,以前索引列是一系列數字
Before Operation –
After Operation
4.如何重置索引?
Pandas Series.reset_index()
函數的作用是:生成一個新的DataFrame或帶有重置索引的Series。
例1: 使用 Series.reset_index() 函數重置給定Series對象的索引
輸出:
現在,我們將使用Series.reset_index()函數來重置給定的series對象的索引
輸出 :
從輸出中可以看到,該 Series.reset_index() 函數已將給定Series對象的索引重置為默認值。它保留了索引,並將其轉換為列。
1.1先創建數據:
1.2選擇單列,產生 Series
詳見 按標簽選擇 。
2.1用標簽提取一行數據:
詳見 按位置選擇 。
3.1用整數位置選擇:
4.1用單列的值選擇數據:
5.1用索引自動對齊新增列的數據:
1.如何得到一個數列的最小值、第25百分位、中值、第75位和最大值?
輸出:
Pandas dataframe.mean(axis=None) 函數返回所請求軸(axis=0代表對列進行求平均值,axis=1代表對行進行求平均值)的值的平均值。
示例: 使用 mean() 函數查找索引軸上所有觀測值的平均值。
輸出:
讓我們使用datafame .mean()函數來查找索引軸上的平均值。
3.如何將函數應用到DataFrame中的每個數據元素?
可以使用 apply() 函數以便將函數應用於給定dataframe中的每一行。讓我們來看看我們完成這項任務的方式。
實例:
輸出:
4.如何在panda中獲得一個DataFrame的行數和列數?
輸出:
獲取df的行和列計數
輸出:
5.如何在panda DataFrame中獲得列值的總和?
Pandas dataframe.sum() 函數返回所請求軸的值的和
語法: DataFrame.sum(axis=None, skipna=None, )
參數:
示例1: 使用 sum() 函數查找索引軸上所有值的總和
現在求出沿索引軸的所有值的和。我們將跳過計算和時的NaN值。
輸出:
如何將新行追加到pandas DataFrame?
Pandas dataframe.append() 函數的作用是:將其他dataframe的行追加到給定的dataframe的末尾,返回一個新的dataframe對象。
語法:
DataFrame.append( ignore_index=False,)
參數:
示例1: 創建兩個數據框,然後將第二個附加到第一個。
現在將df2附加到df1的末尾
輸出:
請注意,第二個DataFrame的索引值保留在附加的DataFrame中。如果我們不希望發生這種情況,則可以設置ignore_index = True。
輸出 :
「group by」 指的是涵蓋下列一項或多項步驟的處理流程:
詳見 分組 。
輸出:
1.先分組,再用 sum() 函數計算每組的匯總數據:
輸出:
2.多列分組後,生成多層索引,也可以應用 sum 函數:
輸出:
如何將numpy數組轉換為給定形狀的DataFrame?
輸出:
輸出:
透視表是一種可以對數據動態排布並且分類匯總的表格格式,在pandas中它被稱作pivot_table。
pivot_table(data, values=None, index=None, columns=None)
參數:
詳見: 數據透視表
列印輸出:
用上述數據生成數據透視表非常簡單:
返回結果:
1.如何將列添加到pandas DataFrame?
源數據:
輸出:
輸出:
2.如何向panda DataFrame添加索引、行或列?
向DataFrame添加索引
如果您創建了一個DataFrame, panda允許將輸入添加到索引參數中。它將確保您擁有所需的索引。否則,在默認情況下,DataFrame包含一個數值索引,該索引從0開始,在DataFrame的最後一行結束。
向DataFrame添加行、列
我們可以使用.loc、iloc和ix將行、列插入到DataFrame中。
添加具有特定索引名的行:
輸出:
3.如何在panda DataFrame上進行迭代?
您可以通過結合使用for循環和對DataFrame的iterrows()調用來遍歷DataFrame的行。
輸出:
4.我們如何排序DataFrame?
我們可以通過以下幾種有效地在DataFrame中執行排序:
(1)按標簽
可以使用sort_index()方法對數據dataframe進行排序。可以通過傳遞axis參數和排序順序來實現。默認情況下,按升序對行標簽進行排序。
2. python面試必備題目有哪些
Q:你做一個自我介紹吧?
旁白:其實遇到好幾家面試官都讓我做自我介紹了,該如何自我介紹陽哥估計都會背了,好玩(惡心)的是在萬達信息面試,面試了3個技術官,每個人都分別讓我做了自我介紹,尼瑪,他們3個就不會溝通一下要問我啥嗎,一個問題至於問我3遍嗎~:funk:陽哥是敢怒不敢言,畢竟在人家的地盤。
PS:自我介紹的內容就不說了,每個人都是獨特的,我就跟大家說一下應該如何自我介紹吧。
一個優良的自我介紹會給面試官留下深刻的印象,大部分情況下,所謂的面試好壞其實看的就是你給面試官留下的印象怎麼樣了,我們用俗語叫感覺。
自我介紹應該分以下幾個部分,按照一定的邏輯連貫起來。如果連貫不起來,或者不夠熟練一定在台下多背幾遍,多講幾遍,但是面試的時候不要說的跟背過似的,高境界就是讓面試官感覺你是臨場發揮的,卻又比背的都好。
1)個人基本信息(姓名、年齡、老家、居住地等)
2)自己來自哪裡(工作地點),是干什麼的(給自己一個清晰的定位,比如:我是一名Android開發工程師),擔任過什麼職務、做過什麼樣的項目
3)自己為何來貴公司面試
4)最後祝願(希望能得到貴公司的認可等等,不用太多,一兩句話就ok)
Q:介紹一下你做過的項目吧?
PS:黑馬那麼多項目,隨便准備3個就ok了。
介紹項目大概的思路如下:
1)這個項目是干什麼的(比如是一個類似網易新聞的地方新聞客戶端,或者類似美團的o2o,或者類似豌豆莢的一個應用市場,或者類似淘寶的購物平台)?解釋就是拿一個市場上耳熟能詳的應用跟自己的應用做類比,省的面試官聽的雲里霧里的。
2)自己負責了哪些模塊(功能)的職責(比如負責系統的架構,核心代碼的編寫,xx功能模塊的開發等等)
3)自己在這個項目中擔當的責任(比如,這個項目是自己獨立開發的,這個項目是和另外一個同事一起架構一起開發的,這個項目是自己負責了幾個核心模塊)
4)項目中都用到了哪些技術
5)從項目中學到了哪些東西(可以從技術方向和業務兩個方向入手)
旁白:面試官問的很多技術性問題跟之前問的都大同小異,因此這里只給出有特色且技術含量高的。陽哥正在寫面試寶典,該寶典核心內容針對的還是技術問題,陽哥會從javase基礎到javase高級,從Android基礎到Android高級以及到Android項目依次展開分析,其次也會寫一些常見的非技術性問題,敬請期待~
Q:①在Listview的優化中,我們為何使用ConvertView?②為何使用ViewHolder?③你認為哪個更能解決問題?④你認為view.inflate和view.findviewById哪個更耗時,為什麼?⑤如果這兩個AP讓你重新寫,你怎麼寫?
PS:上面的問題,陽哥認為是面試以來遇到很難的一個,也是很有技術含量的一道題。前一半問題還好回答,最後一個問題真的需要發揮想像了。
A:①使用ConvertView可以實現對view的復用,這樣大大節約了每次創建對象的時間,提升了ListView的顯示效率。②使用ViewHolder作為內部類,可以將view的子控制項封裝在ViewHolder類中,然後通過View.setTag(ViewHolder)將view和ViewHolder進行綁定,這樣我們就不用每次都調用view的findViewById(id)方法來查找控制項。③使用ConvertView解決了一大部分問題,使用ViewHolder實現了控制項換時間的問題,因為給View對象設置一個Tag本身就是佔用內存的,因此ViewHolder的使用還是需要區分不同的應用場景的, 沒有絕對的好與不好。如果內存足夠需要高效則ViewHolder建議使用,否則不建議使用。④當然是view.inflate耗時,這個函數完成的功能是把xml布局文件通過pullParser的形式給解析到內存中,需要io,需要遞歸子節點。⑤我其實還不太相信我寫出來的代碼比Google官方寫的好,如果讓我寫的話我可能會這樣考慮,當用戶在使用view.inflate的時候將多個id作為數組添加到形參中,這樣在初始化view的使用我就可以給這個view直接調用setTag方法綁定需要的子控制項。不過這個原生方法其實也應該保留共不同的需求使用。
PS:技術面試時間並不長,我回答了幾個之後,他們兩個大眼瞪小眼,A看看B問:你還有什麼問的嗎?B說我沒有,你還有嗎?A說我也沒了。那行,接下來,他們就讓我等人事了。
3. python不會的題去哪搜
Github、leetcode、牛客網、實驗樓、和鯨社區等網站。
Leetcode是一個專業的刷題網站,題目數量非常之多,你可以用Python等多種語言去解題,也有會相應參考答案,其中不乏大廠面試真題。
牛客網和leetcode類似,也是針對面試筆試場景的刷題網站,裡面有騰訊、位元組、阿里等各個大廠的面試真題,適合有這方面需求的同學去針對性刷題。
實驗樓不同於leetcode和牛客網,它是一個實操代碼項目的練習網站,提供了包括Python在內的各種編程語言練習項目,包括像Python入門、Djangoweb編程、Pandas數據分析、自動化運維等,適合對項目練習有需求的同學。
4. python運維開發工程師面試常見問題有哪些
面試python運維開發工程師每家公司對專業知識的考察側重點是不一樣的,下面給你整理了一些,希望能幫助到你!
python
1、python是強類型還是弱類型的語言
2、python的動態性體現在哪
3、python的namespace:四種;len()等函數的命名空間
4、range和xrange的區別,談到了迭代器
5、於是問怎麼實現迭代器,然後又問了生成器,yield語句
6、將list的中的一萬條字元串合成一條字元串的方法
7、python多線程(g il)
8、python的三目運算符有嗎? 怎麼用一行代碼實現三目運算
linux
1、問linux命令
2、top和ps在進程佔有資源率的統計方式有什麼不同
3、然後扯到了頁表,內存管理,TLB
5、linux文件系統:inode,inode存儲了哪些東西,目錄名,文件名存在哪裡
5. Python面試數據分析,爬蟲和深度學習一般都問什麼問題,筆試題目考哪些
一面: 技術面試
面試官是一個比較老練的技術總監,貌似80後:
你先簡單做個自我介紹吧。
答:恩,好的,面試官你好,很高興能來到貴公司面試爬蟲工程師一職。我叫XXX,來自於***,畢業於****大學,**學歷。(如果專業不是計算機專業,就不要介紹自己的專業,如果是大專以下學歷,也不要說自己學歷,揚長避短這個道理大家應該都懂得)有2年多爬蟲工作經驗(如果真實是1年多,就說2年,如果真實是2年多就說3年),工作過2家公司(公司盡量不要說太多,如果2-3年經驗說2家就好,以免說的過多讓人覺得這人太容易干一段不幹,說的太少,可能在一個公司技術積累比較單一),第一家是從實習開始工作的。我就主要介紹下我上家公司的情況吧。我上家公司是****,是一家外包公司(如果是培訓班畢業的盡可能說外包,因為在外包公司,任何項目都可能做,方便後面很多問題的解釋),我在這家公司做了一年多,這家公司在****。我們這家公司是共有50多人。我在裡面負責公司的數據採集爬取,數據處理,繪圖分析等(爬蟲爬下來的數據很多都會進行一些清洗,可以把自己數據處理,繪圖的經驗說出來,增加優勢,如果沒有的話,就業余花時間去學習這方面,常規的方法都不難)。期間主要負責了集團對一些招聘網站、電商網站、金融網站、汽車網站(如果是單一業務的公司,你可能就說不了這么多種類了,一般採集的數據都會比較單一,這就體現了說外包的好處)。我之所以在上家公司離職是因為上家的公司項目基本都已經做完上線了,後面又接的項目感覺挑戰性不大,希望尋找一個平台做更多的項目(這個離職原因因人而異,如果換城市的話也可以簡單粗暴說我家人、朋友在這邊,如果還是同一個城市的話也可以按照我的那樣說,也可以其他方式,但是建議不要說公司經營不好之類的,不喜歡這家公司等等,經營不好可能跟公司員工也有關系,如果回答不喜歡上家公司,面試官會接著問,為什麼不喜歡,如果我們公司也是這種情況,你會不喜歡嗎,面試offer幾率就會大大減少)。因為來之前了解過貴公司,現在主要做金融數據採集的任務,後面也會進行一些大數據分析的工作,覺得項目規劃很有遠見就過來了。(面試前先查下公司底細,知己知彼)因為我在之前公司做過爬蟲、分析方面的工作,貴公司的這個項目也剛好是處於初期階段,我非常喜歡貴公司的這些項目。並且我認為我有能力將貴公司的項目做好,能勝任貴公司爬蟲工程師一職,我的情況大概就是這樣,您看您們這邊還需了解其他什麼嗎?
2.你主要採集的產業領域有哪些?接觸過金融行業嗎?
答:我之前主要接觸過汽車行業,招聘行業,電商行業,金融行業,金融行業也接觸過,但是說實話項目並不是很多,但是技術是相通的,可能剛開始不是很熟悉,只要適應一倆個星期都不是問題。
3.介紹爬蟲用到的技術
答:requests、scrapy:爬蟲框架和分布式爬蟲
xpath:網頁數據提取
re:正則匹配
numpy、pandas:處理數據
matplotlib:繪圖
mysql:數據存儲
redis:爬蟲數據去重和url去重
雲打:處理常規驗證碼
復雜驗證碼:用selenium模擬登陸、處理滑塊驗證碼等(滑塊驗證碼有方法,之前破解過滑塊驗證碼,有空我會出個基本使用教程,進行滑塊驗證碼破解,但不一定通用,因為每個網站反爬措施設置都不一樣)
4.處理過的最難的驗證碼?
答:12306點擊圖片驗證碼。原理:圖片發送給打碼平台,平台返回圖片位置數值,通過計算返回數字和圖片坐標的關系,進行模擬登陸
5.當開發遇到甩鍋問題怎麼解決?
答:如果是小問題自己感覺影響不大,背鍋就背了,畢竟如果是剛入公司很多不懂,可能會犯一些錯誤,如果是大問題,就找責任人(虛心點,不卑不亢)
1.你為什麼要從上家公司離職?
答:上家公司離職是因為上家的公司項目基本都已經做完上線了,後面又接的項目感覺挑戰性不大,希望尋找一個平台做更多的項目
2.來之前了解過我們公司嗎?
答:來之前了解過貴公司,現在主要做金融數據採集的任務,後面也會進行一些大數據分析的工作
3.簡單介紹一下你最大的缺點跟優點?
答:我的優點是對工作認真負責,團隊協作能力好,缺點是言辭表達需要提高,還有對一些細節的把握(我最大的缺點就是對細節過分追求,有多少人想這樣說的,能把自己的缺點說成這么好聽的優點,也是666了,這樣說面試成績減10分缺點就老老實實說一點模稜兩可的缺點就好了,不要過於滑頭,也不要太實在)
4.你怎麼理解你應聘的職位,針對你應聘的職位你最擅長的是什麼?
答:這份職位不僅僅是爬蟲方面的技術崗位,更是學習新知識,探索新領域的一條路,希望能有機會給公司貢獻一份力量。最擅長數據採集、處理分析
5.你對加班有什麼看法?除了工資,你希望在公司得到什麼?
答:1,適當的加班可以接受,過度的加班不能,因為要考慮個人,家庭等因素,同時我也會盡量在規定的時間內完成分配給我的任務,當然加班也希望獲得相應的加班費。2,希望這份工作能讓我發揮我的技能專長,這會給我帶來一種滿足感,我還希望我所做的工作能夠對我目前的技能水平形成一個挑戰,從而能促使我提升著急。
6.你的期望薪資是多少?
答:我的期望薪資是13K,因為上家公司已經是10k,而且自己也會的東西比較多,前端、後端、爬蟲都會,跳槽希望有一定的增長。
7.你什麼時候能到崗上班?
答:因為我已經從上家公司離職,可以隨時到崗。(想早上班就別托,先答應越早越好)
8.你還有什麼要問我的嗎?
答:問了公司的福利待遇,上班時間,培養計劃。(上班時間是5天制,沒有培養計劃,項目初創時期)最後結束面試,說這2天會電話通知,因為後面還好幾個競爭對手面試。
結論:面試是個概率事件,同時也跟運氣有關,在我的話術之上多進行面試總結,多面一些公司,相信大家都能找到理想工作
6. Python編程面試常見問題有哪些
Python編程面試題目一:python下多線程的限制以及多進程中傳遞參數的方式,以及區別
(1)python下多線程的限制以及多進程中傳遞參數的方式
python多線程有個全局解釋器鎖(global interpreter lock),這個鎖的意思是任一時間只能有一個線程使用解釋器,跟單cpu跑多個程序一個意思,大家都是輪著用的,這叫“並發”,不是“並行”。
多進程間共享數據,可以使用 multiprocessing.Value 和 multiprocessing.Array
(2)python多線程與多進程的區別
在UNIX平台上,當某個進程終結之後,該進程需要被其父進程調用wait,否則進程成為僵屍進程(Zombie)。所以,有必要對每個Process對象調用join()方法 (實際上等同於wait)。對於多線程來說,由於只有一個進程,所以不存在此必要性。
多進程應該避免共享資源。在多線程中,我們可以比較容易地共享資源,比如使用全局變數或者傳遞參數。在多進程情況下,由於每個進程有自己獨立的內存空間,以上方法並不合適。此時我們可以通過共享內存和Manager的方法來共享資源。但這樣做提高了程序的復雜度,並因為同步的需要而降低了程序的效率。
Python編程面試題目二:lambada函數
lambda 函數是一個可以接收任意多個參數(包括可選參數)並且返回單個表達式值的函數。 lambda 函數不能包含命令,它們所包含的表達式不能超過一個。不要試圖向lambda 函數中塞入太多的東西;如果你需要更復雜的東西,應該定義一個普通函數,然後想讓它多長就多長。
更多關於Python編程的技巧,干貨,資訊等內容,小編會持續更新。
7. python面試題總結1-內存管理機制
(1).引用計數
(2). 垃圾回收
(3). 內存池機制
在python中每創建一個對象,對應的會有一個引用計數,當發生賦值操作如a=b,對應的b的引用計數會自動加1,當引用的對象被清除或者函數結束時,引用計數會自動減1。
在python中使用引用計數,標記清楚,分代回收三種方式進行垃圾回收。
其中,引用計數當對象的引用計數歸0時,對象會自動被清除。標記清除機制是首先遍歷所有對象,如果對象可達,就說明有變數引用它,則標記其為可達的。如果不可達,則對其進行清除。分代回收是當對象創建時被標記為第0代,經過一次垃圾回收之後,餘下的對象被標記為第1代,最高為第2代。其原理是,對象的生存期越長,月可能不是垃越。
ython語言雖然提供了對內存的垃圾收集機制,但實際上它將不用的內存放到內存池而不是返回給操作系統,所以就有了以下:
1 Pymalloc機制;這個主要是為了加速Python的執行效率,Python引入了一個內存池機制,用於管理,為了對小塊內存的申請和釋放。
2 Python中所有小於256個位元組的對象都是依靠pymalloc分配器來實現的,而稍大的對象用的則是系統的malloc。
3 對於Python對象,比如整數、浮點數和List這些,都有自己獨立的內存池,對象間並不共享他們的內存池。換句話說就是,假設你分配並且釋放了大量的整數,那麼用於緩存這些整數的內存就不能再分配給浮點數。
8. Python面試基礎題十大陷阱,你中招了嗎
我們在會碰到各種各樣的面試,有的甚至是HR專門為你設置的障礙,在python面試中也是,無論你是應聘Python web開發,爬蟲工程師,或是數據分析,還是自動化運維,這些python面試基礎題十大陷阱也許你會遇到,今天的python培訓總結出來給你以防萬一:
問題1:請問如何修改以下Python代碼,使得下面的代碼調用類A的show方法?
class A(object)
def show(self):
print 'derived show'
class B(A)
def show(self):
print 'derived show'
obj=B()
obj.show()
答:這道題的考點是類繼承,只要通過__class__ 方法指定類對象就可以了。補充的代碼如下:
obj._class_=A
obj.show()
問題2:請問如何修改以下Python代碼,使得代碼能夠運行?
class A(object):
def _init_ (self,a,b):
self._a = a
self._b = b
def myprint(self):
print 'a=',self._a,'b=',self._b
a1=A(10,20)
a1.myprint()
a1=(80)
答:此題考察得是方法對象,為了能讓對象實例能被直接調用,需要實現 __call__ 方法,補充代碼如下:
class A(object):
def _init_ (self,a,b):
self._a = a
self._b = b
def myprint(self):
print 'a=',self._a,'b=',self._b
def_call_(self,num):
print'call:',num+self._a
問題3:下面這段代碼的輸出是什麼?
class B(object):
def fn(self):
print"B fn"
def_init_(self):
print"B INIT"
class A(object):
def fn(self):
print"A fn"
def_new_(cls,a):
print"NEW",a
if a>10:
return super(A,cls)._new_(cls)
return B()
def_init_(self,a):
print "INIT",a
a1=A(5)
a1,fn()
a2=A(20)
a2,fn()
答:
NEW 5
B INIT
B fn
NEW 20
INIT 20
A fn
此題考察的是new和init的用法,使用 __new__ 方法,可以決定返回那個對象,也就是創建對象之前調用的,這個常見於於設計模式的單例、工廠模式。__init__ 是創建對象是調用的。
問題4:下面這段代碼輸出什麼?
1s=[1,2,3,4]
list1 =[i for i in ls if i>2
print list1
list2 =[1*2 for i in ls if 1>2
print list2
dicl={x: x**2 for x in(2, 4, 6)}
print dic1
dic2={x: ' item'+ str(x**2)for x in (2, 4, 6)}
print dic2
setl ={x for x in 'hello world' if x not in 'low level'}
print set1
答:
[3,4]
[6,8]
{2:4,4:16,6:36}
{2:'item4',4:'item16』,6:'item36"}set(["h",'r','d"])
此題考察的是列表和字典的生成。
問題5:下面這段代碼輸出什麼?
num= 9
def f1():
um=20
def f2():
print num
f2()
f1()
f2()
答:
9
9
此題考察全局變數和局部變數。num 不是個全局變數,所以每個函數都得到了自己的 num 拷貝,如果你想修改 num ,則必須用 global 關鍵字聲明。比如下面這樣
num=9
def f1():
global num
um=20
def f2():
print num
f2()
f1()
f2()
#prints:
#9
#20
問題6:如何使用一行代碼交換兩個變數值?
a=8
b=9
答:
(a,b)=(b,a)
問題7:如何添加代碼,使得沒有定義的方法都調用mydefault方法?
class A(object):
def_init_(self,a,b):
self.a1=a
self.b1=b
print'init'
def mydefault(self):
print'default'
a1=A(10,20)
a1.fn1()
a1.fn2()
a1.fn3()
答:
class A(object):
def_init_(self,a,b):
self.a1=a
self.b1=b
print'init'
def mydefault(self):
print'default'
def_getattr_(self,name):
return self.mydefault
a1=A(10,20)
a1.fn1()
a1.fn2()
a1.fn3()
此題的考的是Python的默認方法, 只有當沒有定義的方法調用時,才會調用方法 __getattr__。當 fn1 方法傳入參數時,我們可以給 mydefault 方法增加一個 *args 不定參數來兼容。
class A(object):
def_init_(self,a,b):
self.a1=a
self.b1=b
print'init'
def mydefault(self,*args):
print'default:'+str(args[0])
def_getattr_(self,name):
print"other fn:",name
return self.mydefault
a1=A(10,20)
a1.fn1(33)
a1.fn2('hello')
a1.fn3(10)
問題8:一個包里有三個模塊,mod1.py , mod2.py , mod3.py ,但使用 from demopack import * 導入模塊時,如何保證只有 mod1 、 mod3 被導入了。
答:在包中增加 __init__.py 文件,並在文件中增加:
_all_=['mod1','mod3']
問題9:寫一個函數,接收整數參數 n ,返回一個函數,函數返回n和參數的積。
答:
def mulby(num):
def gn(val):
return num*val
return gn
zw=mulby(7)
print(zw(9));
問題10:請問下面的代碼有什麼隱患?(Python2中)
def strtest1(num):
str='first'
for i in range(num):
str+="X"
return str
答:由於變數str是個不可變對象,每次迭代,python都會生成新的str對象來存儲新的字元串,num越大,創建的str對象越多,內存消耗越大。
9. Python後端開發工程師面試
第一步:自我介紹
第二步:公司介紹
第三步:技術基礎
第四步:項目介紹
第五步:待遇
自我介紹,簡單直接,姓名,籍貫,大學,工作經歷
示例如下:
你好,面試官,我叫XX,來自XX,本科畢業於XX,主修XX專業,有X年工作經驗,在上一家公司擔任python後端開發工程師的職位。
公司名稱是XX、公司主要做外包軟體、都有軟體定製/商城定製、前端2個後端2個運維1個
主要是根據你簡歷中填寫的技術,根據我的簡歷中所寫的,總結幾點如下:
字典的查詢流程:
不可變對象可哈希, str , fronzenset , tuple ,自己實現的類,要重載 __hash__ 方法。
dict內存花銷大,但是查詢速度快,自定義的對象或者python內部的對象都是dict包裝的。
dict的存儲順序和元素添加順序有關,添加順序可能改變已有數據的順序。
集合:是一個可以存放任意數據類型的可變無序的映射集合。
set和dict類似,set的核心也是散列表,但是表元只包含值的引用。 由於散列表的特性,set的元素不能重復,且無序。 內部由哈希實現,查找的時間復雜度為O(1),所以性能很高,實現了魔法函數 __contains__ 可以使用in來查找。 set的去重是通過兩個函數 __hash__ 和 __eq__ 實現的。
(1)淺拷貝
定義:淺拷貝只是對另外一個變數的內存地址的拷貝,這兩個變數指向同一個內存地址的變數值。
淺拷貝的特點:
(2)深拷貝:
定義:一個變數對另外一個變數的值拷貝。
深拷貝的特點:
Python GC主要使用引用計數(reference counting)來跟蹤和回收垃圾。在引用計數的基礎上,通過「標記-清除」(mark and sweep)解決容器對象可能產生的循環引用問題,通過「分代回收」(generation collectio n)以空間換時間的方法提高垃圾回收效率。
GIL全稱 Global Interpreter Lock ,中文解釋為全局解釋器鎖。它並不是Python的特性,而是在實現python的主流Cpython解釋器時所引入的一個概念,GIL本質上就是一把互斥鎖,將並發運行變成串列,以此來控制同一時間內共享數據只能被一個任務所修改,從而保證數據的安全性。
GIL保護的是解釋器級別的數據,但是用戶自己的數據需要自己加鎖處理。
既然有了GIL的存在,一個進程中同一時刻只有一個線程能夠被執行,無法利用cpu的多核機制,導致多線程用於I/O密集型,多進程用於計算密集型,如金融分析等。
死鎖:兩個或兩個以上的進程或者線程在執行過程中,因為爭奪資源而造成的互相等待現象,若無外力的作用,都將一直處於阻塞狀態,這些互相等待的進程或者線程就被稱為死鎖。
解決方法,使用遞歸鎖(RLock)
這個RLock內部有一個Lock和一個counter變數,counter記錄著acquire的次數,從而使得資源可以被多次require。直到一個線程所有的acquire都被release,其他的線程才能獲得資源。上面的例子如果使用RLock代替Lock,則不會發生死鎖
可以直接認為是linux,畢竟搞後端的多數是和linux打交道。
那麼如何避免粘包問題呢? 歸根結底就是一句話, 明確兩個包之間的邊界.
UDP不存在粘包問題,是由於UDP發送的時候,沒有經過Negal演算法優化,不會將多個小包合並一次發送出去。另外,在UDP協議的接收端,採用了鏈式結構來記錄每一個到達的UDP包,這樣接收端應用程序一次recv只能從socket接收緩沖區中讀出一個數據包。也就是說,發送端send了幾次,接收端必須recv幾次(無論recv時指定了多大的緩沖區)。
存儲可能包含rdbms,nosql以及緩存等,我以mysql,redis舉例**
10. BAT面試題28:Python是如何進行內存管理的
Python的內存管理,一般從以下三個方面來說:
1)對象的引用計數機制(四增五減)
2)垃圾回收機制(手動自動,分代回收)
3)內存池機制(大m小p)
1)對象的引用計數機制
要保持追蹤內存中的對象,Python使用了引用計數這一簡單的技術。sys.getrefcount(a)可以查看a對象的引用計數,但是比正常計數大1,因為調用函數的時候傳入a,這會讓a的引用計數+1
2)垃圾回收機制
吃太多,總會變胖,Python也是這樣。當Python中的對象越來越多,它們將占據越來越大的內存。不過你不用太擔心Python的體形,它會在適當的時候「減肥」,啟動垃圾回收(garbage
collection),將沒用的對象清除
從基本原理上,當Python的某個對象的引用計數降為0時,說明沒有任何引用指向該對象,該對象就成為要被回收的垃圾了
比如某個新建對象,它被分配給某個引用,對象的引用計數變為1。如果引用被刪除,對象的引用計數為0,那麼該對象就可以被垃圾回收。
然而,減肥是個昂貴而費力的事情。垃圾回收時,Python不能進行其它的任務。頻繁的垃圾回收將大大降低Python的工作效率。如果內存中的對象不多,就沒有必要總啟動垃圾回收。
所以,Python只會在特定條件下,自動啟動垃圾回收。當Python運行時,會記錄其中分配對象(object
allocation)和取消分配對象(object deallocation)的次數。當兩者的差值高於某個閾值時,垃圾回收才會啟動。
我們可以通過gc模塊的get_threshold()方法,查看該閾值。
3)內存池機制
Python中有分為大內存和小內存:(256K為界限分大小內存)
1、大內存使用malloc進行分配
2、小內存使用內存池進行分配
python中的內存管理機制都有兩套實現,一套是針對小對象,就是大小小於256K時,pymalloc會在內存池中申請內存空間;當大於256K時,則會直接執行系統的malloc的行為來申請內存空間。