鱼C论坛

 找回密码
 立即注册
查看: 5145|回复: 28

[技术交流] 《零基础入门学习Python》20讲内容归纳

[复制链接]
发表于 2015-9-22 21:10:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 醉酒青牛 于 2015-9-22 21:15 编辑

小牛有话说:
        各位鱼油,大家好。我是小牛,如果您已经看完或者正在看鱼神的《零基础入门学习Python》视频,想随时复习前面的知识点却又不想花太多时间和精力重翻视频,来这里《零基础入门Python学习》整理瞅瞅小牛呕心做的的视频内容的总结吧^_^,如果觉得有用的话,可以点击帖子右上角的“订阅”按钮,这样以后就能够随时看到小牛做的最新的整理了   。
本期主要内容导读:
        这一期我们归纳一下鱼神第二十讲“函数:内嵌函数和闭包”。这一期里面鱼神主要是内嵌函数和闭包概念以及它们的作用和使用过程中需要注意的地方。下面我们就来详细介绍一下各个知识点吧~~~~~~
1. 如何在函数体内修改全局变量的值
        上一讲提到过,在函数体内部无法直接修改全局变量的值,Python程序会自动将你在函数体内定义的变量生成为一个新的局部变量,仅是变量名和全局变量相同,由于作用域不同,你改变其值是无法影响到全局变量的值的,从而保护到了全局变量。但是如果你不想让这个变量被转换为一个新的局部变量,还是有办法的,就是先声明这个变量就是全局变量再修改它,其声明语句为global,举例说明:
>>> def myfun():
        global num                   #将其声明为全局变量
        num = 0.0
        count = 0.0
        print('函数体内部修改的num的值为',num)
        print('函数体内部修改的count的值为',count)
>>> num = 10
>>> print(num)
10
>>> count = 5
>>> print(count)
5
>>> myfun()
函数体内部修改的num的值为 0.0
函数体内部修改的count的值为 0.0
>>> print(num)
0.0
>>> print(count)
5
2. 内嵌函数
        内嵌函数指的是在一个函数体内部定义的函数,可以称它为函数的函数。这个时候就牵涉到了函数体内部变量作用域的问题了,为了区分这两个函数,在这里我们将内嵌函数称为子函数,而将其外部的函数称为母函数。与全局变量和局部变量的关系一样:子函数体内定义的变量只在其函数体内部有效,但其内部却可以引用母函数体内定义的变量,但是却仍无法直接修改母函数体内定义的变量,举例说明:
>>> def mother():
        num = 1
        print('在mother函数体内定义的num值为',num)
        def son():
                num = 3
                print('son函数内定义的num值为',num)
        son()
        print('调用完son函数之后num的值为',num)
        def girl():
                print('在girl函数体内打印num的值为',num)
        girl()
>>> num = 100
>>> print(num)
100
>>> mother()
在mother函数体内定义的num值为 1
son函数内定义的num值为 3
调用完son函数之后num的值为 1
在girl函数体内打印num的值为 1
>>> print('调用完mother函数之后num的值为',num)
调用完mother函数之后num的值为 100
3. 闭包
        闭包是一种满足特定要求的内嵌函数。这里我们还是将内嵌函数称为子函数,其外部的函数称为母函数,则当子函数体内有对母函数体内定义的变量的引用时我们称这个子函数为一个闭包。但当母函数和其闭包都定义了参数时,由于在母函数体外是无法直接对闭包进行函数调用的,为了能够实现对闭包的调用,需要在母函数内增加一条返回闭包函数名本身的语句,这个时候调用母函数后返回的是一个闭包的函数对象,就可以通过这种方法间接调用闭包函数了,举例说明:
>>> def funx(x):
         def funy(y):    #这里面funy就是一个闭包
                return x*y   
        return funy        #直接返回闭包函数名

>>> i = funx(5)        #返回过来的是一个函数对象赋值给了i
>>> i
<function funx.<locals>.funy at 0x0247CD68>
>>> type(i)
<class 'function'>
>>> i(8)                      #i可以直接进行函数调用了
40
        当然也可以直接使用funx(5)(8)这种形式进行调用,和上述方式实现的结果一样。

