在 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 函数与 map 一起使用。 我尝试向 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 表的主要内容,如果未能解决你的问题,请参考以下文章
关于idea中使用lamb表达式报错:ambda expressions are not supported at this language level