函数
- 函数也可以通过lambda表达式来创建。
- lambda创建一个对象但将其作为结果返回。
#例子2:寻找序列的交集
#在模块中编写函数意味着他可以被计算机中的任意程序来导入和重用
def intersect(seq1,seq2):
res = []
for x in seq1:
if x in seq2:
res.append(x)
return res
s1 = 'spam'
s2 = 'scam'
# print(intersect(s1,s2))
#为了公平起见,我们的intersect函数相当慢(执行嵌套循环),可以用列表解析式来替代
a = [x for x in s1 if x in s2]
print(a)
作用域
作用域法则
- 过度的使用全局变量通常是糟糕的事情
- 在代码中变量名被赋值的位置决定了这个变量名能被访问到的范围。
- 一个在def之外被赋值的变量x与在这个def之中赋值的变量x是完全不同的变量
- 函数的作用域有助于防止程序之中变量名的冲突,并且有助于函数成为更加独立的程序单元
- 函数定义了本地作用域,模块定义了全局作用域
- 全局作用域的作用范围仅限于单个文件
- 当你在python中听到
全局的
,你就应该想到模块
- 每次对函数的调用都创建了一个新的本地作用域。p417,待定
- 赋值的变量名除非声明为全局变量或非本地变量,否则均为本地变量。如果需要给一个在函数内部却位于模板文件顶层的变量名赋值,需要在函数内部通过global语句声明。如果需要给位于一个嵌套的def中的名称赋值,通过nonlocal声明。
- 一个函数内部的任何类型的赋值 都会把一个名称划定为本地的。这包括=语句,import中的模块名称,def中的函数名称,函数参数名称等。
- 原处改变对象并不会把变量划分为本地变量,实际上只有对变量名称赋值才可以。例如,如果变量名L在模块的顶层被赋值为一个列表,在函数内部的像L.append(x)这样的语句并不会将L划分为本地变量,而L=x可以。
变量名解析:LEGB原则
变量名引用分为三个作用域进行查找:首先是本地,之后是函数内,之后全局,最后内置
函数能够在函数内部以及全局作用域直接使用变量名,但是必须声明为非本地变量和全局变量 去改变其属性
nonlocal声明也可以迫使名称映射到函数内部的作用域中。
作用域实例
x = 99 #global全局的,x和func