引用和函数引用,函数嵌套、闭包,装饰器以及递归

1.引用:其实就是地址引用

可以使用id()函数来查看变量的地址

a = 10

print(id(a))结果为1534531351

getrefcount()函数查看引用次数

print(getrefcount(a))#结果为2次,第一次是创建赋值,第二次是调用getrefcount()函数

 

2.函数引用

1)不可变类型引用
def
test_1(n1): for i in range(n1): print(i) n1 += 1 test(5)结果为1 2 3 4 5#外面的n不会因为函数里面的改变而改变

2)可变类型
def test_1(l): for i in range(l): print(i) l.append(0,8) list = [1,2,3] test(list)结果为8 1 2 3

3.函数嵌套

1)函数嵌套就是一个函数里面嵌套另外一个函数
def outer():
  a = 10
  def inner():
    b = 20
    print('我是内部函数',b)
  inner()
outer()#结果为我是内部函数 20

2)在内部函数里面引用外部函数参数

def outer():
  a = 10
  def inner():
    b = 20
    b += a
    print('我是内部函数',b)
  inner()
outer()#结果为我是内部函数 30

3)在内部函数修改外部函数的值

def outer():
  a = 10
  def inner():
    nonlocals a #通过声明nonlocals关键字来修饰
    b = 20
    a += b
    print('我是内部函数',a)
  inner()
outer()#结果为我是内部函数 30

 4.闭包

要求:

1)函数嵌套

2)内部函数引用外部函数变量

3)返回内部函数

def outer(n):
  a = 10
  def inner():#函数嵌套
    a += n#内部函数引用外部函数变量
    print('我是内部函数',a)
  return inner#返回内部函数
r = outer(5)
r()#相当于传递了参数给函数内部之后的inner

5.装饰器,循环开放封闭原则,也就是在不改变原来函数代码情况下,扩大函数功能

1)不带参数的装饰器

def decorator(func):#传入需要扩展功能的函数形参
  def wrapper():
    func()
    print('粉刷')
    print('铺地板')
    print('精修')
  return wrapper()
@decorator#装饰要装饰的函数
def house():#house就是wrapper
  print('草胚房...')

2)带参数的装饰器

def decorator(func):#传入需要扩展功能的函数形参
  def wrapper(addres):#传入普通参数
    func(address)#这里也需要传入,这里就是实际的house
    print('粉刷')
    print('铺地板')
    print('精修')
  return wrapper()
@decorator#装饰要装饰的函数
def house(address):#house就是wrapper
  print('{}的草胚房...'.format(address))
house('北京三环')#结果为北京三环的草胚房

3)多个参数的装饰器

def decorator(func):#传入需要扩展功能的函数形参
  def wrapper(*args,**kwargs):#传入普通参数
    func(*args,**kwargs)#这里也需要传入,这里就是实际的house
    print('粉刷')
    print('铺地板')
    print('精修')
  return wrapper()
@decorator#装饰要装饰的函数
def house(address,name,area =40 ):#house就是wrapper
  print('{}的{}酒店,面积是{}平方米'.format(address,name,area )
house('湖北''希岸'area = 20)#关键字参数
#结果为湖北的希岸酒店,面积是20平方米

4)返回值的装饰器

当被装饰函数中有返回值的时候,wrapper中也应该有返回值

def decorator(func):
  def wrapper(*args,**kwargs):
    r = func(*args,**kwargs)
    print('房子预估价格为{}'.format(r))
    print('粉刷')
    print('贴地板')
    print('精修')
    return 60000
  return wrapper
@decorator
def house():
  return 50000
结果为房子预估价格为50000
粉刷
贴地板
精修
60000

6.递归函数

1)要有个出口

2)每次递归需要向出口更进一步

3)打印1-10

def test_1(i):
  if i == 10:
    print(i)
  else:
    print(i)
    i += 1
    test(i)
test(10)结果为1 2 3 4 5 6 7 8 9 10 

4)打印1-5累加

def test_1(n):
  if n == 10:
    return 10
  else:
    return n +test(n+1)
test(5)结果为15

5)打印1-5阶乘

def test_1(n):
  if n == 10:
    return 10
  else:
    return n *test(n+1)
test(5)结果为120

 

posted @ 2021-07-23 22:00  求知律己  阅读(127)  评论(0编辑  收藏  举报