一、函数对象

1、函数对象:函数名存放的就是函数的地址,所以函数名也是对象,称之为函数对象

a = 10
print(a,id(a)) def fn():
num = 10
print('fn fuction run')
print(fn()) b = a
print(b,id(b))

2、函数对象的四个应用

①可以直接被引用fn=cp_fn

def fn():
num = 10
print('fn function run')
print(fn) def fn():
num = 10
print('fn function run') func = fn
print(fn)
print(func)

②可以当做函数参数传递computed(cp_fn,a,b)

# 通过该函数可以对任意两个数的四则运算某一运算
def add(a,b):
return a+b
def low(a,b):
return a-b
def jump(a,b):
return a*b
def full(a,b):
return a/b
def computed(fn,a,b): # fn代表四则运算的一种,res为运算结果
res = fn(a,b)
return res while True:
cmd = input('cmd:>>>')
if cmd =='add':
result=computed(add,100,200)
elif cmd =='low':
result=computed(low,100,200)
elif cmd =='jump':
result=computed(jump,100,200)
elif cmd =='full':
result=computed(full,100,200)
else:
print('输入有误')
print(result)

③可以作为容器类型的元素

def add(a,b):
return a+b
def low(a,b):
return a-b
def jump(a,b):
return a*b
def full(a,b):
return a/b
def quyu(a,b):
return a %b
def computed(fn,a,b):
res = fn(a,b)
return res
method_map={
'add':add,
'low':low,
'jump':jump,
'full':full,
'quyu':quyu,
} while True:
cmd = input('cmd:') # 用户输入的指令只要有对应关系,就会自动取走计算方法
if cmd in method_map: # 这样外界就不关心有哪些计算方法
cp_f = method_map[cmd]
result = computed(cp_fn,100,200)
print(result)
else:
print('输入错误')
break

④可以作为函数的返回值

def add(a,b):
return a +b
def low(a,b):
return a-b
def jump(a,b):
return a*b
def full(a,b):
return a/b
def quyu(a,b):
return a%b def computed(fn,a,b):
res = fn(a,b)
return res method_map = {
'add':add,
'low':low,
'jump':jump,
'full':full,
'quyu':quyu,
}
# 根据指令获取计算方法
def get_cp_fn(cmd):
if cmd in method_map:
return method_map[cmd] # 返回的是method_map中的’cmd’对应的值cmd
return jump # 输入有误就采用jump while True:
cmd = input('cmd:')
if cmd =='quit':
break
cp_fn = get_cp_fn(cmd)
result = computed(cp_fn,100,200)
print(result)

二、名称空间

print(len('abc'))     # 结果为 3
len = len('abcsdf')
print(len) # 结果为 6
del len
print(len('abc')) # 结果为 3 def fn1():
len = 100
print(len) def fn2():
len = 200
print(len)
fn1()
fn2()

1、定义:存放名字与内存空间地址对应关系的容器

2、作用:解决由于名字有限,导致名字重复发送冲突的问题

3、三种名称空间:

①build-in:内置名称空间,系统级,一个,随解释器执行而产生,解释器停止而销毁
②global:全局名称空间,文件级,多个,随所属文件加载而产生,文件运行完毕而终止
③local:局部名称空间,函数级,多个,随所属函数执行而产生,函数执行完毕而销毁
加载顺序:build-in>global>local

4、global关键词

  可以将local的名字提升为global的名字。一个文件中的global名字就是一个,所以函数内外部使用的名字都是一个

  注意:一定要调用函数,才能产生函数,并提升

# part1
len =1000
def fn():
len = 200
print(len)
fn() # 结果为200
print(len) # 结果为1000 # part2
l = []
def fn():
l=[]
l.append(200)
print(l)
fn() # 结果为 [200]
print(l) # 结果为[] # 定义一个函数,函数中有一个变量
def fn1():
num = 200
return num
fn1()
# 在定义一个函数,该函数使用上一个函数的变量
def fn2():
print(num)
num = fn1()
fn2() # part3
num = 100
def fn1():
global num #100 # 将logal:num>global:num # 将局部上升到全局
num=200
num=300
# num=300
def fn2(): # logal中的名字一旦global,就变成global的名字,一个文件中的global就是一个
global num #
num = 400
print(num)
# num=400
fn1()
print(num) # 结果为300
fn2()
print(num) # 结果为300 400 400

三、作用域

1、定义:名字起作用的范围

2、作用:解决名字可以共存问题

3、四种作用域

①build-in:内置作用域,所有文件所有函数
②global:全局作用域,当前文件所有函数
③local:局部作用域,当前函数
④enclosing:嵌套作用域,当前函数与当前函数的内部函数
len = 100
def outer():
len = 200
def inner():
len =300
print('',len) # 结果为300
inner()
print('',len) # 结果为200
outer()
print('',len) # 结果为100 del len
print('',len) # 4 <built-in function len>

4、不同作用域之间名字不冲突,以达到名字的重用

查找顺序:local>enclosing>glocal>build-in

四、函数的嵌套定义和闭包

1、函数的嵌套定义:将函数直接定义到另一个函数的内部,可以使用外部函数中的名字

def fn1():
num = 200
def fn2(): # fn2就可以直接使用fn1中的名字
print(num)
fn2()
fn1()

2、闭包:

①closure:被包裹的函数称之为闭包。定义在函数内部的函数

②完整的闭包结构:

将函数进行闭包处理

提升函数名的作用域,将内部函数对象作为外部函数的返回值

