#!/usr/bin/python
#coding:utf-8
#学习巧用locals局部变量函数
"""
1.Python 如何处理变量。
(1).Python 有两个内置的函数,locals 和 globals,
(2).它们提供了基于 dictionary 的访问局部和全局变量的方式
2.下面来了解下关于命名空间的知识:
Python 使用叫做名字空间的东西来记录变量的轨迹。名字空间只是一个 dictionary ,
它的键字就是变量名,它的值就是那些变量的值。实际上,名字空间可以像 Python
的 dictionary 一样进行访问
3.名名空间的介绍:
在一个 Python 程序中的任何一个地方,都存在几个可用的名字空间。每个函数都有
着自已的名字空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数和局
部定义的变量。每个模块拥有它自已的名字空间,叫做全局名字空间,它记录了模块
的变量,包括函数、类、其它导入的模块、模块级的变量和常量。还有就是内置名字
空间,任何模块均可访问它,它存放着内置的函数和异常
4.当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照
如下顺序:
(1).局部名字空间――特指当前函数或类的方法。如果函数定义了一个局部变量 x,或
一个参数 x,Python 将使用它,然后停止搜索。
(2).全局名字空间――特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,
Python 将使用它然后停止搜索。
(3).内置名字空间――对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是
内置函数或变量。
(4).如果 Python 在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常
同时传递 There is no variable named 'x' 这样一条信息
"""
#下面是操作的例子
"""
#上述例子的说明
"""
1.函数 foo 在它的局部名字空间中有两个变量: x,y (它的值是被传入函数的)和z(它是在函数里定义的)。
2.locals 返回一个名字/值对的 dictionary。这个 dictionary 的键字是字符串形式的变量名字,
"""
"""
###############################################################
#coding:utf-8
#学习巧用locals局部变量函数
"""
1.Python 如何处理变量。
(1).Python 有两个内置的函数,locals 和 globals,
(2).它们提供了基于 dictionary 的访问局部和全局变量的方式
2.下面来了解下关于命名空间的知识:
Python 使用叫做名字空间的东西来记录变量的轨迹。名字空间只是一个 dictionary ,
它的键字就是变量名,它的值就是那些变量的值。实际上,名字空间可以像 Python
的 dictionary 一样进行访问
3.名名空间的介绍:
在一个 Python 程序中的任何一个地方,都存在几个可用的名字空间。每个函数都有
着自已的名字空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数和局
部定义的变量。每个模块拥有它自已的名字空间,叫做全局名字空间,它记录了模块
的变量,包括函数、类、其它导入的模块、模块级的变量和常量。还有就是内置名字
空间,任何模块均可访问它,它存放着内置的函数和异常
4.当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照
如下顺序:
(1).局部名字空间――特指当前函数或类的方法。如果函数定义了一个局部变量 x,或
一个参数 x,Python 将使用它,然后停止搜索。
(2).全局名字空间――特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,
Python 将使用它然后停止搜索。
(3).内置名字空间――对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是
内置函数或变量。
(4).如果 Python 在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常
同时传递 There is no variable named 'x' 这样一条信息
"""
#下面是操作的例子
"""
def func(x,y):
z = x + y
print locals()
if __name__ == "__main__":
func(10,20)
#输出的结果是:
#>>>
#{'y': 20, 'x': 10, 'z': 30}
#可以看到局部变量里面的内容,是以字典的形式去记录的
"""
#上述例子的说明
"""
1.函数 foo 在它的局部名字空间中有两个变量: x,y (它的值是被传入函数的)和z(它是在函数里定义的)。
2.locals 返回一个名字/值对的 dictionary。这个 dictionary 的键字是字符串形式的变量名字,
"""
"""
import string
def func(x):
global m
m = x
print globals()
print "####################"
print locals()
if __name__ == "__main__":
func(10)
"""
#输出的结果是():
#>>>
#{'string': <module 'string' from 'C:\Python27\lib\string.pyc'>, '__builtins__': <module '__builtin__' (built-in)>,
# 'm': 10, '__package__': None, 'func': <function func at 0x02A12C70>, '__name__': '__main__', '__doc__': None}
#"####################"
#{'x': 10}
#上述可以看到函数的的全局变量 (m 通过global生命全局变量也变成的全局变量)
#导入的模块也变成的全局变量
#记得 if __name__ 技巧吗?当运行一个模块时 (相对于从另外一个模块中导入而言),
#内置的 __name__ 是一个特殊值 __main__。因为我们是把这个模块当作脚本从命令来
#运行的,故 __name__ 值为 __main__
###############################################################
#locals 和 globals的区别:
#locals 是只读的,globals 不是 如下:
"""
def func(args):
x = 1
global m
m = x
print locals()
locals()['x'] =10
globals()['m'] = 10
print 'x = ',x
print 'm = ',m
if __name__ == "__main__":
func(5)
"""
#输出的结果是
#>>>
#{'x': 1, 'args': 5}
#x = 1
#m = 10
#上面说明了局部变量是不可变的,全局变量是可变的
####################################################################
#下面是巧用局部变量
_list = []
def func(x,y):
_list.append("%(x)s ===> %(y)s"%locals())
while len(_list) <10:
func(len(_list)-1,len(_list)+1)
print _list
#输出的结果是
#>>>
#['-1 ===> 1', '0 ===> 2', '1 ===> 3', '2 ===> 4', '3 ===> 5', '4 ===> 6',
#'5 ===> 7', '6 ===> 8', '7 ===> 9', '8 ===> 10']
#可以生成上面的例子
#格式化字符串的使用
# '%(keys)s'%{key,value} 这样可以出入一个字典
参考:http://woodpecker.org.cn/diveintopython/html_processing/dictionary_based_string_formatting.html