Python高級面試題


請手寫一個單例

class A(object):
    __instance = None

    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            cls.__instance = object.__new__(cls)
            return cls.__instance
        else:
            return cls.__instance

單例模式的應用場景有哪些?

單例模式應用的場景一般發現在以下條件下:
(1)資源共享的情況下,避免由於資源操作時導致的性能或損耗等。如日志文件,應用配置。
(2)控制資源的情況下,方便資源之間的互相通信。如線程池等。 1.網站的計數器 2.應用配置 3.多線程池 4.
數據庫配置,數據庫連接池 5.應用程序的日志應用....

對裝飾器的理解 ,並寫出一個計時器記錄方法執行性能的裝飾器?

裝飾器本質上是一個 Python 函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外

功能,裝飾器的返回值也是一個函數對象。
import time

def add_time(func):
    def wrapper(*args,**kwargs):
        start = time.time()
        func(*args,**kwargs)
        end = time.time()

        print("time",end-start)

    return wrapper

@add_time
def my_count():
    s = 0
    for i in range(1000001):
        s += i
    print(s)

# 執行函數
my_count()

解釋一下什么是閉包?

在函數內部再定義一個函數,並且這個函數用到了外邊函數的變量,那么將這個函數以及用到的一些變量稱之為 閉包。

函數裝飾器有什么作用?

裝飾器本質上是一個 Python 函數,它可以在讓其他函數在不需要做任何代碼的變動的前提下增加額外的功能。裝 飾器的返回值也是一個函數的對象,
它經常用於有切面需求的場景。 比如:插入日志、性能測試、事務處理、緩存、 權限的校驗等場景 有了裝飾器就可以抽離出大量的與函數功能本身無關的雷同代碼並發並繼續使用。

生成器、迭代器的區別?

迭代器是一個更抽象的概念,任何對象,如果它的類有 next 方法和 iter 方法返回自己本身,對於 string、list、 dict、tuple 等這類容器對象,
使用 for 循環遍歷是很方便的。在后台 for 語句對容器對象調用 iter()函數,iter() 是 python 的內置函數。
iter()會返回一個定義了 next()方法的迭代器對象,它在容器中逐個訪問容器內元素,next() 也是 python 的內置函數。
在沒有后續元素時,next()會拋出一個 StopIteration 異常。 生成器(Generator)是創建迭代器的簡單而強大的工具。它們寫起來就像是正規的函數,只是在需要返回數 據的時候使用 yield 語句
每次 next()被調用時,生成器會返回它脫離的位置(它記憶語句最后一次執行的位置 和所有的數據值) 區別:生成器能做到迭代器能做的所有事,而且因為自動創建了 iter()和 next()方法,生成器顯得特別簡潔,而且 生成器也是高效的,
使用生成器表達式取代列表解析可以同時節省內存。除了創建和保存程序狀態的自動方法,當 發生器終結時,還會自動拋出 StopIteration 異常。

X 是什么類型?

1. X = (for i in rang(10))
X 是 generator 類型。
 

Python 中 yield 的用法?

yield 就是保存當前程序執行狀態。你用 for 循環的時候,每次取一個元素的時候就會計算一次。用 yield 的函數
叫 generator,和 iterator 一樣,它的好處是不用一次計算所有元素,而是用一次算一次,可以節省很多空間。generator
每次計算需要上一次計算結果,所以用 yield,否則一 return,上次計算結果就沒了。
def createGenerator():
    mylist = range(3)
    for i in mylist:
        yield i*i

mygenerator = createGenerator()
print(mygenerator)

for i in mygenerator:
    print(i)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM