给大家推荐一个公众号:诗葵1931
里面的诗歌很美
变量作用域
变量由作用范围限制
分类:按照作用域分类
全局(global): 在函数外部定义
局部(local):在函数内部定义
变量的作用范围:
全局变量:在整个全局范围都有效
全局变量在局部可以使用(即函数内部可以方位函数外部定义的变量)
局部变量在局部范围可以使用
局部变量在全局范围无法使用
LEGB原则
L(Local)局部作用域
E(Enclosing function locale)外部嵌套函数作用域
G(Global module)函数定义所在模块作用域
B(Buildin): python内置魔抗的作用域
In [4]:
认为a1是全局的
a1 = 100
def fun():
print(a1)
print(“I am in fun”)
# a2的作用范围是fun
a2 = 99
print(a2)
print(a1)
fun()
print(a2)
100
100
I am in fun
99
NameError Traceback (most recent call last)
in ()
12 print(a1)
13 fun()
—> 14 print(a2)
NameError: name ‘a2’ is not defined
提升局部变量为全局变量
使用global
案例如下
In [17]:
def fun():
global b1
b1 = 100
print(b1)
print(“I am in fun”)
# a2的作用范围是fun
b2 = 99
print(b2)
#print(b2)
fun()
print(b1)如果在函数调用上面,则不好使,报错,为什么???
print(b1)
100
I am in fun
99
100
globals, locals函数
可以通过globals和locals显示出局部变量和全局变量
参看以下案例
In [10]:
globals 和 locals
globals 和 locals 叫做内建函数
a = 1
b = 2
def fun(c,d):
e = 111
print(“Locals={0}”.format(locals()))
print(“Globals={0}”.format(globals()))
fun(100, 200)
Locals={‘e’: 111, ‘d’: 200, ‘c’: 100}
Globals={‘name’: ‘main’, ‘doc’: ‘Automatically created module for IPython interactive environment’, ‘package’: None, ‘loader’: None, ‘spec’: None, ‘builtin’: <module ‘builtins’ (built-in)>, ‘builtins’: <module ‘builtins’ (built-in)>, ‘_ih’: [’’, ‘# 认为a1是全局的\na1 = 100\n\ndef fun():\n print(a1)\n print(“I am in fun”)\n # a2的作用范围是fun\n a2 = 99\n print(a2)\n \n \nprint(a1)\n#print(a2)’, ‘# 认为a1是全局的\na1 = 100\n\ndef fun():\n print(a1)\n print(“I am in fun”)\n # a2的作用范围是fun\n a2 = 99\n print(a2)\n \n \nprint(a1)\nfun()\n#print(a2)’, ‘# 认为a1是全局的\na1 = 100\n\ndef fun():\n print(a1)\n print(“I am in fun”)\n # a2的作用范围是fun\n a2 = 99\n print(a2)\n \n \nprint(a1)\nfun()\nprint(a2)’, ‘# 认为a1是全局的\na1 = 100\n\ndef fun():\n print(a1)\n print(“I am in fun”)\n # a2的作用范围是fun\n a2 = 99\n print(a2)\n \n \nprint(a1)\nfun()\nprint(a2)’, ‘\ndef fun():\n b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\nprint(b2)\nfun()’, ‘\ndef fun():\n global b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\n#print(b2)\nfun()’, ‘\ndef fun():\n global b1\n b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\n#print(b2)\nfun()’, ‘\ndef fun():\n global b1\n b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\n#print(b2)\nfun()’, ‘\ndef fun():\n b1 = 100\n global b1\n b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\n#print(b2)\nfun()’, ‘# globals 和 locals\na = 1\nb = 2\n\ndef fun(c,d):\n e = 111\n print(“Locals={0}”.format(locals()))\n print(“Globals={0}”.format(globals()))\n \nfun(100, 200)’], ‘oh’: {}, ‘dh’: [’/home/tlxy/cookbook_and_code’], ‘In’: [’’, ‘# 认为a1是全局的\na1 = 100\n\ndef fun():\n print(a1)\n print(“I am in fun”)\n # a2的作用范围是fun\n a2 = 99\n print(a2)\n \n \nprint(a1)\n#print(a2)’, ‘# 认为a1是全局的\na1 = 100\n\ndef fun():\n print(a1)\n print(“I am in fun”)\n # a2的作用范围是fun\n a2 = 99\n print(a2)\n \n \nprint(a1)\nfun()\n#print(a2)’, ‘# 认为a1是全局的\na1 = 100\n\ndef fun():\n print(a1)\n print(“I am in fun”)\n # a2的作用范围是fun\n a2 = 99\n print(a2)\n \n \nprint(a1)\nfun()\nprint(a2)’, ‘# 认为a1是全局的\na1 = 100\n\ndef fun():\n print(a1)\n print(“I am in fun”)\n # a2的作用范围是fun\n a2 = 99\n print(a2)\n \n \nprint(a1)\nfun()\nprint(a2)’, ‘\ndef fun():\n b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\nprint(b2)\nfun()’, ‘\ndef fun():\n global b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\n#print(b2)\nfun()’, ‘\ndef fun():\n global b1\n b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\n#print(b2)\nfun()’, ‘\ndef fun():\n global b1\n b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\n#print(b2)\nfun()’, ‘\ndef fun():\n b1 = 100\n global b1\n b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\n#print(b2)\nfun()’, ‘# globals 和 locals\na = 1\nb = 2\n\ndef fun(c,d):\n e = 111\n print(“Locals={0}”.format(locals()))\n print(“Globals={0}”.format(globals()))\n \nfun(100, 200)’], ‘Out’: {}, ‘get_ipython’: <bound method InteractiveShell.get_ipython of <ipykernel.zmqshell.ZMQInteractiveShell object at 0x7f891e18d198>>, ‘exit’: <IPython.core.autocall.ZMQExitAutocall object at 0x7f8914136fd0>, ‘quit’: <IPython.core.autocall.ZMQExitAutocall object at 0x7f8914136fd0>, '’: ‘’, '’: ‘’, '’: ‘’, ‘_i’: ‘\ndef fun():\n b1 = 100\n global b1\n b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\n#print(b2)\nfun()’, ‘_ii’: ‘\ndef fun():\n global b1\n b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\n#print(b2)\nfun()’, ‘_iii’: ‘\ndef fun():\n global b1\n b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\n#print(b2)\nfun()’, ‘_i1’: ‘# 认为a1是全局的\na1 = 100\n\ndef fun():\n print(a1)\n print(“I am in fun”)\n # a2的作用范围是fun\n a2 = 99\n print(a2)\n \n \nprint(a1)\n#print(a2)’, ‘a1’: 100, ‘fun’: <function fun at 0x7f88fbfb5268>, ‘_i2’: ‘# 认为a1是全局的\na1 = 100\n\ndef fun():\n print(a1)\n print(“I am in fun”)\n # a2的作用范围是fun\n a2 = 99\n print(a2)\n \n \nprint(a1)\nfun()\n#print(a2)’, ‘_i3’: ‘# 认为a1是全局的\na1 = 100\n\ndef fun():\n print(a1)\n print(“I am in fun”)\n # a2的作用范围是fun\n a2 = 99\n print(a2)\n \n \nprint(a1)\nfun()\nprint(a2)’, ‘_i4’: ‘# 认为a1是全局的\na1 = 100\n\ndef fun():\n print(a1)\n print(“I am in fun”)\n # a2的作用范围是fun\n a2 = 99\n print(a2)\n \n \nprint(a1)\nfun()\nprint(a2)’, ‘_i5’: ‘\ndef fun():\n b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\nprint(b2)\nfun()’, ‘_i6’: ‘\ndef fun():\n global b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\n#print(b2)\nfun()’, ‘_i7’: ‘\ndef fun():\n global b1\n b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\n#print(b2)\nfun()’, ‘_i8’: ‘\ndef fun():\n global b1\n b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\n#print(b2)\nfun()’, ‘_i9’: ‘\ndef fun():\n b1 = 100\n global b1\n b1 = 100\n print(b1)\n print(“I am in fun”)\n # a2的作用范围是fun\n b2 = 99\n print(b2)\n \n \nprint(b1)\n#print(b2)\nfun()’, ‘_i10’: ‘# globals 和 locals\na = 1\nb = 2\n\ndef fun(c,d):\n e = 111\n print(“Locals={0}”.format(locals()))\n print(“Globals={0}”.format(globals()))\n \nfun(100, 200)’, ‘a’: 1, ‘b’: 2}
eval()函数
把一个字符串当成一个表达式来执行, 返回表达式执行后的结果
语法:
eval(string_code, globals=None, locals=None)
exec()函数
跟eval功能类似, 但是,不返回结果
语法:
exec(string_code, globals=None, locals=None)
In [11]:
x = 100
y = 200
执行x+y
z = x + y
z1 = x + y
z2 = eval(“x+y”)
print(z1)
print(z2)
300
300
In [13]:
exec示例
x = 100
y = 200
执行x+y
z = x + y
z1 = x + y
1, 注意字符串中引号的写法
2. 比对exec执行结果和代码执行结果
z2 = exec(“print(‘x+y:’, x+y)”)
print(z1)
print(z2)
x+y: 300
300
None
递归函数
含税直接或者间接调用自身
优点:简洁,理解容易
缺点:对递归深度有限制,消耗资源大
python对递归深度有限制,超过限制报错
在写递归程序的时候,一定注意结束条件
In [15]:
递归调用深度限制代码
x = 0
def fun():
global x
x += 1
print(x)
# 函数自己调用自己
fun()
调用函数
fun()
1
2
3
4
5
6
7
8
9
10
.
.
.
.
1964
1965
RecursionError Traceback (most recent call last)
in ()
11
12 # 调用函数
—> 13 fun()
in fun()
8 print(x)
9 # 函数自己调用自己
—> 10 fun()
11
12 # 调用函数
… last 1 frames repeated, from the frame below …
in fun()
8 print(x)
9 # 函数自己调用自己
—> 10 fun()
11
12 # 调用函数
RecursionError: maximum recursion depth exceeded in comparison
In [20]:
斐波那契额数列
一列数字,第一个值是1, 第二个也是1, 从第三个开始,每一个数字的值等于前两个数字出现的值的和
数学公式为: f(1) = 1, f(2) = 1, f(n) = f(n-1) + f(n-2)
例如: 1,1,2,3,5,8,13.。。。。。。。。
下面求斐波那契数列函数有一定问题,比如n一开始就是负数,如何修正
n表示求第n个数子的斐波那契数列的值
def fib(n):
if n == 1:
return 1
if n == 2:
return 1
# 思考:为什么后面return能够正确执行,而不用else语句
return fib(n-1) + fib(n-2)
print(fib(3))
print(fib(10))
2
55
注:本文为北京图灵学院教学视频所做笔记。