Python学习(九)--[进阶]函数

  • 闭包

Python的函数时可以嵌套的,可以将一个函数放在另外一个里面。

def multiplier(factor):
    def multiplyByFactor(number):
        return number*factor
    return multiplyByFactor

调用multiplier()时,返回的是里层函数,也就是说函数本身被返回了,但并没有被调用。重要的是返回的函数还可以访问它的定义所在的作用域。

在一个外函数中定义了一个内函数,内函数运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包。如果外函数在结束的时候发现自己的临时变量将来会在内函数中用到,就会把这个临时变量绑定给了内部函数,然后自己再结束。

使用闭包的过程中,一旦外函数被调用了一次返回内函数的引用,虽然每次调用内函数是开启一个函数执行过后消亡,但是闭包变量实际上只有一份,每次开启内函数都在使用同一份闭包变量。

可以来看一个例子:

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

f1, f2, f3 = count()

在这个例子里,每次循环,都会创建一个新的函数,然后把函数名放到列表fs里,并没有调用函数f,也就是说不会进行内部计算。最后把三个函数都返回。这里要注意的是,外函数变量fs,i都是只有一份的,所以循环了3次以后,i就变成了3。所以最后我们发现调用f1(),f2(),f3()返回的结果都是9。

>>> f1()
9
>>> f2()
9
>>> f3()
9
  • 匿名函数

lambda作为表达式,定义了一个匿名函数。比如:lambda x: x+1。实际上是定义了一个函数,和下面的效果一样。

    def fun(x)
        return(x+1)
  • 装饰器

在Python里函数也是一个对象,函数对象有一个__name__属性,可以拿到函数的名字:

>>> def name():
...     print ‘Tom‘
...
>>> name.__name__
‘name‘

如果想要增强name()函数的功能,但是又不希望修改name()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”。

装饰器就是一个返回函数的高阶函数,比如定义一个打印日志的装饰器:

def log(func):
    def wrapper(*args, **kw):
        print ‘call %s():‘ % func.__name__
        return func(*args, **kw)
    return wrapper

log是一个装饰器,接受一个函数作为参数,并返回一个函数。所以我们使用装饰器时,就需要用@语法:

@log
def name():
    print ‘Tom‘

多以现在调用name(),相当于执行了name = log(name),然后再执行name()。

  • 偏函数

Python的functools模块提供了片函数的功能。

比如int()函数可以把字符串转换为整数,也可以传入base参数,设置转换的进制。比如int(‘1234’,base = 8)。如果要转换大量的八进制字符串,每次都要传入进制参数,于是可以:

def int8(x,base = 8)
    return int(x,base)

我们也可以使用片函数实现相同的效果,也就是:

int8 = functools.partial(int, base=2)

参考文章:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819879946007bbf6ad052463ab18034f0254bf355000

原文地址:https://www.cnblogs.com/mujiujiu/p/9278735.html

时间: 2024-08-29 07:34:59

Python学习(九)--[进阶]函数的相关文章

初学Python(九)——函数

初学Python(九)--函数 初学Python,主要整理一些学习到的知识点,这次是函数. 函数定义: # -*- coding:utf-8 -*- #函数的定义 def my_function(x): if x>0: return x elif x<0: return -x else: pass #函数的调用 a = my_function(-1) b = my_function(2) c = my_function(0) print a,b,c #空函数,pass为占位符 def empt

python学习笔记之函数总结--高阶函数以及装饰器

python学习笔记之函数总结--高阶函数以及装饰器 Python特点: 1.不是纯函数式编程(允许变量存在): 2.支持高阶函数(可以传入函数作为变量): 3.支持闭包(可以返回函数): 4.有限度的支持匿名函数: 高阶函数: 1.变量可以指向函数: 2.函数的参数可以接收变量: 3.一个函数可以接收另一个函数作为参数: 下面我将示例一些函数的写法以及使用,并说明python中函数的特性: 1.基本的高阶函数示例: #!/usr/bin/env python def func():      

OpenCV for Python 学习 (一 绘图函数)

本人的学习笔记主要记录的是学习opencv-python-tutorials这本书中的笔记 今天晚上简单学习OpenCV for Python如何绘图,主要用了这几个函数(这几个函数可在:http://docs.opencv.org/modules/core/doc/drawing_functions.html 找到): cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) cv2.circle(img, center,

Python学习笔记进阶篇——总览

Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(Socket编程进阶&多线程.多进程) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(异常处理) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(多线程与进程池) Python学习笔记——进阶篇[第九周]———线程.进程.协程篇(队列Queue和生产者消费者模型) Python学习笔记——进阶篇[第九周]———协程 Python学习笔记——进阶篇[第九周]———MYSQL操作

[Python学习] 专题一.函数的基础知识

        最近才开始学习Python语言,但就发现了它很多优势(如语言简洁.网络爬虫方面深有体会).我主要是通过<Python基础教程>和"51CTO学院 智普教育的python视频"学习,在看视频中老师讲述函数知识的时候觉得非常不错,所以就写了第一篇Python学习的文章分享给大家.主要内容:         1.Python安装与基本输入输出,print()函数和raw_input()函数简单用法. 2.我根据视频中学到的知识,讲解函数的基本知识: (1).系统提

python学习day3:函数

:first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } img { border: 0; max-width: 100%; height: auto !important; margin: 2px 0; } table { border-collapse: collapse; border: 1px solid #bbbbbb; } td { padding:4px 8px; border-co

Python学习笔记003_函数

>>> # 函数>>> def myFirstFunction(params1,params2...): print("这是我的第一个函数!") print("Python你好吗?") >>> #调用函数>>> >>> myFirstFunction()这是我的第一个函数!Python你好吗? >>>  # 函数的返回值  return #函数文档, 就是函数

Python学习笔记6-python函数补充、装饰器、模块

本文主要学习内容有 函数知识的补充 装饰器(无参.有参.非固定参数.有返回值) 函数知识的补充 稍后待续...

PYTHON学习0026:函数---嵌套函数和作用域----2019-6-19

1.函数定义后,只要没调用,其内部代码永远不会执行.2.函数内部可以再定义函数3.嵌套函数里有变量时,先在本级函数作用域找函数值,没有则逐级往上找.(本级--父级--爷爷级--....-全局),找到了则就不继续再往上找了. 作用域:一.在PYTHON中,一个函数就是一个作用域,函数定义完成后,作用域已经生成,以后不管在哪里调用,作用域不变. 原文地址:https://blog.51cto.com/13543767/2411285