欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

day10函数变量作用域匿名函数eval 和 exec函数

程序员文章站 2023-12-21 23:37:22
...

day09回顾:

  • 实参 -----> 形参

参数传递:
位置传参
序列传参 (*序列)
关键传参
print(1, 2, 3, sep=’#’)
字典关键传参(**字典)

  • 形参有四种

    1. 位置形参
    2. *元组形参 (接收多余的位置传参:*args)
    3. 命名关键字形参(强制使用关键字传参)
    4. **字典形参(接收多余的关键传参:**kwargs)
  • 缺省参数:
    def fx(a,b=0,*,c=0,d=0):
    pass

  • 全局变量
    局部变量
    函数内部创建的变量是局部变量
    globals()
    locals()

day10笔记:

函数变量

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

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

  • 观查下面函数的执行结果是什么?

  def goodbye(L):
      for x in L:
          print("再见:", x)

  def hello(L):
      for x in L:
          print("您好:", x)

  def fx(fn, L):
      fn(L)

  fx(goodbye, ["Tom", "Jerry", "Spike"])

看懂如下代码:
  def myinput(fn):
      L = [1, 3, 5, 7, 9]
      r = fn(L)
      return r

  print(myinput(max))  # 9
  print(myinput(min))  # 1
  print(myinput(sum))  # 25
  • 函数可以作为另一个函数的返回值

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

python的作用域:

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

  • python的四个作用域:
作用域 英文 英文简写
局部作用域(函数内 ) Local L
外部嵌套函数作用域 Enclosing function local E
函数定义所在模块作用域 Global G
python内建模块的作用域 Builtin(Python) B
  • 变量名的查找规则
    在访问变量时,先查找本地变量,然后是包裹此函数外部的函数内部的变量,之后是全局变量,最后是内建变量.
    即: L --> E --> G --> B
    在默认的情况下,变量名赋值会创建或者改变本地作用域内的变量

  • 练习:
    得到下列程序运行的结果,思考为什么?
    L = [1, 2]
    def f1():
    L = [3, 4, 5]
    f1()
    print(L) # [1, 2] 因为f1()只制造了局部变量

    def f2():
    L += [3, 4, 5] # L = L + [3, 4, 5]
    f2()
    print(L) # 出错

    def f3():
    L[:] = [3, 4, 5]
    f3()
    print(L) # [3, 4, 5]

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

    • 说明:
      1. 全局变量如果要在函数内部被赋值,则必须经过全局声明,否则会被认为是局部变量
      2. 全局变量在函数内部不经过全局声明就可以访问(取值)
      3. 不能先声明局部变量,再用global声明为全局变量,此做法不附合规则
      4. global变量列表里的变量名不能出现在函数的形参列表里
  • 练习:
    写一个函数hello,部分代码如下:
    count = 0
    def hello(name):
    print(“你好”, name)
    … 此处略
    当调用hello函数时,全局变量count自动做加1操作来记录hello被调用的次数
    如:
    hello(“Tom”)
    hello(“Jerry”)
    print(“hello函数共被调用%d次” % count) # 2

  • nonlocal语句
    作用:
    告诉解释执行器,nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量
    语法:
    nonlocal 变量名1, 变量名2, …

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

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

作用:
创建一个匿名函数对象,同def类似,但不提供函数名
语法:
lambda [函数形参列表]: 表达式

说明:
lambda 表达式创建的函数只能包含一条表达式且直接返回表达式的值
lambda 比函数简单,且可以随时创建和销毁,有利于减少程序的偶合度

def xxx ([函数形参列表]):
    return  表达式
  • 练习:
    1. 写一个lambda表达式:
      fx = lambda n: …
      此表达式创建的函数判断n这个数的2次方+1能否被5整除,如果能整除返回True,否则返回False
      如:
      print(fx(3)) # True
      print(fx(4)) # False

    2. 写一个lambda表达式来创建函数,此函数返回两个形参变量的最大值
      def mymax(x, y):

      mymax = lambda …
      print(mymax(100, 200)) # 200
      print(mymax(“ABC”, “123”)) # ABC

eval() 和 exec() 函数

  • eval 函数
    作用:
    把一个字符串当表达式来执行,返回表达式执行后的结果
    格式:

    eval(source, global=None, local=None)

    示例:

    s = “1 + 2 * 3”
    v = eval(s) # v = 7
    print(v) # 7
    x = 100
    y = 200
    s = “x + y”
    v = eval(s) # v = 300

  • exec 函数
    作用:
    把一个字符串当程序来执行
    格式:

    exec(source, global=None, local=None)

    示例:

    s = “x=100\ny=200\nprint(‘x+y=’,x+y)”
    exec(s)
    s = “print(x+y)\nprint(x*y)”
    exec(s, {‘x’:10, ‘y’:20}, {‘y’:2})

  • 练习:

    1. 看懂下面的程序在做什么

    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)

    1. 给出一个整数n,写一个函数来计算
      1 + 2 + 3 + 4 + … + n 的值并返回结果
      要求用函数来做
      如:
      def mysum(n):

      print(mysum(100)) # 5050
      print(mysum(10)) # 55

    2. 给出一个整数n,写一个函数来计算n!(n的阶乘))
      n! = 1234…*n
      def myfac(n):

      print(myfac(5)) # 120

    3. 给出一个整数n,写一个函数来计算
      1+22+33+…+ n**n的和
      (n给一个小点的数)

    4. 写程序打印杨辉三解(只打印6层)

         1
        1 1 
       1 2 1 
      1 3 3 1 
     1 4 6 4 1 
    1 5 10 10 5 1 
  1. 实现带界面的学生信息管理系统的项目
    ±----------------------+
    | 1) 添加学生信息 |
    | 2) 显示学生信息 |
    | 3) 删除学生信息 |
    | 4) 修改学生成绩 |
    | q) 退出 |
    ±----------------------+
    (要求:用函数来实现,每个功能写一个函数写之相对应)

上一篇:

下一篇: