当前位置: 首页 > 科技观察

学好Python的这五点,获得范围

时间:2023-03-14 17:45:01 科技观察

1。块级作用域想想这时候运行下面的程序,会不会有输出?执行会成功吗?#block-levelscopeif1==1:name="lzl"print(name)foriinrange(10):age=iprint(age)先看执行结果:C:/Users/L/PycharmProjects/s14/preview/Day8/scope/main.pylzl9Processfinishedwithexitcode0code执行成功,没问题;在Java/C#中,执行上面的代码会提示name和age没有定义,但是在Python中可以执行成功,因为Python中没有块级作用域,代码块变量可以被外部调用,所以它们可以成功运行;2.局部范围复习之前学过的知识。当我们学习函数时,函数是一个单独的作用域。Python中没有块级作用域,但是有局部作用域;看看下面的代码#localscopedeffunc():name="lzl"print(name)运行这段代码,想想会不会有输出?Traceback(mostrecentcalllast):File"C:/Users/L/PycharmProjects/s14/preview/Day8/scope/main.py",line23,inprint(name)NameError:name'name'isnotdefined运行错误,我相信大家都能理解这一点,name变量只在func()函数内部生效,所以不能全局调用;对上面的代码做一个简单的调整,然后看看效果?#localscopedeffunc():name="lzl"func()#executefunctionprint(name)在之前的代码基础上增加了一行代码。在打印变量名之前,函数被执行。这个时候印刷会不会有变化?回溯(mostrecentcallast):文件“C:/Users/L/PycharmProjects/s14/preview/Day8/scope/main.py”,line23,inprint(name)NameError:name'n执行ame'isnotdefined还是报错,还是回到刚才那句话:即使执行了函数,name的作用域也只是在函数内部,外部无法调用;记住前两个知识点,然后开始放大招3.将作用域链调整到函数上,看看下面的代码是如何执行的。#scopechainname="lzl"deff1():name="Eric"deff2():name="Snor"print(name)f2()f1()学过函数,必须知道***f1()执行后会输出Snor;先记住一个概念,Python中有一个作用域链,变量会从内到外查找。先去自己的scope找,不找上级找,直到找不到报错4.***版的scope不错,够用了铺平道路。***版本来了~~#***版本Scopename="lzl"deff1():print(name)deff2():name="eric"f1()f2()想想执行结果是否***f2()打印“lzl”还是打印“eric”?记住你的答案,现在不贴答案,先看下面的代码:#***versionscopename="lzl"deff1():print(name)deff2():name="eric"returnf1ret=f2()ret()#输出:lzl的执行结果为"lzl",分析上面的代码,f2()的执行结果就是内存地址函数f1的,即ret=f1;执行ret()相当于执行f1(),执行f1()时,与f2()无关,name="lzl"和f1()是在同一个作用域链中。如果函数内部没有变量,它会往外看,所以此时的变量名值为"lzl";明白了这个,就知道没写的***代码的答案了刚才不给答案#***versionscopename="lzl"deff1():print(name)deff2():name="eric"f1()f2()#Output:lzl是的,输出是“lzl”。记住呃在函数执行之前,作用域已经形成,作用域链也已经生成。5.新浪面试题li=[lambda:xforxinrange(10)]判断li的类型?li中的元素类型是什么?print(type(li))print(type(li[0]))##可以看到li是一个列表类型,列表中的元素是函数。然后打印列表中第一个元素的返回值。此时的返回值是多少?#lambada面试题li=[lambda:xforxinrange(10)]res=li[0]()print(res)#输出:9li***函数的返回值为9,不是0。记住:之前函数执行完毕,内部代码未执行;博客中的代码可以自己实践加深印象。