函数对象、函数嵌套、与闭包函数

函数对象

可以将函数当成变量去用

1、可以赋值

def func():
  x = 10
  print(x)
  
  
f = func  # 将func 的内存地址赋值给f
f()  # 此时f()相当于func()

2、函数可以当作参数传给另外一个函数

def foo():
  print(‘from foo‘)

def func(f):
  f()  #  运行传入的参数
  
  
func(foo)  # 输出结果为 from foo

3、函数可以当作函数的返回值

def foo():
  print(‘from foo‘)
 
def func():
  return f

res = func(foo)
print(res)  # foo的内存地址
res()  # 加括号即可运行

4、函数可以当作容器类型的元素

def foo():
  print(‘from foo‘)
  
l = [foo]
print(l)
l[0]()  # 即可运行
‘‘‘利用函数可以作为容器就可以方便起来====简易的购物车模版‘‘‘
def login():
  print(‘登陆功能‘)
def register():
  print(‘注册功能‘)
def check_blance()
	print(‘查看余额‘)
  
dic = {
  ‘1‘:‘登陆‘,login
  ‘2‘:‘注册‘,register
  ‘3‘:‘余额‘,check_blance
}
while ture:
  print(‘0‘    ‘退出‘)
  for i in dic:
    print(‘%s    %S‘ %(i,dic[i][0]))
  choice = input(‘请输入功能编号>>>‘).strip()
  if choice == 0:
    break
  elif choice in dic:
    dic[chioce][1]
  else:
    print(‘输入指令错误,请重新输入‘)

函数嵌套

1、函数嵌套调用

在调用函数的过程中又调用其他函数

def max1(x,y):  #  比较两个数大小
  if x > y:
    return x
  else:
    return y
	
def max2(a,b,c,d)  # 比较四个数的大小
	res1 = max1(a,b)  #  比较a,b得到res1
  res2 = max1(res1,c)
  res3 = max1(res2,d)
  return

max2(1,2,3,4)

可以将一些需要调用的小功能函数重新利用

2、函数的嵌套定义

在函数内定义其他函数

# 圆形
# 求圆形的求周长:2*pi*radius
def circle(radius,action=0):
    from math import pi

    def perimiter(radius):
        return 2*pi*radius

    # 求圆形的求面积:pi*(radius**2)
    def area(radius):
        return pi*(radius**2)

    if action == 0:
        return 2*pi*radius

    elif action == 1:
        return area(radius)

res=circle(33,action=0)
print(res)

一个集合中包含其他功能 传参选择调用

闭包函数

大前提:

闭包函数 = 名称空间与作用域+函数嵌套+函数对象

核心点:名字的查找关系是以函数定义阶段为准的

一、什么是闭包函数

‘闭’函数指的是该函数是内嵌函数

‘包’函数指的是该函数包含对外层函数作用域名字的引用(不是对全局作用域)

def f1():
  x = 321
  def f2():
    print(x)  # 此时f2内没有x,会向enclosing查找
  f2() 

二、为何要有闭包函数

掌握了另一种为函数体传参的方式

def outter(x):
  # x = 111
  def wrapper():
  	print(x)
  return wrapper

  wrapper = outter(111)
  wrapper() 

函数对象、函数嵌套、与闭包函数

上一篇:c#自定义ORM框架---(泛型&反射&实体类扩展属性<附带通用增、删、查、改>)


下一篇:AtCoder Beginner Contest 160 题解