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