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装饰器之函数作用域的更多相关文章

  1. Python装饰器之functools.wraps的作用

    # -*- coding: utf-8 -*- # author:baoshan def wrapper(func): def inner_function(): pass return inner_ ...

  2. python基础11_函数作用域_global_递归

    看到了一个16进制转换的小知识点,就验证了一下运行结果. #!/usr/bin/env python # coding:utf-8 # 看到了16进制转换的问题.顺便验证一下. a = 255 b = ...

  3. python 装饰器函数基础知识

    1.装饰器的本质--一个闭包函数 2.装饰器的功能--在不改变原函数及其调用方式情况下对原函数功能进行拓展 3.带参数和返回值的装饰器 def timer(func): @wraps(func) #使 ...

  4. Python装饰器之 property()

    1. 何为装饰器? 官方定义:装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数 ...

  5. Python 装饰器之 functools.wraps

    在看 Bottle 代码中看见 functools.wraps 这种用法. def make_default_app_wrapper(name): """ Return ...

  6. python 装饰器之应用示例

    import time import hashlib import pickle import threading #装饰函数缓存应用 cache ={} def is_obsolete(entry, ...

  7. python学习-26 函数作用域

    举例说明: 1. name = 'john' def foo(): name = 'xiaomming' def bar(): print(name) return bar a=foo() print ...

  8. python装饰器之使用情景分析

    http://blog.csdn.net/yueguanghaidao/article/details/10089181

  9. python基础篇_004_装饰器函数

    python装饰器函数 1.装饰器函数引导 功能:计算函数执行时长 import time """ 方式一: 函数首位添加时间,差值就是函数执行时间 缺点:每个函数都要加 ...

随机推荐

  1. B - Sequence II (HDU 5147)

    Long long ago, there is a sequence A with length n. All numbers in this sequence is no smaller than ...

  2. Laravel5.4 队列简单配置与使用

    概述 什么是队列? 百度百科是这样说的 “队列”是在传输过程中保存数据的容器. 举几个生活中例子: * iphone手机新款发布,三里屯iphone进的新货.大家要排队买,不能说一大堆人一起冲进去,那 ...

  3. GPIO-FPGA架构

    GPIO是一种软件运行期间能够动态配置和控制的通用引脚 有不同的GPIObank,每个GPIO口的bank都会有编号的区分, 每个GPIO口除了通用的输入输出功能以外,还有其他复用功能,例如GPIO5 ...

  4. Golang Middleware Part 1 · To Be A Better Man

    如何在Golang中实现中间件-Part 1 当使用net/http包实现服务的时候,一般使用的是如下的两中处理方式: http.HandleFunc http.Handle http.HandleF ...

  5. [LC] 211. Add and Search Word - Data structure design

    Design a data structure that supports the following two operations: void addWord(word) bool search(w ...

  6. MOOC(7)- case依赖、读取json配置文件进行多个接口请求-解决用例间依赖问题(17)

    最最重要,处理case依赖.字段依赖 # -*- coding: utf-8 -*- # @Time : 2020/2/13 21:14 # @File : data_depend_17.py # @ ...

  7. Hashtable和Hashmap的区别?

    1.实现的继承的父类不同 Hashtable继承Dictionary类    HashMap继承abstractMap类 两个类都实现了Map接口 2.线程安全性不同 Hashmap线程是不安全的 H ...

  8. 博客已搬迁到 blog.vivym.xyz

    博客已搬迁到 blog.vivym.xyz

  9. python列表推导式(扫盲)

    1) 简单了解: 所谓的列表推导式,就是指的轻量级循环创建列表. 格式: 列表推导式的常见形式: my_list = [ item for item in iterable] my_list: 列表名 ...

  10. [洛谷P3403] 跳楼机

    题目传送门 套路题,同余最短路. 先只考虑y.z进行连边,再在mod x的意义下进行计算. 这里的“距离”dis[i]指的是,在所有满足a mod x=i的a里,能到达的最小的a是多少. 显然只要能到 ...