python学习记录六

Posted 冰糖葫芦很乖

tags:

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

返回函数

def calc_sum(*args):
    ax = 0
    for n in args:
        ax = ax + n
    return ax

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

返回的不是求和结果,而实求和函数

>>> f = lazy_sum(1,3,5,7,9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>
>>> f()
25

当我们调用lazy_sum()时,每次调用都会返回一个新的函数,即使传入相同的参数:

>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1==f2
False

f1()f2()的调用结果互不影响。

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()

在上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了。

你可能认为调用f1(),f2()和f3()结果应该是1,4,9,但实际结果是:

>>> f1()
9
>>> f2()
9
>>> f3()
9

全部都是9!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。
返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。 

可以这么写试试
def count():
    def f(j):
        def g():
            return j*j
        return g
    fs = []
    for i in range(1, 4):
        fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
    return fs

 

匿名函数

>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]

我们可以看出

lambda x: x * x 实际上都是:
def f(x)
    return x * x

关键字lambda表示匿名函数,冒号前面的x表示函数参数。
匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:

装饰器

由于函数也是一个对象 而且函数对象可以被赋值给变量 通过变量也可以调用函数

>>> def now():
...     print(2015-3-25)
...
>>> f = now
>>> f()
2015-3-25

函数对象有一个__name__属性,可以拿到函数的名字:
>>> now.__name__
‘now‘
>>> f.__name__
‘now‘

 

以上是关于python学习记录六的主要内容,如果未能解决你的问题,请参考以下文章

Python 函数声明和调用

python 机器学习有用的代码片段

[未解决问题记录]python asyncio+aiohttp出现Exception ignored:RuntimeError('Event loop is closed')(代码片段

学习笔记:python3,代码片段(2017)

(记录)python篇:六_ 函数1

(记录)python篇:六_ 函数2