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