函数书

函数

  • 函数也可以通过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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值