为了账号安全,请及时绑定邮箱和手机立即绑定
慕课网数字资源数据库体验端
python进阶_学习笔记_慕课网
为了账号安全,请及时绑定邮箱和手机立即绑定

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
  • 我一定是来学数学的...

    辗转相除法,Python版mark

    查看全部
  • def count():
        fs = []
        for i in range(1, 4):
            def f(j):
                def g():
                    return j*j
                return g
            r = f(i)
            fs.append(r)
        return fs
    f1, f2, f3 = count()
    print f1(), f2(), f3()

    先记录下答案,但是对于闭包,还是不太理解。

    初步解读代码  fs中保存的是f(1),f(2),f(3)

    --------------------------------(新的理解)---------------------------------

    在对答案代码的debug中,打印出了每轮循环中的r,得到的是地址。因为:
    r = f(i) 相当于调用了函数f(i),而f(i)是一个闭包,返回的是一个函数。
    继续打印f1,f2,f3发现,它们也同为地址。因为:
    f1, f2, f3 = count() 相当于调用了count()函数,而count()是一个闭包,返回的是三个函数。
    (此处可以看Python函数那部分。)
    对比两次的打印结果,发现对应的地址相同。

    此时,我有了一个大胆的想法(滑稽.jpg)
    就是每轮循环中,r所获取的是不是就可以看成一个有着默认参数的一个函数呢?
    然后开始了我的第一次实验:
    def a(i = 1):
       def g():
           return i * i
       return g
    r = a()
    print(r,r())

    得到的结果是:
    <function a.<locals>.g at 0x000001BE021C3598> 1
    然后是第二次实验:
    # 希望一次返回3个函数,分别计算1x1,2x2,3x3:
    def count():
       fs = []
       for i in range(1, 4):
           def f(j = i):
                return j*j
           fs.append(f)
       return fs

    f1, f2, f3 = count()
    print (f1, f2, f3)
    print (f1(), f2(), f3())

    这次的实验结果就很刺激:(同样,对输出的格式做了修改。代码里没有。)
    <function count.<locals>.f at 0x000001BE0BC6A6A8>
    <function count.<locals>.f at 0x000001BE19377E18>
    <function count.<locals>.f at 0x000001BE19377A60>
    1 4 9

    新的理解出现了。(大雾)
    我开始是学java的,用java 里面的思想解释(不是很贴切):
    答案中的方式,在循环中有加入的一个新的闭包的方式,就相当于把我们想要返回的函数
    g放在了一个内部类中,每次循环都生成一个新的类,初始化的值分别为1,2,3所以才会有
    不同的值出现。因为我们得到的是不同的类中的g。
    而我所实验的代码,就是加入了默认参数的函数,相当于每次都更新的他的默认参数,
    所以在每次调用的时候就会有不同的值,(因为他们的默认参数是不同的。)

    (个人想法,Python新手,希望有大佬指出其中的错误。)



    ================写完才发现,原来有大佬已经这么做了(笑哭.jpg)

    查看全部
    0 采集 收起 来源:python中闭包

    2018-04-12

  • 内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(Closure)

    查看全部
    0 采集 收起 来源:python中闭包

    2018-04-12

  • 返回函数的作用:延迟计算

    查看全部
  • f()可返回函数g()

    查看全部
  • sorted()函数可对list进行排序,可接受比较函数f

    在sortcd()中传入reversed_cmp可以实现倒叙

    查看全部
  • filter(f,list) 返回list,根据f来筛选list

    查看全部
  • 注意,reduce()返回的是最终结果,单值,reduce()接受第三参数为初始值

    查看全部
  • 区分包和普通目录

    查看全部
  • 文件系统中

    查看全部
  • 引用完整的模块名

    查看全部
  • reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。

    查看全部
  • 同名模块放入不同的包中

    查看全部
  • map(f,list),返回新的list(f作用于每个list元素得出新的list)

    查看全部
  • 引用其他模块

    查看全部

举报

0/150
提交
取消
课程须知
本课程是Python入门的后续课程 1、掌握Python编程的基础知识 2、掌握Python函数的编写 3、对面向对象编程有所了解更佳
老师告诉你能学到什么?
1、什么是函数式编程 2、Python的函数式编程特点 3、Python的模块 4、Python面向对象编程 5、Python强大的定制类
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!