小知识:pyhon的作用域

http://www.cnblogs.com/wupeiqi/p/5649402.html   

五句话搞定JavaScript作用域 


从JavaScript  == pyhon 作用域几乎一致 __ 详解:

一、“JavaScript中无块级作用域”

在Java或C#中存在块级作用域,即:大括号也是一个作用域。
    
在python \ JavaScript语言中无块级作用域.


# 作用域
# python 无块级别作用域。
# java/c#
不可以生效。
if 1==1:
name='alex'
print(name) #生效.alex

for i in range(10):
name=i
print(name) #9


# python 以函数为作用域。
def func():
name='alex' #name只在代码块中可以引用。
func()
print(name) #不能使用输出,报错。

二、python \JavaScript采用函数作用域

    当执行console.log(xo)时,其寻找顺序为根据作用域链从内到外的优先级寻找,
    如果内层没有就逐步向上找,直到没找到抛出异常。



四、python \JavaScript的作用域链执行前已创建

 python 的作用域在被执行之前已经创建,日后再去执行时只需要按照作用域链去寻找即可。

 

# 作用域链
# python
作用域在执行前已经确定好。在 所在的作用域,往上找

#例子1
name='alex'
def f1():
print(name)
def f2():
name='eric'
f1()

f2()
#执行结果:
#alex



例子2

#原理:但凡是用到了哪个函数,比如f1(),就会从f1()自己的函数往上找。跟你在函数执行放在哪里一点关系都没有。
name='alex'
def f1(): #f1所在的作用域,往上找。
print(name)

def f2():
name='eric' #内部作用域
return f1

ret
=f2()
# print(ret)
ret()

#结果
# <function f1 at 0x0000026C7D81DF28>
# alex


 

新浪面试题:


# 例子3 进阶.

li=[x+100 for x in range(10) if x >6 ]
print(li)

#执行结果:
# [107, 108, 109]

# 新浪面试题:
# lambda 为元素的列表 li=[函数,函数,函数, ]

li1=[lambda :x for x in range(4)] #li 列表中的元素,【函数,函数,函数】,
li2=[lambda :1]
li3
=[x for x in range(10)]
print(lambda :9)

print(li1[0]) #生成一个函数名,并没有执行。

ret=li1[0]()
print(ret)

print(li2[0]())

print(li3)

###########
print([lambda :9,][0]()) #根据内容——自己进行定义的lambda()执行函数。

#执行结果:
# <function <listcomp>.<lambda> at 0x00000263D1CA80D0>
# 3
# 1
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 9





























posted @ 2016-07-16 08:13  Ju-do-it  阅读(1033)  评论(0编辑  收藏  举报