全局变量和局部变量:
局部变量:
定义在函数内部的变量称为局部变量(函数的形参也是局部变量)
局部变量只能在函数内部使用
局部变量在函数调用时才能够被创建,在函数调用之后会自动销毁
全局变量:
定义在函数外部,模块内部的变量成为全局变量
全局变量,所有函数都可以直接访问(但函数内部不能直接修改全局变量的绑定关系)
示例:
a=100
b=200
def fn(c):
d=400
print(a,b,c,d)
fn(300)
print('a=',a)
print('b=',b)
print('c=',c)# 函数调用完被销毁掉,不会有c
局部变量说明:
1.在函数内首次对变量复制时创建局部变量,再次为变量赋值是修改局部变量的绑定关系
2.在函数内部的赋值语句不会对全局变量造成影响
python作用域
作用域也叫命名空间,是访问变量时查找变量名的范围空间
python的四个作用域LEGB
作用域 英文解释 英文简写
局部作用域 (函数内) Local(function) L
外部嵌套函数作用域 Enclosing function locals E
函数定于所在模块的作用域 Global(module) G
python内置模块的作用域 Builtin(python) B
示例:
v=100
def fun1():
v=200
print("fun1里的v的值为:",v) # 200
# 定义另一个函数fun2然后调用
def fun2():
print("fun2v=",v) # 200
fun2()
fun1()
print("全局变量v=",v)
变量名的查找规则(顺序):
1.查找本地变量
2.查找包裹此函数的外部嵌套函数内部的变量
3.全局变量
4.内置变量
globals() / locals() 函数
globals() 返回全局作用域内变量的字典
locals() 返回局部作用域内变量的字典
示例:
a=100
b=200
def fx(b,c):
print(a,b,c)
# 思考在此函数内部能否获取到全局变量b绑定的值? 不能
print("全局变量的字典是:",globals())
print("局部变量的字典是:",locals())
print("此处访问全局的b的值是:",globals()['b'])
fx(300,400) # (100,300,400)
#打印为:
100 300 400
全局变量的字典是: {'__name__': '__main__', 'b': 200, '__file__': 'wh.py', '__spec__': None, '__package__': None, 'fx':
局部变量的字典是: {'b': 300, 'c': 400}
此处访问全局的b的值是: 200
练习:
写一个函数mysum 此函数的功能是能返回:
1+2+3+4+5+6+...+n的和
def mysum(n):
d=[]
for i in range(1,n+1):
d.append(i)
return sum(d)
print(mysum(100))
写一个函数mysum2 此函数可以传入一个参数,两个参数和三个参数:
1.当传入一个参数是,这个参数代表终止数
2.当传入两个参数时,第一个参数代表起始值,第二个参数代表终止值
3.当传入三个参数时,第三参数代表步长此功能是返回从开始到终止值的和
方法一:
def mysum2(*age):
if len(age)==1:
s=0
for x in range(age[0]):
s+=x
return s
elif len(age)==2:
s=0
for x in range(age[0],age[1]):
s+=x
return s
elif len(age)==3:
s=0
for x in range(age[0],age[1],age[2]):
s+=x
return s
print(mysum2(5))
print(mysum2(4,6))
print(mysum2(5,10,2))
方法二
def mysum2(a,b=0,c=1):
if b is 0 :
b=a
a=0
s=0
for x in range(a,b,c):
s+=x
return s
print(mysum2(5))
print(mysum2(4,6))
print(mysum2(5,10,2))
方法三
def mysum2(a,b=0,c=1):
if b is 0 :
b=a
a=0
return sum(range(a,b,c))
print(mysum2(5))
print(mysum2(4,6))
print(mysum2(5,10,2))
方法四:
def mysum2(*arges):
return sum(range(*arges))
print(mysum2(5))
print(mysum2(4,6))
print(mysum2(5,10,2))
global 语句:
作用:
1.告诉解释执行器,global语句声明的一个或多个变量,这些变量的作用域为模板级的作用域的变量,也称全局变量
2.全局声明(global) 将赋值变量映射到模块文件内部的作用域
语法:
global 变量1, 变量2,...
示例:
global a ,b
global c
global 声明示例:
v=100
def fx():
global a # 声明a为全局变量,不是局部变量
v=200
fx()
print(v) # 100 加上global语句后,结果为 # 200
说明:
1.全局变量如果要在函数内部被赋值,则必须经过全局声明(否则会被认为局部变量)
2.全局变量在函数内部不经过声明就可以直接访问
3.不能先声明局部变量,再用global声明为全局变量,此做法不符合规则
如 v=200
global v (不能这样写)
4.global变量列表里的变量名不能在此作用域内的形参列表里
如: def f1():
print(v)
f1(300) [此时不能加global语句,来声明v是全局变量]
nonlocal语句:
作用:
告诉解释执行器,nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量
语法:
nonlocal 变量名1, 变量名2,...
示例:
v=100
def outter():
v=200
print("outter里的v=",v)
def inner():
nonlocal v
v+=1
print("innter里的v=",v)
inner()
print("调用inner后,ouuter里的v=",v)
outter()
print("全局变量的v的值是:",v)
说明:
1.nonlocal 语句只能在被嵌套函数内部进行使用
2.访问nonlocal变量将对外部嵌套函数作用域内的变量进行操作
3.当有两层或两层以上函数嵌套时,访问nonlocal变量只对最近一层的变量进行操作
4.nonlcal语句的变量列表的变量名不能出现在此函数的参数列表里
说明示例:
def f1():
v=100
def f2():
v=200
def f3():
nonlocal v
v+=1 # 此时只对f2的v 进行操作
f3()
f2()
练习:
1.创建一个列表l=[]
写一个函数 input_number 读取数据放入列表l中
程序如下:
答案:
l=[]
def input_number():
s=[]
while True:
i=int(input("请输入数字(-1结束):"))
if i==-1:
break
s.append(i)
global l
l=s
input_number()
print("您刚才输入的整数值是:",l)
2.写一个函数isprime(x)判断x 是否为素数,如果为素数True,否则返回False
def isprime(x):
if x<=1: # 排除小于1的数
return False
for i in range(2,x):
if x%i==0:
return False
return True
if isprime(5)
print("5是素数")
3.写一个函数prime_m2n(m,n)返回从m开始,到n结束范围内的列表,并打印
l=prime_m2n(10,20)
print(l) #[11,13,17,19]
def prime_m2n(m,n):
return list(filter(isprime,range(m,n)))
l=prime_m2n(10,20)
print(l)
4.写一个函数primes(n),返回小于n的所有的素数的列表
l=primes(10)
print(l) #[2,3,5,7]
def primes(n):
return prime_m2n(2,n)
l=primes(10)
print(l)