1. 程式人生 > >python's eleventh day for me

python's eleventh day for me

war 什麽是 ret inner tar 緩存 url append 函數名

python2 中沒有nonlocal。

函數名是什麽?

    函數名就是函數的名字, 本質:變量,特殊的變量。

1.單獨打印函數名:

def func():
    print(666)
print(func)     # <function func at 0x0000020C8C7C8F28>   函數的存儲位置。

2.函數名的賦值:

def func():
    print(666)
f = func
print(f)      #<function func at 0x0000015710A08F28>

3.函數名可以作為參數:

a = 1
def f(x):
    print
(x) f(a) # 1

4.函數名可以作為容器類數據的元素。

def func1():
    print(1111)
def func2():
    print(2222)
def func3():
    print(3333)
# func1()
# func2()
# func3()
l = [func1,func2,func3]
for i in l:
    i()
    # 1111
    # 2222
    # 3333


def func1():
    print(1111)
def func2():
    print(2222)
def func3():
    
print(3333) l = [] for i in range(1,4): l.append(func+str(i)) for i in l: eval(i)() # i 裏面是什麽類型 eval(i) 就可以直接把i提出來。

5.函數名可以作為函數的返回值。

def func(x):
    return x
ret = func(5)
print(ret)    # 5

閉包:就是內層函數對外層函數(非全局)變量的引用。

def wraaper():
    def inner():
        print(666)
    return inner
ret 
= wraaper() # inner ret() # inner()

如何判斷是否為閉包:內層函數名.__closure__ 如果有cell 就是閉包。

def wrapper():
    name = 老男孩
    def inner():
        print(name)
    inner()
    print(inner.__closure__)
wrapper()

# 老男孩
# (<cell at 0x000001473F9A0B58: str object at 0x000001474033A5D0>,)

    如果不是閉包就打印None.

name = 顧清秋
def wraaper():
    def inner():
        print(name)
    inner()
    print(inner.__closure__)
wraaper()

# 顧清秋
# None

面試題:‘閉包’

閉包:當函數開始執行時,如果遇到了閉包,他有一個機制,他會永遠開辟一個內存空間,將閉包中的變量等值放入其中,不會隨著函數的執行完畢而消失。

name = 老男孩
def wraaper(n):
    # 相當於  n = ‘老男孩‘
    def inner():
        print(n)    # 老男孩
    inner()
    print(inner.__closure__)    # (<cell at 0x0000017B8CCD0B58: str object at 0x0000017B8D63A5D0>,)
wraaper(name)

第一類對象(first - class object)指

1. 可在運行期創建。

2. 可用作函數參數或返回值。

3. 可存入變量的實體。

閉包:

  閉包函數:

        內部函數包含對外部作用域而非全局作用域變量的的引用,該內部函數成為閉包函數。

        ## 函數內部定義的函數被稱為內部函數。

閉包函數獲取網絡應用:

from urllib.request import urlopen
def index():
    url = "http://www.xiaohua100.cn/index.html"
    def get():
        return urlopen(url).read().decode(utf-8)
    return get
xiaohua = index()
content = xiaohua()
print(content)

   

什麽是裝飾器?

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

  裝飾器的應用場景:比如插入日誌,性能測試,事務處理,緩存等等場景。

裝飾器的形成過程:

  裝飾器---簡單版

import time
def func1():
    print(in func1)
def timer(func):    #  func = func1
    def inner():
        start = time.time()
        func()
        time.sleep(0.3)
        print(time.time()-start)
    return inner
func1 = timer(func1)   #inner
func1()     # inner()

  裝飾器---語法糖

import time
def timer(func):
    def inner():
        start_time = time.time()
        func()
        time.sleep(0.3)
        end_time = time.time()
        print(end_time-start_time)
    return inner
@timer  #語法糖      #  func1 = timer(func1)
def func1():
    print("in func1")
func1()

  帶參數的裝飾器:

import time
def timer(func):
    def inner(a):
        start_time = time.time()
        func(a)
        time.sleep(0.3)
        end_time = time.time()
    return inner
@timer
def func1(a):
    print(a)       #  1
func1(1)

hold 住所有參數的裝飾器

import time
def timer(func):
    def inner(*args,**kwargs):
        start_time = time.time()
        ret = func(*args,**kwargs)
        time.sleep(0.3)
        end_time = time.time()
        print(end_time-start_time)
        return ret
    return inner
@timer
def func1(a,b):
    print(a,b)
@timer
def func2(a,b,c):
    print(a,b,c)
    return True
func1(aaa,bbb)
print(func2(aaa,bbb,ccc))

python's eleventh day for me