小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

春招苦短,我用百道Python面試題備戰(zhàn)

 heii2 2019-03-11

作者:kenwoodjw  來源:機(jī)器之心    


對于機(jī)器學(xué)習(xí)算法工程師而言,Python是不可或缺的語言,它的優(yōu)美與簡潔令人無法自拔。那么你了解過Python編程面試題嗎?從Python基礎(chǔ)到網(wǎng)頁爬蟲你是否能全方位Hold???今天,機(jī)器之心為讀者們推薦一個(gè)Github項(xiàng)目。

在這個(gè)項(xiàng)目中,作者 kenwoodjw 準(zhǔn)備了近 300 道 Python 面試題,同時(shí)還包含解決方案與代碼。作者主要從 Python 基礎(chǔ)、高級語句、網(wǎng)頁應(yīng)用、數(shù)據(jù)庫和測試等角度提問,讀者可只關(guān)注自己需要的領(lǐng)域。目前該項(xiàng)目已經(jīng)完成了很多基礎(chǔ)和高級面試題,本文主要摘取一些 Python 面試題供大家參考。

項(xiàng)目地址:https://github.com/kenwoodjw/python_interview_question

總體而言,項(xiàng)目有近300道面試題。雖然該項(xiàng)目剛開始創(chuàng)建,但很多Python面試題都已經(jīng)提供了解決方案。如下所示為面試題示例:

本文截取了一些面試題及解決方案:

  • Python 基礎(chǔ)

  • 文件操作

  • 模塊與包

  • 數(shù)據(jù)類型

  • 企業(yè)面試題

  • Python 高級

  • 設(shè)計(jì)模式

  • 系統(tǒng)編程

Python 基礎(chǔ)

什么是 Python?根據(jù)Python 創(chuàng)建者 Guido van Rossum 所言,Python是一種高級編程語言,其設(shè)計(jì)的核心理念是代碼的易讀性,以及允許編程者通過若干行代碼輕松表達(dá)想法創(chuàng)意。實(shí)際上,很多開發(fā)者選擇學(xué)習(xí) Python 的首要原因是其編程的優(yōu)美性,用它編碼和表達(dá)想法非常自然。

文件操作

1.若有一個(gè)jsonline格式的文件file.txt,大小約為10K,我們的處理方式為:

def get_lines():
        l = []
        with open('file.txt', 'rb') as f:
            for eachline in f:
                l.append(eachline)
            return l

if __name__ == '__main__':
    for e in get_lines():
        process(e) #處理每一行數(shù)據(jù)

現(xiàn)在要處理一個(gè)大小為10G的file.txt文件,但是內(nèi)存只有4G。如果在只修改get_lines 函數(shù)而其他代碼保持不變的情況下,應(yīng)該如何實(shí)現(xiàn)?需要考慮的問題都有那些?

def get_lines():
        l = []
        with open('file.txt','rb') as f:
            data = f.readlines(60000)
        l.append(data)
        yield l

要考慮的問題有:內(nèi)存只有4G,無法一次性讀入10G文件。而分批讀入數(shù)據(jù)要記錄每次讀入數(shù)據(jù)的位置,且分批每次讀取得太小會在讀取操作上花費(fèi)過多時(shí)間。

模塊與包

2.如何輸入日期, 判斷這一天是這一年的第幾天?

import datetime

def dayofyear():
    year = input('請輸入年份: ')
    month = input('請輸入月份: ')
    day = input('請輸入天: ')
    date1 = datetime.date(year=int(year),month=int(month),day=int(day))
    date2 = datetime.date(year=int(year),month=1,day=1)
    return (date1-date2).days+1

數(shù)據(jù)類型

3.如何反轉(zhuǎn)字符串'aStr'?

print('aStr'[::-1])

4.下面代碼的輸出結(jié)果將是什么?會報(bào)錯(cuò)嗎?

list = ['a','b','c','d','e']
print(list[10:])

代碼將輸出[],并不會產(chǎn)生IndexError 錯(cuò)誤。如果嘗試用超出成員的個(gè)數(shù)的index來獲取某個(gè)列表的成員,那就會報(bào)錯(cuò)。例如,嘗試獲取 list[10] 和之后的成員,會導(dǎo)致IndexError。然而當(dāng)我們嘗試獲取列表的切片時(shí),開始的index超過成員個(gè)數(shù)并不會產(chǎn)生IndexError,而是僅僅返回一個(gè)空列表。因?yàn)椴⒉粫?bào)錯(cuò),所以這種Bug很難追蹤到。

