在 python 3 中使用 map 和 lambdas,为啥这段代码不会更新 sql 表

Posted

技术标签:

【中文标题】在 python 3 中使用 map 和 lambdas,为啥这段代码不会更新 sql 表【英文标题】:using map and lambdas in python 3, why this code wont update sql tabel在 python 3 中使用 map 和 lambdas,为什么这段代码不会更新 sql 表 【发布时间】:2022-01-22 11:17:48 【问题描述】:

此脚本的目的是学习如何将 lambda 函数与 ma​​p 一起使用。 我尝试向 sqlite TABEL 的所有列插入一个字符串,但没有显示错误,但值没有改变。

def get_columns(self):
    res=self.get_cursor().execute("SELECT * FROM EVENTS")
    names = list(map(lambda x: x[0], res.description))
    return names`


def update_to_last(self,column:str,data:str):
    c=self.get_cursor()
    print(column,data)
    c.execute(f"UPDATE EVENTS SET 'column'='data' WHERE ID ='(SELECT last_insert_rowid())'")
    self.conn.commit()

if __name__ =="__main__":
    d=DB()
    columns=d.get_columns()

    #this pile of map and lambda's ment to first get all of the columns names
    #then add to every string a pair of some fictionary "data" to a list
    #then the list is sent to update
    map(lambda x:d.update_to_last(x[0],x[1]),(list(map(lambda column:[column,"data"],columns))))

【问题讨论】:

不要使用 map 产生副作用。这是令人困惑和不习惯的。只需使用常规的 for 循环即可。 【参考方案1】:

你的意思是这样的吗? (相应地更改列名id

c.execute(f"UPDATE EVENTS SET 'column'='data' WHERE id = (SELECT last_insert_rowid())")

【讨论】:

opp 想学习 map 和 lambda,你的回答对此有何帮助? 好吧,我认为问题在于 SQL 语句而不是 map 和 lambda 好吧,我补充说,谢谢,但仍然无法工作【参考方案2】:

map 不会创建结果列表。当您迭代 map 实例时,它会按需生成项目。您没有迭代 map 实例,因此 update_to_last 永远不会被调用任何东西。

不要使用map 来获得副作用。使用常规的for 循环。

# No need to turn the map instance into a list first; you
# can iterate over the map directly.
for x in map(lambda column: [column, "data"], columns):
    d.update_to_last(x[0], x[1])

当然,由于"data"x[1]的固定值,所以你根本不需要map

for column in columns;
    d.update_to_last(column, "data")

另一方面,如果d.update_to_last 产生了一个有趣的返回值,你想将它存储在一个列表中,你可能会这样做

from itertools import repeat
x = list(map(d.list_to_update, columns, repeat("data")))

虽然列表理解像

x = [d.list_to_update(c, "data") for c in columns]

会更好。

【讨论】:

谢谢,学到了很多东西,但理论上如果我将 map 投射到列表中,它会强制 map 屈服,直到达到迭代异常,对吗?如果是这样,那么它会为所有迭代调用 d.update_to_last(column, "data")? 是的,list 只是一次完成所有迭代以构建列表。使用map 之类的东西的要点是,如果您不需要一次内存中的所有项目,而只需要第一个,然后您可以在获得第二个之前将其丢弃,等等。您将使用恒定数量的内存,而不是线性数量。

以上是关于在 python 3 中使用 map 和 lambdas,为啥这段代码不会更新 sql 表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pyspark 中启用 csv 文件的多行读取

关于idea中使用lamb表达式报错:ambda expressions are not supported at this language level

I4-6 Present continuous Teacher: Lamb

艺术家模式邪恶整合

js中map和python中的map

如何TBB获得150%LAMB的质押挖矿收益?