4. 在内嵌函数内修改外部函数内定义的变量的值
        前面已经讲过,无法直接在闭包内部对外部函数的变量进行修改,但是如果真的非要修改的话,在Python3里面是可以的,需要增加一条声明此变量是外部函数内变量的语句nonlocal,举例说明:
>>> def mother():
        num = 0
        print('在mother函数体内定义的变量num的值为',num)
        def son():
                nonlocal num
                num = 100
                print('在son函数内部定义的num变量值为',num)
        son()
        print('在调用完son函数以后,mother函数体内定义的变量num的值为',num)
>>> mother()
在mother函数体内定义的变量num的值为 0
在son函数内部定义的num变量值为 100
在调用完son函数以后,mother函数体内定义的变量num的值为 100

评分

参与人数 2鱼币 +2 贡献 +1 收起 理由
poiulp + 1 感谢楼主无私奉献!
tawuming + 1 + 1

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-9-22 21:14:22 | 显示全部楼层
老规矩,小牛还是先顶一下,在这里为了保证内容的紧凑性,去掉了视频内通过列表形式实现在闭包内改变外部函数变量值的方法,鱼油们见谅哈!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-22 22:04:18 | 显示全部楼层
顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-22 22:05:01 | 显示全部楼层
闭包的定义了解,但是实际操作还是不好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-23 12:58:11 | 显示全部楼层
杀阡陌 发表于 2015-9-22 22:05
闭包的定义了解,但是实际操作还是不好

实际操作不好,不好在那一点,发现问题本身具体出在哪一块而不是笼统的说问题也是一种能力。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-23 21:10:47 | 显示全部楼层
醉酒青牛 发表于 2015-9-23 12:58
实际操作不好,不好在那一点,发现问题本身具体出在哪一块而不是笼统的说问题也是一种能力。

知道它们什么意思,怎么用,但是具体在写代码时不知道在什么时候用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-23 21:29:28 | 显示全部楼层
杀阡陌 发表于 2015-9-23 21:10
知道它们什么意思,怎么用,但是具体在写代码时不知道在什么时候用

那估计要多读程序了,先读懂,再自己赋值出来,最后改进成自己的代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-29 10:43:17 | 显示全部楼层
nonlocal 和 global 比较实用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-17 23:50:08 | 显示全部楼层
这个不咋好理解,多看几遍,楼主辛苦了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-19 09:29:23 | 显示全部楼层
好棒!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-22 09:37:24 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-22 09:38:08 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-28 09:03:36 | 显示全部楼层
1.png 2.png
我想问下 return funy()  和 return funy 有什么区别 为什么有括号会报错 没括号却没有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-1 23:33:02 | 显示全部楼层
751811164 发表于 2015-10-28 09:03
我想问下 return funy()  和 return funy 有什么区别 为什么有括号会报错 没括号却没有

也没搞懂,有点晕
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-25 18:58:40 | 显示全部楼层
这一章有点难理解 只有多看看了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-22 20:26:25 | 显示全部楼层
其实我之前看了。一直理解不了闭包的意思,今天听鱼老师讲了,感觉懂了那么一点。
def funx(x):
      def funy(y):
            return x*y
       return funy
为了能够实现对闭包的调用,需要在母函数内 增加一条返回闭包函数名本身的语句
i=funx(5)
i(8)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-22 20:34:39 | 显示全部楼层
eg:
def set_passline(passline):
      def camp(val):
           if val>passline:
              print('passed')
           else:
              print('failed')
      return camp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-22 20:36:16 | 显示全部楼层
f_100=set_passline(60)
f_150=set_passline(90)
f_100(89) 调用闭包函数,传入val=89与 60对比
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-7 10:03:20 | 显示全部楼层
klaus12321 发表于 2015-11-1 23:33
也没搞懂,有点晕

首先,这个写法有问题,x*=x前面应该加上一条nonlocal x,否则内嵌函数里x没有定义,会报错
其次,return里,如果return Fun2,想要正常输出,执行代码是Fun1()();如果return Fun2(),想要正常输出,执行代码是Fun1()
可以试一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-7-16 14:43:36 | 显示全部楼层
顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 09:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表