def a():
def b():
print("cc")
return b
a() #a()=b
y = a()() # a()() =b()
y # 结果为 cc def a():
def b():
def c():
def d():
print('dddd')
return d
print("ccc")
return c
return b
a() # b
a()() #b()
a()()() #b()() = c()
a()()()
y=a()()()()
y # 结果为 dddd

day11 十一、函数对象,名称空间,作用域,和闭包的更多相关文章

  1. python12--字符串的比较 函数的默认值的细节 三元表达式 函数对象 名称空间 作用域 列表与字典的推导式 四则运算 函数的嵌套

     复习   1.字符串的比较; 2.函数的参数; ******实参与形参的分类: 3.函数的嵌套调用:     # 字符串的比较#  -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 ...

  2. day_12函数默认值,数据类型的补充,函数对象名称空间与作用域,函数的嵌套定义

    复习, 昨天讲了字符串的比较,按照从左往右比较每一个字符,通过字符对应的ASCII码进行比较 函数的参数,‘ 实参与形参 形参:在函数定义时()中出现的参数 实参,在函数调用时()中出现的参数 实参的 ...

  3. Python记录9:函数4:名称空间作用域+闭包函数+装饰器

    ''' 一: 名称空间namespaces     名称空间就是存放名字与值绑定关系的内存空间 二: 名称空间分为三种     内置名称空间:         1. 特点: 存放是python解释器自 ...

  4. Day11名称空间,作用域,闭包函数

    Day11 1.函数对象: ①可以被引用 ​ ②可以作为另一个函数的参数 ​ ③可以作为另一个函数的返回值0 ​ ④可以被存储到容器类型中 2.函数嵌套: ①嵌套调用:在一个函数中调用了另一个函数 ​ ...

  5. Python 函数对象-函数嵌套-名称空间与作用域-闭包函数

    今日内容: 1. 函数对象 函数是第一类对象: 指的是函数名指向的值可以被当中数据去使用 1.可以被引用 2.可以当做参数传给另一个函数 3.可以当做一个函数的返回值 4.可以当做容器类型的元素 2. ...

  6. 搞懂Python的类和对象名称空间

    代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间: 文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层 ...

  7. day 22 面向对象 类与对象 名称空间操作

    一.面向对象 1.面向过程编程 核心是"过程"二字,过程指的是解决问题的步骤,即先干什么再干什么 基于该思想编写程序就好比在编写一条流水线,是一种机械式的思维方式. 优点:复杂的问 ...

  8. python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试

    一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...

  9. 函数的名称空间,函数的嵌套(global, nonlocal),函数名的运用

    一 函数的名称空间 内置空间:存放python解释器内置函数的空间 全局空间:py文件运行时开辟的,存放的是执行的py文件(出去函数内部)的所有的变量与值的对用关系,整个py文件结束后才会消失. 局部 ...

  10. Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

    本篇目录: 一.函数嵌套 二.函数名称空间与作用域 三.函数对象 四.闭包函数 ============================================================ ...

随机推荐

  1. MySql之视图的使用

    一:视图是什么 视图相当于一个窗口,一个基于具体数据库表.定义了相关查询规则 的窗口. 建立视图,可以重用一些复杂的查询语句.    建立视图,相当于定义了一系列查询操作:从视图查询数据,相当于在调用 ...

  2. [BetterExplained]为什么你应该(从现在开始就)写博客

    (一)为什么你应该(从现在开始就)写博客 用一句话来说就是,写一个博客有很多好处,却没有任何明显的坏处.(阿灵顿的情况属于例外,而非常态,就像不能拿抽烟活到一百岁的英国老太太的个例来反驳抽烟对健康的极 ...

  3. Android平台上最好的几款免费的代码编辑器

    使用正确的开发工具能够快速有效地完成源代码的编写和测试,使编程事半功倍.在网络信息高速发展的今天,移动设备的方便快捷已经深入人心,越来越多的程序员会选择在任何感觉舒适的地方使用移动设备查看或者编辑源代 ...

  4. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  5. Orace 12.2 ORA-12012: error on auto execute of job "SYS"."ORA$AT_OS_OPT_SY_21"

    一个测试环境的12.2.0.1数据库后台alert不断报出以下错误信息: Errors in file /d12/app/oracle/diag/rdbms/test/test/trace/test_ ...

  6. 【emWin】例程十五:触摸校准实例——五点校准法

    介绍: 该例程介绍如何校准4.3寸.7寸液晶显示屏.校准方法如下: 1.进入以下界面,用户可选择是否进入校准界面进行液晶校准 *点击屏幕任何地方可进入校准界面 *不采取任何操作,几秒钟后会进入触摸测试 ...

  7. centos 安装oracle 11g r2(一)-----软件安装

    centos 安装oracle 11g r2(一)-----软件安装 1.进入管理员权限 [anzerong@localhost ~]# su - root password [root@localh ...

  8. Go Revel - Cache(缓存)

    revel在服务器端提供了`cache`库用以低延迟的存储临时数据.它缓存那些需要经常访问数据库但是变化不频繁的数据,也可以实现用户会话的存储. ##有效期 一下三种方法为缓存元素设置过期时间: 1. ...

  9. r 随机数

    R软件一个显著的优点是它提供了丰富的随机数发生器,比SAS.Matlab方面很多,比Excel更不知方便到哪里去了.这无疑为统计学.工程学以及寿险精算学提供了很大的方便,比如我们要产生200个服从正态 ...

  10. Oracle中dual表的用途介绍-转

    读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情. dual是一个虚拟表,用来构成select的语法规则,oracle保 ...