国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

「Python 面試」第二次更新

Yu_Huang / 737人閱讀

摘要:結(jié)果為對于迭代器和生成器你知道哪些,它們分別應(yīng)用于什么場景先介紹什么是可迭代的任何可用于循環(huán)的都是可迭代的。示例結(jié)果為,迭代器任何可以使用函數(shù)的都是迭代器,也可使用函數(shù)將可迭代對象變?yōu)榈鳌N磳懲辏麓胃卵a(bǔ)上。

閱讀本文大約需要 8 分鐘。
7.說一下 Python 中的裝飾器

原理:利用閉包,將目標(biāo)函數(shù)外面再套一層函數(shù),使得目標(biāo)函數(shù)具有一個新的功能,并且不改變目標(biāo)函數(shù)原有功能。

實現(xiàn)方式:

閉包

def decorate(func):
    def wrapper():
        print("新功能")
        func()    
    return wrapper

def func():
    print("原有功能")

f = decorate(func)
f()

# 結(jié)果為:
新功能
原有功能

@ 語法糖

def decorate01(func):
    def wrapper():
        print("新功能")
        func()       
    return wrapper

@decorate01
def func01():
    print("原有功能")

func01()

# 結(jié)果為:
新功能
原有功能

?

8.說一說類屬性、實例屬性、私有屬性和保護(hù)屬性

類屬性相當(dāng)于全部變量,所有由類創(chuàng)建出來的實例,都可以使用,而實例屬性相當(dāng)于局部變量,只能由該實例自己使用,當(dāng)類屬性與實例屬性命名一樣時,在調(diào)用該同名屬性時,會屏蔽掉類屬性,調(diào)用實例屬性,這點(diǎn)跟 LEGB 很像。

當(dāng)通過實例對象來修改類屬性時,其實修改的并不是類屬性,而是新建了一個跟類屬性名一樣的實例屬性。

Python 中將以兩個下劃線__開頭,但不以兩個下劃線結(jié)尾的變量,認(rèn)作為私有屬性,Python 通過 name manage算法,將該私有屬性的引用更改為_classname_reference,用戶試圖調(diào)用該私有屬性時,會因為對象引用不一樣而找不到該屬性,故而實現(xiàn)了「屬性私有化」。

在獲取實例屬性時,一般采用定義一個實例方法的方式獲取屬性,避免直接對實例屬性進(jìn)行操作,起到一個保護(hù)屬性的作用。

9.為什么說 Python 是動態(tài)語言,鴨子類型是指什么

Python 相當(dāng)于其他靜態(tài)語言,可以在代碼運(yùn)行過程中,改變變量的屬性。

鴨子類型指的是 Python 不用定義變量類型,只要該變量像是什么類型,那么就認(rèn)為它就是什么類型,我們更多關(guān)注的是它的行為,而不是它的類型。

10.元類是什么

實例都是由類創(chuàng)建出來,而類則是由元類創(chuàng)建出來。他們之間的關(guān)系相當(dāng)于「奶奶-媽媽-孫子」。

示例:

class Myclass():
    pass


new = type("NewClass", (Myclass,), {"name": "new"})

print(new)
print(new.__mro__)  # 查看該類的繼承情況

# 結(jié)果為

(, , )

具體點(diǎn)的內(nèi)容可以參考這篇問答:什么是元類

11.@staticmethod 和 @classmethod 的區(qū)別

@staticmethod 是為類添加一個靜態(tài)方法

@classmethod 是為類添加一個類方法

12.如何動態(tài)添加屬性

由于 Python 的特性使得程序在運(yùn)行過程中,我們可以為某個對象添加屬性、方法。

示例:

class Myclass:
    pass


m = Myclass()

# 為實例動態(tài)添加一個屬性
m.name = "new_atribute"

def func(self):
    return "new_function"

# 為實例動態(tài)添加一個方法
m.func = func

print(m.name)
print(m.__dict__) # 返回 m 的所有屬性,方法

# 結(jié)果為
new_atribute
new_function
{"func": , "name": "new_atribute"}

# 另外一種動態(tài)添加方法
import types


def func01(self):
    print("new_function01")

# 實例 m 添加一個屬性 func,而這個屬性指向func()函數(shù),故當(dāng)調(diào)用 m.func 時,也就相當(dāng)于調(diào)用了 func() 函數(shù),間接實現(xiàn)了為 m 添加方法 func()。
m.func = types.MethodType(func, m)

print(m.func())

# 結(jié)果為 new_function01
13.對于迭代器和生成器你知道哪些,它們分別應(yīng)用于什么場景

先介紹什么是可迭代的Iterable:任何可用于for循環(huán)的都是可迭代的。也可以使用collection模塊下的isinstance(obj, Iterable)來檢驗該對象是否可迭代。

示例:

from collections import Iterable


print(isinstance("abc",Iterable)) 
print(isinstance(123,Iterable)) 

# 結(jié)果為 True,F(xiàn)alse

迭代器

任何可以使用next()函數(shù)的都是迭代器,也可使用iter()函數(shù)將可迭代對象變?yōu)榈鳌?

示例:

from collections import Iterator


itr = iter("abc")

