最近用python做了一些微小的工作,跟pymysql库打了些交道,其中大概是由于自身的强迫症,踩了一些坑。坑并不大,但是爬坑的过程还是挺有意思的,总结如下。
pymysql最基本的用法就是当作python内的一个sql解释器
import pymysql
db = pymysql.connect("localhost", "root", "", "adt", charset="utf8")
cursor = db.cursor()
rand_query_sql = 'SELECT plan_id FROM plan ORDER BY rand() LIMIT 5'
cursor.execute(rand_query_sql)
results = cursor.fetchall()
print(results)
==============================================
((44141,), (70441,), (12831,), (81769,), (67917,))
无论sql语句中select了多少列,cursor.fetchall()的结果都是一个二维数组,当需要对结果进行遍历时就要写成这个样子:
for item in results:
print(item[0])
问题就是,如果这个结果需要用到多次,那就要写多个“item[0]”,或者额外写一句 “res = item[0]”,看起来都不那么舒服。这时我首先想到的一个改进是这样的:
for item in [x[0] for x in results]:
print(item)
这个方法除了简洁性仍值得吐槽之外,如果python解释器优化的不够,这个列表实际上要被多遍历一遍(这里我没研究过究竟会被怎样执行),所以也不够好。
下面这种写法是我最终在用的:
for [item] in results:
print(item)
完美符合要求,更令人愉悦的是,这种写法在结果有多列的情形下同样适用:
rand_query_sql = 'SELECT plan_id, qty FROM plan ORDER BY rand() LIMIT 5'
cursor.execute(rand_query_sql)
results = cursor.fetchall()
print(results)
for [id, qty] in results:
print(id, qty)
==============================================
43133 1
28841 57
107889 763
9272 71
13543 292
多个等长列表共同遍历是另一个经常碰到的场景:
for i in range(len(trainX0)):
model.fit([trainX0[i], trainX1[i]], trainY[i], epochs=10)
用到了打包函数,改进后的写法:
for [x0, x1, y] in zip(trainX0, trainX1, trainY):
model.fit([x0, x1], y, epochs=10)
感觉自己对“人生苦短,我用python”这句话有了更深的理解 : )
网友评论