5.請寫出一段Python代碼,實(shí)現(xiàn)刪除list里面的重復(fù)元素?

l1 = ['b','c','d','c','a','a']
l2 = list(set(l1))
print(l2)

用list類的sort方法可以保證順序不變:

l1 = ['b', 'c', 'd', 'c', 'a', 'a']
l2 = list(set(l1))
l2.sort(key=l1.index)
print(l2)

也可以這樣寫:

l1 = ['b', 'c', 'd', 'c', 'a', 'a']
l2 = sorted(set(l1), key=l1.index)
print(l2)

也可以用遍歷:

l1 = ['b', 'c', 'd', 'c', 'a', 'a']
l2 = []
for i in l1:
    if not i in l2:
        l2.append(i)
print(l2)

企業(yè)面試題

6.設(shè)計(jì)實(shí)現(xiàn)遍歷目錄與子目錄,抓取.pyc文件

第一種方法:

import os


def getFiles(dir, suffix):
    res = []
    for root, dirs, files in os.walk(dir):
        for filename in files:
            name, suf = os.path.splitext(filename)
            if suf == suffix:
                res.append(os.path.join(root, filename))

    print(res)


getFiles('./', '.pyc')

第二種方法:

import os


def pick(obj):
    try:
        if obj.[-4:] == '.pyc':
            print(obj)
        except:
        return None


def scan_path(ph):
    file_list = os.listdir(ph)
    for obj in file_list:
        if os.path.isfile(obj):
    pick(obj)
    elif os.path.isdir(obj):
    scan_path(obj)


if __name__ == '__main__':
    path = input('輸入目錄')
    scan_path(path)

7.如何反轉(zhuǎn)一個(gè)整數(shù),例如-123--> -321?

class Solution(object):
    def reverse(self, x):
        if -10 < x < 10:
            return x
        str_x = str(x)
        if str_x[0] != '-':
            str_x = str_x[::-1]
            x = int(str_x)
        else:
            str_x = str_x[1:][::-1]
            x = int(str_x)
            x = -x
        return x if -2147483648 < x < 2147483647 else 0


if __name__ == '__main__':
    s = Solution()
    reverse_int = s.reverse(-120)
    print(reverse_int)

Python高級

Python高級包含很多重要的模塊,例如函數(shù)、類和實(shí)例、系統(tǒng)編程、正則表達(dá)式、網(wǎng)絡(luò)編程等等。根據(jù)這些高級屬性,Python可用于數(shù)據(jù)科學(xué)、網(wǎng)頁開發(fā)、機(jī)器學(xué)習(xí)等等。

設(shè)計(jì)模式

8.對設(shè)計(jì)模式的理解,簡述你了解的設(shè)計(jì)模式?

設(shè)計(jì)模式是為我們經(jīng)常會碰到的一些編程問題構(gòu)建的可重用解決方案,它是總結(jié)性和經(jīng)優(yōu)化的。一個(gè)設(shè)計(jì)模式并不像一個(gè)類或一個(gè)庫那樣能夠直接作用于我們的代碼,反之,設(shè)計(jì)模式更為高級,它是一種在特定情形下實(shí)現(xiàn)的方法模板。常見的是工廠模式和單例模式。

單例模式應(yīng)用的場景一般發(fā)現(xiàn)在以下條件下: 資源共享的情況下,避免由于資源操作時(shí)導(dǎo)致的性能或損耗等,如日志文件,應(yīng)用配置。控制資源的情況下,方便資源之間的互相通信。

9.生成器和迭代器的區(qū)別?

迭代器是一個(gè)更抽象的概念,任何對象,如果它的類有 next 方法和 iter 方法返回自己本身,它就是可迭代的。對于 string、list、dict、tuple 等這類容器對象,使用for循環(huán)遍歷是很方便的,for 語句實(shí)際上會對容器對象調(diào)用 iter() 函數(shù)。iter() 會返回一個(gè)定義了 next() 方法的迭代器對象,它在容器中逐個(gè)訪問容器內(nèi)元素,在沒有后續(xù)元素時(shí),next()會拋出一個(gè)StopIteration異常。

