day10函数变量作用域匿名函数eval 和 exec函数
day09回顾:
- 实参 -----> 形参
参数传递:
位置传参
序列传参 (*序列)
关键传参
print(1, 2, 3, sep=’#’)
字典关键传参(**字典)
-
形参有四种
- 位置形参
- *元组形参 (接收多余的位置传参:*args)
- 命名关键字形参(强制使用关键字传参)
- **字典形参(接收多余的关键传参:**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, …- 说明:
- 全局变量如果要在函数内部被赋值,则必须经过全局声明,否则会被认为是局部变量
- 全局变量在函数内部不经过全局声明就可以访问(取值)
- 不能先声明局部变量,再用global声明为全局变量,此做法不附合规则
- 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, …- 说明:
- nonlocal 语句只能在嵌套函数内部进行使用
- 对nonlocal变量列表内的变量赋值将对外部嵌套函数作用域内的变量进行操作
- 当有两层或两层以上函数嵌套时,访问nonlocal变量只对最近的一层的变量进行操作
- nonlocal语句变量列表里的变量名,不能出现在此函数的形参列表中
- 说明:
-
问题:
def 语句的作用
lambda 表达式(又名匿名函数)
作用:
创建一个匿名函数对象,同def类似,但不提供函数名
语法:
lambda [函数形参列表]: 表达式
说明:
lambda 表达式创建的函数只能包含一条表达式且直接返回表达式的值
lambda 比函数简单,且可以随时创建和销毁,有利于减少程序的偶合度
def xxx ([函数形参列表]):
return 表达式
- 练习:
-
写一个lambda表达式:
fx = lambda n: …
此表达式创建的函数判断n这个数的2次方+1能否被5整除,如果能整除返回True,否则返回False
如:
print(fx(3)) # True
print(fx(4)) # False -
写一个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}) -
练习:
- 看懂下面的程序在做什么
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)-
给出一个整数n,写一个函数来计算
1 + 2 + 3 + 4 + … + n 的值并返回结果
要求用函数来做
如:
def mysum(n):
…
print(mysum(100)) # 5050
print(mysum(10)) # 55 -
给出一个整数n,写一个函数来计算n!(n的阶乘))
n! = 1234…*n
def myfac(n):
…
print(myfac(5)) # 120 -
给出一个整数n,写一个函数来计算
1+22+33+…+ n**n的和
(n给一个小点的数) -
写程序打印杨辉三解(只打印6层)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
- 实现带界面的学生信息管理系统的项目
±----------------------+
| 1) 添加学生信息 |
| 2) 显示学生信息 |
| 3) 删除学生信息 |
| 4) 修改学生成绩 |
| q) 退出 |
±----------------------+
(要求:用函数来实现,每个功能写一个函数写之相对应)