一、函数对象

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. UVA 12293 - Box Game(博弈)

    UVA 12293 - Box Game 题目链接 题意:两个盒子,一開始一个盒子有n个球.一个仅仅有1个球,每次把球少的盒子中球消掉,把多的拿一些球给这个盒子.最后不能操作的输(球不能少于1个),A ...

  2. 【Zookeeper】源码分析之网络通信(二)之NIOServerCnxn

    一.前言 前面介绍了ServerCnxn,下面开始学习NIOServerCnxn. 二.NIOServerCnxn源码分析 2.1 类的继承关系 public class NIOServerCnxn ...

  3. pycharm怎么设置代码自动补齐

    代码补全功能在PyCharm上是一流的.默认情况下PyCharm会在你输入的时候给出建议: 由于此功能可有点耗电,你可以通过选择File→Power Save Mode来禁用它.您仍然可以通过Cont ...

  4. iOS 7设计备忘单

    With the release of iOS 7, app designers and developers will need to adjust their visual language to ...

  5. docker部署maven私有仓库 nexus3

    docker pull sonatype/nexus3: docker run -d --name nexus3.x --network host -v /volume-data/nexus3/nex ...

  6. Chrome F12 温故而知新 :因为重定向导致清空Network信息

    虽然我以前都是用Fiddler 4来作为解决方案.但实际上可以勾选 [Preserve log]来保存日志 这样就不担心因为页面重定向导致清空了日志了

  7. SNF快速开发平台MVC-EasyUI3.9之-DataGrid表格控件如何增加右键菜单

    如题,我们在项目开发当中会遇到需要,表格控件增加右键菜单的使用. 下面我们就以SNF框架增加右键菜单步骤如下: 1.在加载页面当中增加如下菜单定义 <div id="mm" ...

  8. 如何修改mac的root密码

    mac如果密码忘了,可以同过几个命令重置root密码.前提是你有执行sudo权限的用户: jackdeMacBook-Air:~ jack$ sudo bash jackdeMacBook-Air:~ ...

  9. 2. RNN神经网络模型的不同结构

    1. RNN神经网络模型原理 2. RNN神经网络模型的不同结构 3. RNN神经网络-LSTM模型结构 1. 前言 RNN( Recurrent Neural Network 循环(递归)神经网络) ...

  10. windowsclient开发--为你的client进行国际化

    之前博客讲过函数: GetUserDefaultUILanguage Returns the language identifier for the user UI language for the ...