函数作用域说明

#函数嵌套的定义

#内部函数可以使用外部函数的变量

global 方法可以在局部变量中声明一个全局变量,影响的是全局变量,对局部变量无效

eg

a = 1

def outer():

  a = 1

  def inner():

    b = 2

    print(a)

    print('inner')

    def inner2():

      global a  #声明了一个全局变量

      a += 1

      print('inner2')

    inner2()

  inner()
      print('**a**',a)

outer()
print('全局a:',a)
View Code

Python3中新加入的一个方法nonlocal方法,对全局无效,对局部也只是对最近的一层有影响:

nonlocal 声明了一个上层局部变量,只能找离它最近的一个局部变量(inner或outer中去找),如果该变量不存在则报错

声明了nonlocal的内部函数的变量修改会影响到离当前函数最近一层的局部变量

eg

a = 1

def outer():

  a = 1

  def inner():

    b = 2

    print(a)

    print('inner')

    def inner2():

      nonlocal a  #声明了一个局部变量

      a += 1

      print('inner2')
                 print('##a##',a)

    inner2()

  inner()
      print('**a**',a)

outer()
print('全局a:',a)
View Code

函数名的本质

1、函数名可以被赋值

def func()

  print('abc')

func2 = func

func2()
View Code

2、函数名可以作为容器类型的元素

def func()

  print('abc')

func2 = func

l = [func,func2]

for i in l:

  i()
View Code

3、函数名可以作为函数的参数

def func()

  print('abc')

def fun(f)

  f()

fun(func)
View Code

4、函数名可以作为函数的返回值

def func()

  print('abc')

def fun(f)

  f()

  return f

qqxing = fun(func)

qqxing()
View Code

闭包:嵌套函数,内部函数调用外部函数的变量

def outer():

  a = 1

  def inner():

    print(a)
      return inner    #函数名以返回值的形式被函数返回
    print(inner.__closure__)    #查看一个函数inner是不是一个闭包
inn = outer()
inn()    #闭包的作用:可以在函数外面调用里面的子函数
View Code

闭包的应用:每次调用内部函数的时候不用重复的生成外部的局部变量

from urllib.request import urlopen

def get_url():

  url = 'http://www.xiaohuar.com/2014.html'

  def get():

    ret = urlopen(url).read()
    print(ret)

  return get

get_func = get_url()

get_func()

get_func()
View Code

  

猜你喜欢

转载自www.cnblogs.com/hubangsheng/p/9636239.html