流暢的python---函數闭包
一、函数的定义及其应用
所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用
函数的使用包含两个步骤
1.定义函数–封装独立的功能
2.调用函数–享受封装的成果
函数的作用:在开发时,使用函数可以提高编写的效率以及代码的重用‘’
函数:函数是带名字的代码块,用于完成具体的工作 需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调用该任务的函数
最簡單函數:例子
def fib(n):
if n<=1:
return n
else:
return fib(n-1)+fib(n-2) a=fib(10)
print (a) for i in range(1, 20):
print(fib(i), end=' ') 打印结果:
55
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
闭包函数:闭包的特点就是内部函数引用了外部函数中的变量。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat May 2 23:04:22 2020
@author: root
函数名.__closure__ 在函数是闭包函数时,返回一个cell元素;不是闭包时,返回None。
"""
def func():
name=100
def inner():
print (name)
print(inner.__closure__) # (<cell at 0x0000027C14EB85E8: str object at 0x0000027C14F54960>,)
return inner
f=func()
f()
结果:
100
(<cell at 0x7f568408d050: function object at 0x7f568405c560>, <cell at 0x7f567feb9310: int object at 0x55d3c129df60>)
def line_conf(a,b):
def line(x):
return a*x+b
return line lineA=line_conf(2,1) #y=2x+1
lineB=line_conf(3, 4) #y=3x+1 print (lineA(1))
print (lineB(1))
__closure__属性返回的是一个元组对象,包含了闭包引用的外部变量。
案例: 1、若主函数内的闭包不引用外部变量,就不存在闭包,主函数的_closure__属性永远为None:
· 若主函数内的闭包不引用外部变量,就不存在闭包,主函数的_closure__属性永远为None
def line_conf():
a=1
b=2
def line(x):
print (x+1) return line l=line_conf()
print (l.__closure__) #None
try:
for i in l.__closure__: #报错
print (i.cell_contents)
except Exception as e:
print ('NoneType')
若主函数没有return 子函数,就不存在闭包
def line_conf():
a=1
b=2
def line(x):
print (x+1) return a+b l=line_conf()
print (l.__closure__) #抛异常
闭包下保存运行环境
_list=[]
for i in range(5):
def fun(a):
return i+a
_list.append(fun)
print(_list)
for f in _list:
print(f(1)) 只保存最后一个:y=4+a
# [<function fun at 0x109690d08>, <function fun at 0x109690c80>, <function fun at 0x109690ea0>, <function fun at 0x109690d90>, <function fun at 0x10968e048>]
# 5
# 5
# 5
# 5
# 5
若想输出:1,2,3,4,5 :闭包在返回时,它的所有变量已经固定了,形成一个封闭的对象,
_list=[]
for i in range(5):
def func(i):
def f_closure(a):
return i+a
return f_closure
_list.append(func(i))
print (_list)
for f in _list:
print (f(1)) # [<function func.<locals>.f_closure at 0x109690e18>, <function func.<locals>.f_closure at 0x109690c80>, <function func.<locals>.f_closure at 0x109690d08>, <function func.<locals>.f_closure at 0x109690ea0>, <function func.<locals>.f_closure at 0x109690d90>]
# 1
# 2
# 3
# 4
# 5
闭包案例:
def who(name):
def do(what):
print (name,'say',what)
return do teddy=who('teddy')
angel=who('angel') teddy('yyy')
angel('ggg')
日志记录器:
import logging
def log_header(logger_name):
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s [%(name)s] %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
logger = logging.getLogger(logger_name) def _logging(something, level):
if level == 'debug':
logger.debug(something)
elif level == 'warning':
logger.warning(something)
elif level == 'error':
logger.error(something)
else:
raise Exception(' oh ,i dont know what you want to do!') return _logging p_1_logging = log_header('project_1')
p_2_logging = log_header('project_2') def project_1():
p_1_logging('yyy', 'debug')
p_1_logging('bbb', 'warning')
p_1_logging('ccc', 'error') def project_2():
p_2_logging('qqq', 'debug')
p_2_logging('eee', 'warning')
p_2_logging('yyy', 'error') project_1()
project_2()
输出:
2020-05-03 11:31:27 [project_1] DEBUG yyy
2020-05-03 11:31:27 [project_1] WARNING bbb
2020-05-03 11:31:27 [project_1] ERROR ccc
2020-05-03 11:31:27 [project_2] DEBUG qqq
2020-05-03 11:31:27 [project_2] WARNING eee
2020-05-03 11:31:27 [project_2] ERROR yyy
流暢的python---函數闭包的更多相关文章
- Python 函數 Function
函數最初被設計出來,是用來減輕重複 coding 一段相同的代碼,這之間只有代碼 (方法,Method) 的重用,但還沒有物件導向OO整個Object 的屬性與方法被封裝重用的概念. 函數的定義很簡單 ...
- 流暢的python學習-3
一.文件操作 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Thu Apr 23 20:59 ...
- OpenERP函數字段的應用
在ERP開發過程中經常會使用到某字段的值是由其他字段計算得來,並且有些還需要將計算的結果存入資料庫. 以上功能上OpenERP中是用field.function實現的 其中有種模式 a). 只計算,不 ...
- python 學習深淺拷貝、集合、、作用域、函數
python 學習深淺拷貝.集合..作用域.函數 2020開年新冠肺炎流行大部分人員.工廠.單位無法復工生產,人員隔離每天外出都要戴口罩,在家隔離期間悶壞了感覺把半年的口糧都幹掉了,嚴重考察大家的資本 ...
- js匿名函數
(function($){})(jquery) == (function($){})(jQuery) 实际上是匿名函数 用于存放开发插件的代码 作用(非常有用): 这种写法的最大好处是形成闭包.在(f ...
- 说说Python中的闭包 - Closure
转载自https://segmentfault.com/a/1190000007321972 Python中的闭包不是一个一说就能明白的概念,但是随着你往学习的深入,无论如何你都需要去了解这么一个东西 ...
- oracle decode(nvl(estimate_qty,0),0,1,estimate_qty) 函數
oracle decode(nvl(estimate_qty,0),0,1,estimate_qty) 函數
- Math.Round函數
Math.Round這個函數的解釋是將值按指定的小數位數舍入,但並不就是四捨五入.這種舍入有時稱為就近舍入或四舍六入五成雙 其實在 VB, VBScript, C#, J#, T-SQL 中 Roun ...
- C#判断奇偶数的函數
// 现代流行的"程序员" public static bool IsOdd(int n) { while (true) { switch (n) { : return true; ...
随机推荐
- 使用 Docker 部署 Node 应用
容器将应用与环境打包整合,解决了应用外部依赖的痛点,打包后通过窗口可方便地部署到任意环境,用过就知道很香. 创建示例应用 以 NestJS 为例,先创建一个示例应用. $ npm i -g @nest ...
- Visual Studio 2019本地不能运行Azure Functions
最近一个项目,需要维护同事写得代码,主要是一堆基于 .net core 3.1 的 Azure Functions.想起2年前第一次接触 Azure Functions(那次是基于.net frame ...
- JavaScript的核心语法
1.JavaScript同其他程序设计语言一样,有着独特的语法结构,主要包含:变量.数据类型.运算符号.控制语句和注释等. 2.变量是存储数据的基本单位,JavaScript通常利用变量来参与j各种运 ...
- [.NET Core知识点回顾]-自动内存管理
自动内存管理是公共语言运行时在托管执行过程中提供的服务之一.公共语言运行时的垃圾回收器为应用程序管理内存 的分配和释放.对开发人员而言,在开发托管应用程序时不必编写执行内存管理任务代码. 分配内存 初 ...
- 一个排序引发的BUG
你好呀,我是why. 前两天在 Git 上闲逛的时候又不知不觉逛到 Dubbo 那里去了. 看了一下最近一个月的数据,社区活跃度还是很高的: 然后看了一下最新的 issue,大家提问都很积极. 其中看 ...
- Vue(13)子组件与父组件超详细解析
父组件和子组件 我们经常分不清什么是父组件,什么是子组件.现在来简单总结下:我们将某段代码封装成一个组件,而这个组件又在另一个组件中引入,而引入该封装的组件的文件叫做父组件,被引入的组件叫做子组件.具 ...
- Linux云计算-01_介绍以及Linux操作系统安装
1 学习目的 兴趣爱好 技能提升 找到满意的工作 2 什么是云计算 云计算(cloud computing)是分布式计算的一种,指的是通过网络"云"将巨大的数据计算处理程序分解成无 ...
- Centos 8 上定时备份Gitlab ,脚本实现定时备份,备份恢复
定时备份 要求 为了能够备份和恢复,请确保你的系统上安装了Rsync yum install rsync -y 配置备份目标机器免密认证 执行ssh-keygen -t rsa 生成私钥和公钥 ssh ...
- .NET Core授权失败如何自定义响应信息?
前言 在.NET 5之前,当授权失败即403时无法很友好的自定义错误信息,以致于比如利用Vue获取到的是空响应,不能很好的处理实际业务,同时涉及到权限粒度控制到控制器.Action,也不能很好的获取对 ...
- 【面试】详解同步/异步/阻塞/非阻塞/IO含义与案例
本文详解同步.异步.阻塞.非阻塞,以及IO与这四者的关联,毕竟我当初刚认识这几个名词的时候也是一脸懵. 目录 1.同步阻塞.同步非阻塞.异步阻塞.异步非阻塞 1.同步 2.异步 3.阻塞 4.非阻塞 ...