鱼C论坛

 找回密码
 立即注册
查看: 3653|回复: 11

python 闭包的问题

[复制链接]
头像被屏蔽
发表于 2014-12-9 17:10:12 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-12-9 17:10:13 | 显示全部楼层
本帖最后由 wei_Y 于 2014-12-9 22:02 编辑

函数是用来执行一些功能,但是单个函数可以执行的功能有限,当然可以把内嵌的函数写在外面,不过那样会麻烦很多,因为变量等的都不会共享到了(局部变量),所以内嵌另外一个函数执行一部分操作。这样为了使功能全面,操作简便一些,而且作为模块时可以直接实行相应功能。
比方说递归操作
  1. def dg(strs):
  2.         if len(strs) == 0:
  3.                 return 0
  4.         else:
  5.                 dg(strs[1:])
复制代码
假如有一个list1 = ['123','456'],要将所有元素都调用一遍dg函数,但是这个列表不在此文件里。
每次要用都需要写一遍for i in list1: dg(i),虽然栗子只有两步,但是还有别的多的情况。
所以将这些写在一个函数里,递归是函数内部进行。
  1. def dg(strs):
  2.         def sub(strs):
  3.                 if len(strs) == 0:
  4.                         return 0
  5.                 else:
  6.                         sub(strs[1:])
  7.         if type(strs) == str:
  8.                 sub(strs)
  9.         elif type(strs) == list:
  10.                 for i in strs:
  11.                         sub(strs)
复制代码
这样只需要调用dg函数,就可以完成操作。

P.S栗子很渣,完全木有意义,别介意。
当然这也只是一个方面。希望能帮到你。

我理解的就是能使用局部变量来完成一些更牛掰的操作。

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
~风介~ + 3 + 3 + 3 有耐心!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-1-15 18:01:09 | 显示全部楼层
我觉得可能是为了避免过多的函数名。如果你有100这样的函数
  1. def func1():
  2. def func2():
  3. def func3():
  4. .....
复制代码

考虑到不重名和保持函数名的说明性,可能取名会非常难。但是如果这样
  1. del func1():
  2.     del func2():

  3. del func2():
  4.     del func3():
复制代码

这样只需要在func1中保证嵌套的函数不重名就可以。而在func2中又可以使用func1中使用过的名称。
类似于c++的名称空间?
菜鸡勿喷。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-1-18 16:46:36 | 显示全部楼层
lbz235 发表于 2015-1-15 18:01
我觉得可能是为了避免过多的函数名。如果你有100这样的函数
考虑到不重名和保持函数名的说明性,可能取名 ...

温馨提醒一下,是def不是del哦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-1-21 22:38:21 | 显示全部楼层
闭包 在装饰器很常用.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-1-24 21:57:47 | 显示全部楼层
目前能力有限
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-1-24 22:48:14 From FishC Mobile | 显示全部楼层
闭包就是内部函数访问外部函数的属性。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-1-25 09:46:38 From FishC Mobile | 显示全部楼层
本帖最后由 挥舞乾坤 于 2015-1-25 09:59 编辑

我觉得更多是出于安全性的考虑,一些私有属性不想被随意访问修改,因此专门写了一个函数作为访问接口
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-1-25 09:47:21 From FishC Mobile | 显示全部楼层
所以要用闭包,手机打字好费劲
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-2-3 15:33:25 | 显示全部楼层
安全性考虑吧,比如说如果提供API接口函数的话,内部的函数其他人就看不到
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-2-6 08:10:17 | 显示全部楼层
理论上不用内嵌的方式定义函数实现任何功能肯定是没有问题的,但是闭包是函数里面内嵌了一个新的函数,而这个新的函数和最外层的函数的对应关系好像全局和局部的关系,有时候会为实现方便很多,而且代码也容易阅读。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-7-14 15:38:16 | 显示全部楼层
应该是更方便吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-13 21:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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