生成器(Generator)是創(chuàng)建迭代器的簡單而強(qiáng)大的工具。它們寫起來就像是正規(guī)的函數(shù),只是在需要返回?cái)?shù)據(jù)的時(shí)候使用yield語句。生成器能做到迭代器能做的所有事,而且因?yàn)樽詣觿?chuàng)建iter()和next()方法,生成器顯得特別簡潔,而且生成器也是高效的,使用生成器表達(dá)式取代列表解析可以同時(shí)節(jié)省內(nèi)存。除了創(chuàng)建和保存程序狀態(tài)的自動方法,當(dāng)發(fā)生器終結(jié)時(shí),還會自動拋出StopIteration異常。

10.對裝飾器的理解,你能寫出一個(gè)計(jì)時(shí)器裝飾器,它能記錄函數(shù)的執(zhí)行時(shí)間嗎?

裝飾器本質(zhì)上是一個(gè)Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個(gè)函數(shù)對象。

import time
    def timeit(func):
        def wrapper():
            start = time.clock()
            func()
            end = time.clock()
            print('used:',end-start)
            return wrapper
    @timeit
    def foo():
        print('in foo()'foo())

系統(tǒng)編程

11.介紹一下你了解的進(jìn)程。

程序運(yùn)行在操作系統(tǒng)上的一個(gè)實(shí)例,就稱之為進(jìn)程。進(jìn)程需要相應(yīng)的系統(tǒng)資源:內(nèi)存、時(shí)間片、pid。創(chuàng)建進(jìn)程: 首先要導(dǎo)入multiprocessing中的Process;創(chuàng)建一個(gè)Process對象;創(chuàng)建Process對象時(shí),可以傳遞參數(shù)。

p = Process(target=XXX, args=(tuple,), kwargs={key: value})
target = XXX # 指定的任務(wù)函數(shù),不用加()
args = (tuple,)
kwargs = {key: value} # 給任務(wù)函數(shù)傳遞的參數(shù)

使用start()啟動進(jìn)程 結(jié)束進(jìn)程 給子進(jìn)程指定函數(shù)傳遞參數(shù)Demo

import os
from mulitprocessing import Process
import time


def pro_func(name, age, **kwargs):
    for i in range(5):
        print('子進(jìn)程正在運(yùn)行中,name=%s,age=%d,pid=%d' % (name, age, os.getpid()))
        print(kwargs)
        time.sleep(0.2)


if __name__ == '__main__':
    # 創(chuàng)建Process對象
    p = Process(target=pro_func, args=('小明', 18), kwargs={'m': 20})
    # 啟動進(jìn)程
    p.start()
    time.sleep(1)
    # 1秒鐘之后,立刻結(jié)束子進(jìn)程
    p.terminate()
    p.join()

12.談?wù)勀銓Χ噙M(jìn)程、多線程、以及協(xié)程的理解,項(xiàng)目是否用?

進(jìn)程:一個(gè)運(yùn)行的程序(代碼)就是一個(gè)進(jìn)程,沒有運(yùn)行的代碼叫程序,進(jìn)程是系統(tǒng)資源分配的最小單位,進(jìn)程擁有自己獨(dú)立的內(nèi)存空間,所有進(jìn)程間數(shù)據(jù)不共享,開銷大。線程: cpu調(diào)度執(zhí)行的最小單位,也叫執(zhí)行路徑,不能獨(dú)立存在,依賴進(jìn)程存在,一個(gè)進(jìn)程至少有一個(gè)線程,叫主線程,而多個(gè)線程共享內(nèi)存可以極大地提高了程序的運(yùn)行效率。協(xié)程: 是一種用戶態(tài)的輕量級線程,協(xié)程的調(diào)度完全由用戶控制,協(xié)程擁有自己的寄存器上下文和棧。協(xié)程調(diào)度時(shí),將寄存器上下文和棧保存到其他地方,在切回來的時(shí)候,恢復(fù)先前保存的寄存器上下文和棧,直接操中棧則基本沒有內(nèi)核切換的開銷,可以不加鎖的訪問全局變量,所以上下文的切換非常快。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多