基础 day10

day10笔记:

今日内容:

  全局变量和局部变量

  函数的嵌套定义

  global, nonlocal语句

  lambda 表达式

 

局部变量:

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

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

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

全局变量:

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

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

 

示例见:

  variable.py

 

局部变量说明:

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

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

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

 

练习:

  创建一个全局变量:

  L = []

  写一个函数:

  def input_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)

 

 

案例:

  看懂如下代码做什么事?

 

  def myinput(fn):

      L = []

      while True:

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

          if x < 0:

              break

          L.append(x)

      return fn(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

外部嵌套函数作用域  Enclosing function locals  E

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

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

 

示例见:

  namespace.py

 

变量名的查找规则:

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

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

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

 

 

问题:

  v = 100

  def change_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变量列表里的变量名不能出现在此作用域内形参列表里

 

 

 

练习:

  写一个函数

    def hello(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比函数简单且可以随时创建和销毁,有利于减少程序的偶合度

 

 

练习:

  1. 写一个lambda 表达式,判断这个数的2次方+1是否能被5整除,如果能被整除返回True,否则返回False

    fx = lambda n: .....

    print(fx(3))  # True

    print(fx(4))  # False

 

  2. 写一个lambda 表达式求两个变量的最大值

  def mymax(x, y):

      ....

  mymax = lambda ......

  print(mymax(100, 200))  # 200

 

看懂下面的程序在干什么?

  def fx(f, x, y):

      print(f(x, y))

 

  fx((lambda a, b: a + b), 100, 200)

  fx((lambda a, b: a ** b), 3, 4)

基础
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值