一,字典与循环
如果你在 for 语句里面用字典,程序会遍历字典中的所有键。例如下面这个 print_hist 函数就输出其中的每一个键与对应的键值:
$ cat c.py
#!/bin/python
def histogram(s):
d = dict()
for c in s:
if c not in d:
d[c] = 1
else:
d[c] += 1
return d
def print_hist(h):
for c in h:
print(c, h[c])
h = histogram('apple')
print(print_hist(h))
执行结果:
$ python3 c.py
a 1
p 2
l 1
e 1
None
二,全局变量
在主函数中的变量也叫全局变量,因为所有函数都可以访问这些变量。局部变量在所属的函数结束后就消失了,而主函数在其他函数调用结束后依然还存在。
一般常用全局变量作为 flag(标识);比如用来判断一个条件是否成立的布尔变量之类的。比如有的程序用名字为 verbose 的标识变量,来控制输出内容的详细程度:
$ cat d.py
#!/bin/python
verbose = True
def example1():
if verbose:
print('Running example1')
如果你想给全局变量重新赋值,可以看看下面这个例子:
这几行代码的意图,本来是想要追踪确定函数是否被调用了:
$ cat d.py
#!/bin/python
been_called = False
def example2():
been_called = True
但运行后并不报错,been_called的值也并不会变化。
这个情况的原因是 example2这个函数创建了一个新的名为been_called 的局部变量。函数结束之后,局部变量就释放了,并不会影响全局变量。所以,要在函数内部来给全局变量重新赋值,必须要在使用之前声明这个全局变量:
$ cat d.py
#!/bin/python
been_called = False
def example2():
global been_called #全局申明
been_called = True
global 那句代码的效果是告诉解释器:【在这个函数内,been_called 是个全局变量;不要创建一个同名的局部变量】
下面的例子中,试图对全局变量进行更新:
$ cat d.py
#!/bin/python
count = 0
def example3():
count += 1
print(example3())
执行后报错如下:
UnboundLocalError: local variable 'count' referenced before assignment(意思是未绑定局部错误:局部变量 count 未经赋值就被引用)
Python 会假设这个 count 是局部的,然后基于这样的假设,就是在写出该变量之前就试图读取;这样问题的解决方法依然就是声称count 为全局变量:
count = 0
def example3():
global count
count += 1
如果全局变量指向的是一个可修改的值,你可以无需声明该变量就直接修改:
known[2] = 1
所以你可以在全局的列表或者字典里面添加、删除或者替换元素;但如果你要重新给这个全局变量赋值,就必须要声明了:
虽然全局变量很有用,但不要总是修改全局变量的值,那样会增加调试的难度。