如何写python中的if和else
可能重复:
Python中的三元条件运算符
我正在研究python并试图将数据保存到数据库中假设我有下面的代码
conn = mdb.connect(user='root', passwd='redhat', db='Data', host='localhost', charset="utf8")
ex_li = ['stri_one','stri_two','stri_three','stri_four']
if ex_li[0] != '':
campaignID = ex_li[0]
else:
campaignID = ''
if ex_li[1] != '':
keywordID = ex_li[1]
else:
keywordID = ''
.........
.......
try:
cursor = conn.cursor()
query = "insert into PerformaceReport(campaignID, keywordID, keyword, avgPosition,cost)"
query += "VALUES (%s, '%s', '%s', '%s')" %(campaignID, keywordID, keyword, avgPosition,cost)
cursor.execute( query )
conn.commit()
except Exception as e:
print e,"!!!! Exception happend!!!!"
在上面的代码中,我从列表中取出字符串,如果它们不等于空字符串,因为在切片过程中如果没有字符串,它将显示list index out of range
错误。
那么有什么方法可以将这些if和else语句写在一行中,并将其作为值直接提交给下面的内容(只是作为一个想法给出)
query += "VALUES (%s, '%s', '%s', '%s')" %(if ex_li[0] != '': campaignID = ex_li[0] else: campaignID = '' ............)
expression_if_true if condition else expression_if_false
所以试试
campaignID = main_res[0] if ex_li[0] != '' else ''
你可以使用这个SO答案中的三元表达式(v2.5)。 但是,我会建议:
names = ['campaignID', 'keywordID' ... ]
data = itertools.izip_longest(names, ex_li)
key_string = ','.join(data.keys())
query = '...(' + key_string + ')...( %s, %s, %s, %s )' #no % here
cursor.execute(query, data.values())
说明:
回答你在测试ex_li[0]
地方修改后的问题,然后分配它的值,如果你发现它,就没有必要检查空白并指定它,你可以这样做:
campaignID = ex_li[0]
然后,如果ex_li[0]
是''
,那么您将在campaignID
获得。 你提到了list index out of bounds
,但除非你的列表长度错误,否则这不会发生在更新后的代码中。
但是在更高层次上,您可以完全删除这些if语句:
(campaignID, keywordID, ...) = ex_li
这是元组拆包。 另外建立一个字典,这看起来更有用,因为你需要将ID同时作为数据和选择器:
names = ['campaignID', 'keywordID' ... ]
data = zip(names, ex_li)
# now have data = {'campaignID': ex_li[0], ... }
你可以适当地构建你的查询:
query = 'insert into Performance report (' + ','.join(data.keys()) + ') ' +
'values (' + ','.join("'"+elem+"'" for elem in data.values()) + ')'
一个细化可能是,如果你得到None
而不是空字符串(它将变成'None'
作为字符串),那么修改为zip读取的值:
data = zip(names, (elem or '' for elem in ex_li))
这应该给你空字符串,而不是'无'。
如果thg435是正确的,你有时会得到一个更短的名单,那么你可以压缩一些额外的''
:
data = zip(names, itertools.chain((elem or '' for elem in ex_li),
itertools.repeat('')))
这里的repeat
会给出一个无尽的''
列表,并且chain
将从ex_li获取元素,直到它耗尽,然后开始从repeat
获得''
。 zip
运行,直到一个或其他迭代用完,所以当它停止names
被耗尽。 或者,如果您希望单独处理None
值,则可以使用izip_longest
:
data = itertools.izip_longest(names, ex_li)
key_string = ','.join(data.keys())
value_string = ','.join("'"+str+"'" for str in
(elem or '' for elem in data.values()))
query = '...(' + key_string + ')....(' + value_string + ')...'
或者为了减轻可读性:
def quotify(str):
return "'"+str+"'"
但是,不要这样做。 在DB API中使用cursor.execute,而不是自己引用值,正如许多SO问题所证明的那样(例如,Python:获得转义的SQL字符串):
query = '...(' + key_string + ')...( %s, %s, %s, %s )' #no % here
cursor.execute(query, data.values())
这使得DB API可以正确地为您进行转义,防止注入攻击或事故。
你可以尝试如下所示:
value_when_true if condition else value_when_false
链接地址: http://www.djcxy.com/p/7403.html