Python 函数变量global nonlocal,作用域

全局变量和局部变量:
局部变量:
    定义在函数内部的变量称为局部变量(函数的形参也是局部变量)
    局部变量只能在函数内部使用
    局部变量在函数调用时才能够被创建,在函数调用之后会自动销毁
  全局变量:
    定义在函数外部,模块内部的变量成为全局变量
    全局变量,所有函数都可以直接访问(但函数内部不能直接修改全局变量的绑定关系)

示例:
a=100
b=200
def fn(c):
    d=400
    print(a,b,c,d)

fn(300)
print('a=',a)
print('b=',b)
print('c=',c)# 函数调用完被销毁掉,不会有c

 

局部变量说明:
1.在函数内首次对变量复制时创建局部变量,再次为变量赋值是修改局部变量的绑定关系
2.在函数内部的赋值语句不会对全局变量造成影响


python作用域
    作用域也叫命名空间,是访问变量时查找变量名的范围空间


python的四个作用域LEGB

作用域                                                     英文解释                                    英文简写
局部作用域 (函数内)                                Local(function)                              L
外部嵌套函数作用域                               Enclosing function locals               E
函数定于所在模块的作用域                    Global(module)                              G
python内置模块的作用域                        Builtin(python)                                B

示例:
v=100
def fun1():

    v=200
    print("fun1里的v的值为:",v)   # 200
    # 定义另一个函数fun2然后调用
    def fun2():
        print("fun2v=",v)   # 200
    fun2()

fun1()
print("全局变量v=",v)

变量名的查找规则(顺序):
1.查找本地变量
2.查找包裹此函数的外部嵌套函数内部的变量
3.全局变量
4.内置变量

globals() / locals() 函数
      globals() 返回全局作用域内变量的字典
      locals() 返回局部作用域内变量的字典

示例:
a=100
b=200
def fx(b,c):
    print(a,b,c)
    # 思考在此函数内部能否获取到全局变量b绑定的值?   不能
   
    print("全局变量的字典是:",globals())
    print("局部变量的字典是:",locals())
    print("此处访问全局的b的值是:",globals()['b'])
fx(300,400)  # (100,300,400)
#打印为:
100 300 400
全局变量的字典是: {'__name__': '__main__', 'b': 200, '__file__': 'wh.py', '__spec__': None, '__package__': None, 'fx': , '__cached__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f67512ab9e8>, 'a': 100, '__builtins__': , '__doc__': None}
局部变量的字典是: {'b': 300, 'c': 400}
此处访问全局的b的值是: 200

练习:
写一个函数mysum 此函数的功能是能返回:
1+2+3+4+5+6+...+n的和

 def mysum(n):
   
    d=[]
    for i in range(1,n+1):
        d.append(i)
    return sum(d)


print(mysum(100))

写一个函数mysum2 此函数可以传入一个参数,两个参数和三个参数:
1.当传入一个参数是,这个参数代表终止数
2.当传入两个参数时,第一个参数代表起始值,第二个参数代表终止值
3.当传入三个参数时,第三参数代表步长此功能是返回从开始到终止值的和
方法一:

def mysum2(*age):
    if len(age)==1:
        s=0
        for x in range(age[0]):
            s+=x
        return s
    elif len(age)==2:
        s=0
        for x in range(age[0],age[1]):
            s+=x
        return s
    elif len(age)==3:
        s=0
        for x in range(age[0],age[1],age[2]):
            s+=x
        return s
  
print(mysum2(5))
print(mysum2(4,6))
print(mysum2(5,10,2))

方法二
def mysum2(a,b=0,c=1):
    if b is 0 :
        b=a
        a=0
    s=0
    for x in range(a,b,c):
        s+=x
    return s
print(mysum2(5))
print(mysum2(4,6))
print(mysum2(5,10,2))

方法三
def mysum2(a,b=0,c=1):
    if b is 0 :
        b=a
        a=0
    return sum(range(a,b,c))
  
print(mysum2(5))
print(mysum2(4,6))
print(mysum2(5,10,2))

方法四:
def mysum2(*arges):
    return sum(range(*arges))


print(mysum2(5))
print(mysum2(4,6))
print(mysum2(5,10,2))

global 语句:
作用:
1.告诉解释执行器,global语句声明的一个或多个变量,这些变量的作用域为模板级的作用域的变量,也称全局变量
2.全局声明(global)  将赋值变量映射到模块文件内部的作用域

语法:
global 变量1, 变量2,...
  示例:
  global a ,b
  global c


  
global 声明示例:
v=100
def fx():
    global a # 声明a为全局变量,不是局部变量

    v=200

fx()
print(v)   # 100 加上global语句后,结果为 # 200

说明:
1.全局变量如果要在函数内部被赋值,则必须经过全局声明(否则会被认为局部变量)
2.全局变量在函数内部不经过声明就可以直接访问
3.不能先声明局部变量,再用global声明为全局变量,此做法不符合规则
    如       v=200
             global v (不能这样写)
4.global变量列表里的变量名不能在此作用域内的形参列表里
如: def f1():
          print(v)

      f1(300)  [此时不能加global语句,来声明v是全局变量]


nonlocal语句:
作用:
告诉解释执行器,nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量
语法:
nonlocal  变量名1, 变量名2,...
示例:
v=100
  def outter():
      v=200
      print("outter里的v=",v)
      def inner():
          nonlocal v
          v+=1
          print("innter里的v=",v)

      inner()
      print("调用inner后,ouuter里的v=",v)

  outter()
  print("全局变量的v的值是:",v)

 

说明:
1.nonlocal 语句只能在被嵌套函数内部进行使用
2.访问nonlocal变量将对外部嵌套函数作用域内的变量进行操作
3.当有两层或两层以上函数嵌套时,访问nonlocal变量只对最近一层的变量进行操作
4.nonlcal语句的变量列表的变量名不能出现在此函数的参数列表里

说明示例:
def f1():
    v=100
    def f2():
        v=200
        def f3():
            nonlocal v
            v+=1  # 此时只对f2的v 进行操作
f3()
    f2()

 

练习:
1.创建一个列表l=[]
写一个函数 input_number 读取数据放入列表l中
程序如下:

答案:

l=[]
def input_number():
    s=[]
    while True:
        i=int(input("请输入数字(-1结束):"))
        if i==-1:
            break
        s.append(i)
    global l
    l=s

input_number()
print("您刚才输入的整数值是:",l)


2.写一个函数isprime(x)判断x 是否为素数,如果为素数True,否则返回False

def isprime(x):
    if x<=1: # 排除小于1的数
        return False
    for i in range(2,x):
        if x%i==0:
            return False
    return True
if isprime(5)
    print("5是素数")

3.写一个函数prime_m2n(m,n)返回从m开始,到n结束范围内的列表,并打印
l=prime_m2n(10,20)
print(l) #[11,13,17,19]

def prime_m2n(m,n):
    return list(filter(isprime,range(m,n)))

l=prime_m2n(10,20)
print(l) 


4.写一个函数primes(n),返回小于n的所有的素数的列表
l=primes(10)
print(l) #[2,3,5,7]

def primes(n):
    return prime_m2n(2,n)


l=primes(10)
print(l)

你可能感兴趣的:(Python 函数变量global nonlocal,作用域)