python匿名函数里用for_请问这段Python代码如何用匿名函数简化?
展開全部
樓主你5261好!
要解決這道題目并不難,4102只需要理解匿名lambda是如何使用的便可;
“lambda 表達式16531:表達式2”其實就是定義了一個函數,傳入表達式1的參數,按表達式2的形式返回,因此,該語句也就返回了一個函數對象,請看如下代碼:def demo(x):
return x*x
lambda_demo = lambda x:x*x
以上代碼中demo函數和lambda_demo是等效的,都是可以調用的對象,傳入一個參數,返回這個參數的平方。
那這題就不難解了,其實做的事情就是定義了兩層:
1)第一層函數是傳入一個參數,返回第二層定義的函數對象
2)第二層是不傳入參數,返回第一層參數的平方
套用lambda的定義,便不難解出正確答案:# -*- coding: utf-8 -*-
def count():
'''這是原函數'''
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i))
return fs
def edited_count():
'''這是修改后的函數'''
fs= []
for i in range(1, 4):
fs.append((lambda x:(lambda :x*x))(i))
return fs
def evol_count():
'''更加pythonic的寫法'''
return [(lambda x:(lambda :x*x))(i) for i in range(1,4)]
'''一行式寫法'''
one_line_count = lambda :[(lambda x:(lambda :x*x))(i) for i in range(1,4)]
再分析一下樓主兩段錯誤代碼:
第一段的報錯原因在于,樓主混淆了變量的有效空間,lambda中的變量只是形式,并不會對外部變量進行錄入,所以在f函數中傳入的j,并不會記錄在lambda中,因此,在最后執行的時候,列表中的三個函數是第一段代碼段中的demo函數,需要樓主傳入一個參數,再返回你傳入參數的平方。
第二段代碼看代碼邏輯應該是正確的,這個修改發生了什么呢?其實你定義的lambda函數形式變成了這樣:def demo(x=1):
return x*x
也就是變相的把變量的值給定義了,出錯的原因應該是你在調用的時候很可能是以這樣的形式調用:count()() 才導致了報錯。
希望樓主能夠深入理解lambda以及python的命名空間,今后遇到這樣的題目便能迎刃而解了。
望采納,謝謝!~
總結
以上是生活随笔為你收集整理的python匿名函数里用for_请问这段Python代码如何用匿名函数简化?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蜂鸟开发板 linux,蜂鸟E203系列
- 下一篇: select默认选中的option_ma