python's eleventh day for me

Posted Qingqiu_Gu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python's eleventh day for me相关的知识,希望对你有一定的参考价值。

 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的主要内容,如果未能解决你的问题,请参考以下文章

Python之路,Day14 - It's time for Django

python's thirty day for me 异常处理

python's sixth day for me 员工信息表

python's twenty-sixth day for me 模块

python's twenty eithth day for me 模块和包

python's twenty-fifth day for me 模块