2018-02-01python題整理

from:https://zhuanlan.zhihu.com/p/23526961?refer=passer

  1. *args和 **kwargs
    *args:是tuple,list格式
    **kwargs: 是字典格式

標準答案
如果不確定往一個函數中傳入多少個參數,或者用tuple或list的形式傳參數時,我們可以用args.
如果不知道往函數傳遞多少個關鍵詞或者想傳入字典的值作為關鍵參數,我們可以用
*kwargs.

def func(*args, ** kwargs):
    print args,kwargs

d = {'s':1, 'r':2}
l = [1,2,3]
func( *l, c=2,**d)
#輸出 (1, 2, 3) {'s': 1, 'r': 2, 'c': 2}

2.為什么要用裝飾器
裝飾器本質是函數, 他可以讓其他函數不作任何改動的情況下增加額外功能,裝飾器的返回值也是一個函數對象。
經常用于有切面需求的吃場景。比如:插入日志,性能測試,事務處理,緩存,權限校驗。

import functools

def log(function):
    functools.wraps(function)
    def wrapper(*args, **kwargs):
        print "Call %s" % function.__name__
        return function(*args, **kwargs)

    return wrapper

@log
def func(*args, ** kwargs):
    print args,kwargs

d = {'s':1, 'r':2}
l = [1,2,3]
func( *l, c=2,**d)

3.python的垃圾回收機制。

python中的垃圾回收是以引用計數為主, 標記-清除分代收集為輔。

引用計數:Python在內存中存儲每個對象的引用計數,如果計數變成0,該對象就會消失,分配給該對象的內存就會釋放出來。

一些容器對象,比如list、dict、tuple,instance等可能會出現引用循環,對于這些循環,垃圾回收器會定時回收這些循環(對象之間通過引用(指針)連在一起,構成一個有向圖,對象構成這個有向圖的節點,而引用關系構成這個有向圖的邊)。

分代收集:
Python把內存根據對象存活時間劃分為三代,對象創建之后,垃圾回收器會分配它們所屬的代。每個對象都會被分配一個代,而被分配更年輕的代是被優先處理的,因此越晚創建的對象越容易被回收。

4.Python多線程包(multi-threading)。這是個好主意嗎?
python并不支持真正意義的多線程。python中有一個叫Global Interpreter Lock(GIL)的東西,它能確保你的代碼中永遠只有一個線程在執行。
當然如果你的代碼是IO密集型,多線程可以明顯提高效率, 相反如果你的代碼是CPU密集型的,這種情況下多線程大部分是雞肋。
5.說明os,sys模塊不同,并列舉常用的模塊方法?
官方文檔:

os模板提供了一種方便的使用操作系統函數的方法。
sys模板可供訪問由解釋器使用或維護的變量和與解釋器交互的函數。

os.jpg

下面是sys模塊(由解釋器使用或維護的變量和與解釋器交互)
sys.jpg

6.什么是lambda表達式? 它有什么好處?
簡單來說,lambda表達式通常是你需要使用一個函數,但又不想費腦去命名一個函數的時候使用,也就是通常所說的匿名函數。
lambda表達式形式是: lambda關鍵詞后面緊接一個或多個參數,緊接冒號“:”,后面跟著表達式。 它是一個表達式不是語句。

func = lambda x,y,z: x+y+z
print func(1,2,3)

7.字符串替換

12.什么是自省
簡單一句話就是運行時能夠獲得對象的類型

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。