一些令你""呵呵''的题目

Posted wcx666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一些令你""呵呵''的题目相关的知识,希望对你有一定的参考价值。

1.下面题目的打印结果是:__________

lst1 = [lambda x:i+x for i in range(5)]
lst2=[el(2) for el in lst1]
print(lst2)

(1) 将面目全非的题目进行还原得到如下形态:

lst1=[]
lst2=[]
for i in range(5):
    def func(x):
        return i+x                        
    lst1.append(func)
print(lst1)
for el in lst1:
    lst2.append(el(2))
print(lst2)

基本能看出第一次循环创建了5个函数,然后将函数的内存地址存到列表里,lst1的打印结果是一堆内存地址,此时在第一部分它形成一个闭包这个看的不舒服,将第一部分换个形态

def func1():
    for i in range(5):
        def func(x):
            return i + x
        lst1.append(func)
    return lst1
func1()

这就可以看出是个典型的闭包,来回忆下闭包的内容,重新认识下这个东西:

闭包的两个特性:

  • 内部函数使用外部函数的变量(不对外部函数的变量进行重新赋值)
  • 外部函数 return 内部函数的函数名(其实是返回内部函数的内存地址)

对上面的函数进行简化,去掉for循环,使用单个变量代替,直接返回内部函数名

def func1():
    i=4                        # 定义了变量,也称为内部函数的环境变量,它不会改变,不被外界影响
    def func(x):
        return i + x           # 使用了外部函数的变量
    return func                # 返回了内部函数
func1()

简单理解:闭包 = 内部函数 + 环境变量

闭包的特性:当内部函数返回的时候,会把连同内部函数定义时候的环境变量一同返回

(2)在进行第二部分调用内部函数

 在lst1中的元素是5个这个函数的函数内存地址,但是调用时候,此时i=4,分别调用一次函数.结果就是[6,6,6,6,6]

 

以上是关于一些令你""呵呵''的题目的主要内容,如果未能解决你的问题,请参考以下文章

绕过login登陆到网站后台

在notepad中匹配alt=\"这里的文字不一样\"的正则表达式,高手请指点下,呵呵,谢谢了

呵呵,请教下jquery easyui 中怎么刷新现在的tab页啊

关于HTML5如何自定义属性

excel中同一个sheet下有两列相同的表头,如何合为一列

java的equals有时候比较不了"'NULL'",怎么回事?