python装饰器之函数作用域
1.函数作用域LEGB
L:local函数内部作用域
E:enclosing函数内部与内嵌函数之间
G:global全局作用域
B:build-in内置作用域
passline = 60
def func(val):
passline = 90
if val >= passline:
print('pass')
else:
print('failed')
def in_func()
print(val)
in_func() def Max(val1,val2):
return max(val1,val2)
func(89)
print(Max(90,100))
2.闭包理解与使用
闭包概念:Closure:内部函数中对enclosing作用域的变量进行引用
函数实质与属性
1:函数是一个对象
2:函数执行完成后内部变量回收
3:函数属性
4:函数返回值
闭包作用
1:封装
2:代码复用
passline = 60#
def func(val):
print('%x'%id(val))
passline = 90
if val >= passline:
print('pass')
else:
print('failed')
def in_func():#(val,)
print(val)
in_func()
return in_func f = func(89)
f()
print(f.__closure__)
29198a8
failed
89
89
(<cell at 0x7fe62bbf42f0: int object at 0x29198a8>,)
[Finished in 0.0s]
def func_150(val):
passline = 90
if val >= passline:
print('%d pass'%val)
else:
print('failed') def func_100(val):
passline = 60
if val >= passline:
print('%d pass'%val)
else:
print('failed') def set_passline(passline):
def cmp(val):
if val >= passline:
print('pass')
else:
print('failed')
return cmp
f_100 = set_passline(60)
f_150 = set_passline(90)
print(type(f_100))
print(f_100.__closure__) f_100(89)
f_100(59)
f_150(89)
f_150(59)
pass
failed
failed
failed
[Finished in 0.0s]
def my_averge(*arg):
print('in my_averge')
return sum(arg)/len(arg) def my_sum(*arg):
print('in my_sum')
return sum(arg) def dec(func):
def in_dec(*arg):
print('in dec arg = ', arg)
if len(arg) == 0:
return 0
for val in arg:
if not isinstance(val, int):
return 0
return func(*arg)
return in_dec #dec return in_dec -> my_sum
#my_sum = in_dec(*arg)
my_sum = dec(my_sum)
print(my_sum(1, 2, 3, 4, 5))
print(my_sum(1, 2, 3, 4, 5, ''))
print(my_averge(1, 2, 3, 4, 5))
my_averge = dec(my_averge)
print(my_averge(1, 2, 3, 4, 5, ''))
('in dec arg = ', (1, 2, 3, 4, 5))
in my_sum
15
('in dec arg = ', (1, 2, 3, 4, 5, ''))
0
in my_averge
3
('in dec arg = ', (1, 2, 3, 4, 5, ''))
0
[Finished in 0.0s]
3.装饰器
1:装饰器用来装饰函数
2:返回一个函数对象
3:被装饰函数标识符指向返回的函数对象
4:语法糖 @deco
def dec(func):
print('call dec')
def in_dec(*arg):#my_sum
print('in dec arg = ', arg)
if len(arg) == 0:
return 0
for val in arg:
if not isinstance(val, int):
return 0
return func(*arg)
return in_dec @dec
def my_sum(*arg):#my_sum = in_dec
print('in my_sum')
return sum(arg) print(my_sum(1, 2, 3, 4, 5)) #my_sum = dec(my_sum) #deco(bar) -> in_deco
#bar = in_deco
#bar() in_deco() bar()
def deco(func):
def in_deco(x,y):
print('in deco')
func(x,y)
print('call deco')
return in_deco
@deco
def bar(x,y):
print('in bar',x+y)
print(type(bar))
bar(1,2)
call dec
('in dec arg = ', (1, 2, 3, 4, 5))
in my_sum
15
call deco
<type 'function'>
in deco
('in bar', 3)
[Finished in 0.0s]
python装饰器之函数作用域的更多相关文章
- Python装饰器之functools.wraps的作用
# -*- coding: utf-8 -*- # author:baoshan def wrapper(func): def inner_function(): pass return inner_ ...
- python基础11_函数作用域_global_递归
看到了一个16进制转换的小知识点,就验证了一下运行结果. #!/usr/bin/env python # coding:utf-8 # 看到了16进制转换的问题.顺便验证一下. a = 255 b = ...
- python 装饰器函数基础知识
1.装饰器的本质--一个闭包函数 2.装饰器的功能--在不改变原函数及其调用方式情况下对原函数功能进行拓展 3.带参数和返回值的装饰器 def timer(func): @wraps(func) #使 ...
- Python装饰器之 property()
1. 何为装饰器? 官方定义:装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数 ...
- Python 装饰器之 functools.wraps
在看 Bottle 代码中看见 functools.wraps 这种用法. def make_default_app_wrapper(name): """ Return ...
- python 装饰器之应用示例
import time import hashlib import pickle import threading #装饰函数缓存应用 cache ={} def is_obsolete(entry, ...
- python学习-26 函数作用域
举例说明: 1. name = 'john' def foo(): name = 'xiaomming' def bar(): print(name) return bar a=foo() print ...
- python装饰器之使用情景分析
http://blog.csdn.net/yueguanghaidao/article/details/10089181
- python基础篇_004_装饰器函数
python装饰器函数 1.装饰器函数引导 功能:计算函数执行时长 import time """ 方式一: 函数首位添加时间,差值就是函数执行时间 缺点:每个函数都要加 ...
随机推荐
- 解决一个通过 WebReference 调用 WCF 时自定义 DataContract 类参数提交的问题
先看一下VS2013自动创建默认的IService1.vb,注意自定义的数据契约 CompositeType ' 注意: 使用上下文菜单上的“重命名”命令可以同时更改代码和配置文件中的接口名“ISer ...
- EXAM-2018-7-27
EXAM-2018-7-27 未完成 [ ] F A 要用ll,然后注意正方形的情况,细心一点 E 有点动态规划的感觉,状态的转移,不难,要注意不要漏掉状态 K 正解是DFS 然后用贪心数据弱的话能过 ...
- iOS简单音乐实现、React-Native完整项目、仿闲鱼京东列表分页、语音识别、网络加载过度动画等源码
iOS精选源码 iOS快速入手语音识别.听写.评测.播报 网络加载数据的过渡动画(仿简书网页) iOS 封装跑马灯和轮播效果 crash防护组件,适用常见常用的数组,字典等crash保护 iOS:高仿 ...
- 吴裕雄--天生自然python学习笔记:pandas模块DataFrame 数据的修改及排序
import pandas as pd datas = [[65,92,78,83,70], [90,72,76,93,56], [81,85,91,89,77], [79,53,47,94,80]] ...
- STL:map中的lower_bound和upper_bound
今天在做leetcode的Longest Increasing Subsequence题目时,需要用到二分查找,于是翻看了<STL源码剖析>这本书,发现map里面有lower_bound和 ...
- derby数据库的了解及使用
derby数据库 一.简介 Derby 易于管理.当嵌入到客户机应用程序中时, Derby 系统不需要任何管理干预. Derby 是可嵌入的.应用程序可以将数据库管理系统( Database Mana ...
- js - 常用的继承
零.序言 参考资料:JavaScript常用八种继承方案: 注:1.此篇笔记是站在上述资料的肩膀上的一篇小结: 2.阅读之前建议温习一下 js 中的 prototype 和 constructor:( ...
- HihoCode-1675-稀疏矩阵乘积
上来先一顿暴力,结果70分就超时了. 然后意识到稀疏矩阵,有很多0,如果c[i][j] != 0,那么一定存在至少一个k满足a[i][k] != 0 && b[k][j] != 0; ...
- textarea 是否换行的问题解决
需求:判断当前textarea是否已经换行(这个换行有2种方式:1.不断输入文字直到超过指定宽度后自动换行:2.按了回车以后进行换行) 单纯的解决第二种换行很简单.网上提供了很多常规的解决方案. De ...
- 吴裕雄--天生自然python编程:turtle模块绘图(3)
turtle(海龟)是Python重要的标准库之一,它能够进行基本的图形绘制.turtle图形绘制的概念诞生于1969年,成功应用于LOGO编程语言. turtle库绘制图形有一个基本框架:一个小海龟 ...