局部变量 全局变量 函数的嵌套

day10笔记:

局部变量:

  1. 定义在函数内部的变量称为局部变量(函数的形参也是局部变量)

  2. 局部变量只能在函数内部使用

  3. 局部变量在函数调用时才能够被创建,在函数调用结束之后会自动销毁

全局变量:

  1. 定义在函数外部,模块内部的变量称为全局变量

  2. 所有的函数都可以直接访问"全局"变量,但函数内部不能直接通过赋值语句来改变全局变量

示例见:

  variable.py

局部变量说明:

  1. 在函数内首次对变量赋值是创建局部变量,再次为变量赋值是修改局部变量的绑定关系

  2. 在函数内部的赋值语句不会对全局变量造成影响

  3. 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个模块同访问

  4.  形参也是局部变量

练习:

  创建一个全局变量:

  L = []

  写一个函数:

  definput_number():

      读入正整数 放到L列表内

  # ......   input_number()  # 输入1 2 3

  print(L)  # [1, 2, 3]

  # .....input_number()  # 输入4,5

  print(L)  # [1, 2, 3, 4, 5]

globals() 函数和locals 函数

  globals() 返回当前全局作用域内变量的字典

  locals()  返回当前局部作用域内的变量的字典

  示例见:

   globals_locals_function.py

函数变量

  函数名是变量,它在创建时绑定一个函数

  示例见:

   function_variable.py

一个函数可以作为另一个函数实参传递

示例:

  def f1():

     print("f1被调用")

  def f2():

     print("f2被调用")

  def fx(fn):

     print("fn绑定的是: ", fn)

      fn()  # 调用fn绑定的函数,此处等同于调用谁呢?

  fx(f1)

  fx(f2)

案例:

  看懂如下代码做什么事?

  defmyinput(fn):

      L = []

      whileTrue:

          x =int(input("请输入大于0的整数:") or '-1')

          if x< 0:

             break

         L.append(x)

      returnfn(L)  # <<< 注意此处

 print(myinput(max))

 print(myinput(min))

  print(myinput(sum))

函数作为另一个函数的返回值

 

示例见:

  function_return_other_function.py

函数的嵌套定义

  函数嵌套定义是指一个函数里用def 语句来创建其它函数的情况

  示例见:

   function_embed_def.py

python 的作用域

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

python的四个作用域  LEGB

  作用域               英文解释          英文简写

局部作用域(函数内)  Local(function)            L

外部嵌套函数作用域  Enclosingfunction locals  E

函数定义所在模块(文件)的作用域 Globals(module)   G

python 内置模块的作用域 Builtin(python)        B

示例见:

  namespace.py

变量名的查找规则:

  1. 在访问变量时先查找本地变量,然后是包裹此函数外部的函数内部的变量,之后是全局变量,最后是内置(内建)变量

      L--->  E  ---> G ---> B

  2. 在默认情况下,变量名赋值会创建或者改变本地作用域变量

问题:

  v = 100

  defchange_v(a):

      v = a  #  请问能修改全局的v吗?

  change_v(200)

global 语句

  作用:

    1. 告诉解释器,global语句声明的一个或多个变量,这些变量的作用域为模块级的作用域(也称作全局变量)

    2. 全局声明(global)将赋值的变量映射到模块文件内部的作用域

  语法:

    global 变量1, 变量2, ...

  示例:

    global v, a,b, c

    global d

  示例见:

    global.py

  global说明

    1. 全局变量如果要在函数内部被赋值,则必须经过全局 声明(否则会被认为是局部变量)

    2. 全局变量在函数内部不经过声明就可以直接访问

    3.不能先创建局部变量,再用global声明为全局变量,此做法不附合规则

    4. global变量列表里的变量名不能出现在此作用域内形参列表里

练习:

  写一个函数

    defhello(name):

        ...  此处自己实现

    count =0  # 此变量用来记录hello函数被调用的次数

    hello("小张")

    hello("小李")

    print("函数hello已经被调用%d次" % count ) # 2

    hello("小赵")

    print("函数hello已经被调用%d次" % count ) # 3

nonlocal 语句

  作用:

    告诉解释器,nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量

  nonlocal的语法

    nonlocal 变量名1,变量名2, ...

  示例见:

    nonlocal.py

  说明:

    1. nonlocal 语句只能在被嵌套的函数内部进行使用

    2. 访问nonlocal变量将对外部嵌套函数作用域内的变量进行操作

    3. 当有两层或两层以上函数嵌套时,访问nonlocal变量只对最近一层的变量进行操作

    4. nonlocal语句的变量列表里的变量名,不能出现在此函数参数列表中

问题:

  请问'def 语句' 干什么用的?

lambda 表达式(又称匿名函数)

  作用:

    创建一个匿名函数对象

    同 def类似,但不提供函数名

  语法格式:

    lambda [形参1, 形参2, ...] : 表达式

  示例见:

    lambda.py

  说明:

    1. lambda 只是一个表达式,它用来创建一个函数对象

    2. 当lambda表达式调用时,先执行冒号(:)后的表达式,并返回表达式的结果的引用

    3. lambda 表达式创建的函数只能包含一条表达式

4. lambda比函数简单且可以随时创建和销毁,有利于减少程序的偶合度

eval()/exec()函数

eval(source,globals=none,local=none)

把一个字符串srouce

 

猜你喜欢

转载自blog.csdn.net/joyevansfeng/article/details/81039986