print(type(itr))
print(isinstance(itr, Iterator)) 

# 結(jié)果為 Iterator,True

生成器

任何函數(shù)中含有yield關(guān)鍵字的都是生成器,列表生成式中的[]改為()也是一個生成器。

實現(xiàn)方式

示例:

g = [i for i in range(10)]

print(type(g))

# 結(jié)果為 list

g1 = (i for i in range(10))

print(type(g1))

# 結(jié)果為 generator

def func():
    for i in range(10):
        yield i

f = func()
print(f)

# 結(jié)果為 

生成器怎么取值,什么時候結(jié)束

生成器可以通過next(f)f.__next__()f.send()三種方式來取值

示例:

def func01():
    for i in range(10):
        yield i

f = func()
print(next(f))
print(f.__next__())
print(f.send("hahah"))

# 結(jié)果為 
0
1
2

其中f.send()可以向生成器傳值,但是其第一次傳入的值默認(rèn)為None。如果想要取出send("hahah")里傳入的值,則需要在生成器中添加接收的變量。

示例:

def func():
    for i in range(10):
        # yield i
        temp = yield i
        print(temp)
        
f = func()

print(next(f))
print(f.__next__())
print(f.send("hahah"))  

# 結(jié)果為
0
None
1
hahah
2

生成器里的值被取完之后,或者中間遇到 return關(guān)鍵字,就會退出,這三種方法有一個共同點(diǎn):當(dāng)生成器取完之后會拋出StopIteration的錯誤。

而使用for循環(huán)來取出生成器里的值就不會拋出錯誤,這也是最被推薦的。

應(yīng)用場景

在生成一個包含很多數(shù)(百萬級別)的列表時,但是又只用得到其中很小一部分的數(shù)時,使用列表生成式會極大的浪費(fèi)內(nèi)存,且不一定能夠生成,因為受機(jī)器內(nèi)存限制。

而使用生成器則不然,生成器只是在你需要的時候,才會申請一塊內(nèi)存,可以邊取邊用,極大的降低了內(nèi)存消耗。

生成器用的最多的地方在于「協(xié)程」。由于基于 C 解釋器下的 Python 中含有一個 GIL 鎖,使得 Pyhon 的多線程是一個假性多線程,這也是為什么很多人說 Python 性能慢的原因。


未寫完,下次更新補(bǔ)上。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/45133.html

相關(guān)文章

  • http相關(guān)面試

    摘要:狀態(tài)碼有那些分別代表是什么意思簡單版繼續(xù),一般在發(fā)送請求時,已發(fā)送了之后服務(wù)端將返回此信息,表示確認(rèn),之后發(fā)送具體參數(shù)信息正常返回信息請求成功并且服務(wù)器創(chuàng)建了新的資源服務(wù)器已接受請求,但尚未處理請求的網(wǎng)頁已永久移動到新位置。 http狀態(tài)碼有那些?分別代表是什么意思? 簡單版 [ 100 Continue 繼續(xù),一般在發(fā)送post請求時,已發(fā)送了http header之后...

    沈建明 評論0 收藏0
  • 一道JavaScript面試題:理解Function

    摘要:關(guān)于該問題的討論今天看到的一道面試題,感覺對理解的以及原型鏈和閉包很有幫助。自己并試著講述一下自己的理解,歡迎拍磚。進(jìn)入上下文時,會獲取,函數(shù)聲明,變量聲明。 2017.3.27更新今天在刷題的時候,突然發(fā)現(xiàn)之前已經(jīng)有人在討論這道題了,而且還涉及到了運(yùn)算符優(yōu)先級的問題,這是自己一開始沒有想到的。(其實有人也說:程序?qū)懚嗔耍匀挥涀×耸裁辞闆r下會發(fā)生什么樣的事情,但是為什么會發(fā)生這樣的事...

    UsherChen 評論0 收藏0
  • 關(guān)于三次握手與四次揮手面試官想考我們什么?--- 不看后悔系列

    摘要:第三次握手客戶端收到報文之后,會回應(yīng)一個報文。因此,需要三次握手才能確認(rèn)雙方的接收與發(fā)送能力是否正常。三次握手的作用三次握手的作用也是有好多的,多記住幾個,保證不虧。也就是說,第一次第二次握手不可以攜帶數(shù)據(jù),而第三次握手是可以攜帶數(shù)據(jù)的。在面試中,三次握手和四次揮手可以說是問的最頻繁的一個知識點(diǎn)了,我相信大家也都看過很多關(guān)于三次握手與四次揮手的文章,今天的這篇文章,重點(diǎn)是圍繞著面試,我們應(yīng)該...

    WilsonLiu95 評論0 收藏0
  • 字節(jié)跳動上海DATA部門后端開發(fā)秋招面試經(jīng)歷

    摘要:講了一下我在電力物聯(lián)網(wǎng)項目中通過設(shè)計的文件遠(yuǎn)程升級功能。完成聊天畢業(yè)規(guī)劃怎么樣收到面試調(diào)查問卷等待中。。。。。 7.31 投遞提前批c++客戶端崗位 8.16 被轉(zhuǎn)...

    Ocean 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<