学会Python的这五点搞定作用域

1、搞定块级作用域

想想此时运行下面的作用程序会有输出吗?执行会成功吗?

#块级作用域 if 1 == 1:     name = "lzl" print(name) for i in range(10):     age = i print(age) 

我们先看下执行结果:

C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py lzl 9 

Process finished with exit code 0

代码执行成功,没有问题;在Java/C#中,搞定执行上面的作用代码会提示name,age没有定义,搞定而在Python中可以执行成功,作用这是搞定因为在Python中是没有块级作用域的,代码块里的作用变量,外部可以调用,搞定所以可运行成功;

2、作用局部作用域

回顾之前学过的搞定知识,我们学函数的作用时候,函数是搞定个单独的作用域,Python中没有块级作用域,作用但是搞定有局部作用域;看看下面的代码

#局部作用域

def  func():     name = "lzl" print(name) 

运行这段代码,想想会不会有输出?

Traceback (most recent call last):   File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py", line 23, in <module>     print(name) NameError: name name is not defined 

运行报错,我相信这个大家都能理解,name变量只在func()函数内部中生效,所以在全局中是没法调用的;对上面代码做个简单调整,再看看结果如何?

#局部作用域 def  func():     name = "lzl" func()          #执行函数 print(name) 

对之前的云南idc服务商代码添加了一句代码,在变量name打印之前,执行了一下函数,此时打印会不会有变化?

Traceback (most recent call last):   File "C:/Users/L/PycharmProjects/s14/preview/Day8/作用域/main.py", line 23, in <module>     print(name) NameError: name name is not defined 

执行依然报错,还是回到刚才那句话:即使执行了一下函数,name的作用域也只是在函数内部,外部依然无法进行调用;把前两个知识点记住,接下来要开始放大招了

3、作用域链

对函数做下调整,看看下面的代码执行结果如何?

#作用域链 name = "lzl" def f1():     name = "Eric"     def f2():         name = "Snor"         print(name)     f2() f1() 

学过函数,肯定知道***f1()执行完会输出Snor;我们先记住一个概念,Python中有作用域链,变量会由内到外找,先去自己作用域去找,自己没有再去上级去找,直到找不到报错

4、***版作用域

好,铺垫了够了,***版的来了~~

#***版作用域 name = "lzl" def f1():     print(name) def f2():     name = "eric"     f1() f2() 

想想***f2()执行结果是打印“lzl”呢,还是打印“eric”?记住自己的答案,现在先不把答案贴出来,先看看下面这段代码:

#***版作用域 name = "lzl" def f1():     print(name) def f2():     name = "eric"     return f1 ret = f2() ret() #输出:lzl 

执行结果为“lzl”,分析下上面的代码,f2()执行结果为函数f1的服务器托管内存地址,即ret=f1;执行ret()等同于执行f1(),执行f1()时与f2()没有任何关系,name=“lzl”与f1()在一个作用域链,函数内部没有变量是会向外找,所以此时变量name值为“lzl”;理解了这个,那么刚才没给出答案的那个***代码你也知道答案了。

#***版作用域  name = "lzl"  def f1():      print(name)  def f2():      name = "eric"      f1()  f2()  # 输出:lzl

是的,输出的是“lzl”,记住在函数未执行之前,作用域已经形成了,作用域链也生成了。

5、新浪面试题

li = [lambda :x for x in range(10)] 

判断下li的类型?li里面的元素为什么类型?

print(type(li)) print(type(li[0])) # <class list> # <class function> 

可以看到li为列表类型,list里面的元素为函数,那么打印list里面***个元素的返回值,此时返回值为多少?

#lambada 面试题 li = [lambda :x for x in range(10)] res = li[0]() print(res) #输出:9 

li***个函数的返回值为9还不是0,记住:函数在没有执行前,内部代码不执行;博客里面的代码可以自己练练,加深下印象。服务器租用

IT科技类资讯
上一篇:4、注册门槛低
下一篇:用户邮箱的静态密码可能已被钓鱼和同一密码泄露。在没有收到安全警报的情况下,用户在适当的时间内不能更改密码。在此期间,攻击者可以随意输入帐户。启用辅助身份验证后,如果攻击者无法获取移动电话动态密码,他将无法进行身份验证。这样,除非用户的电子邮件密码和手机同时被盗,否则攻击者很难破解用户的邮箱。