中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何實現將元組中的元素作為參數傳入函數

發布時間:2020-07-18 10:44:47 來源:億速云 閱讀:183 作者:小豬 欄目:開發技術

這篇文章主要為大家展示了Python如何實現將元組中的元素作為參數傳入函數,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。

本文由Markdown語法編輯器編輯完成。

1. 需求:

現在有一個Python的需求需要實現:

就是實現連接一次數據庫,就能夠執行多條SQL語句,而且這個SQL語句是需要通過調用者將每一次執行的參數傳入進來,組合成一條完整的SQL語句再去執行。

經過初步研究,傳入參數時,通過數組的形式,數組中的每一個元素則是一個元組tuple(因為SQL中需要填入的參數可能是多個,所以需要通過元組的形式傳入)。

比如SQL語句的形式為:

basic_sql = ‘SELECT * FROM series se where se.body_part like “%{}%” and se.modality = “{}”'

在這條SQL中,有兩個變量需要傳入,分別用{}表示,一個是序列的body_part, 一個是序列的modality。準備傳入的參數為:

[(‘Chest', ‘CT'), (‘Lung', ‘MRI'), (‘Leg', ‘DR')]等。

希望通過以下的格式化函數,將參數傳入:

SELECT * FROM series se where se.body_part like “%{}%” and se.modality = “{}”.format(param1, param2) 這樣。

2. 函數實現:

雖然看起來這個需求非常明確,也比較簡單。但是實現起來,還是花費了我好長的時間。究其原因,主要的困惑就是如何能夠將這個參數傳入到SQL中,并且去執行SQL。

2.1 思路一:

在基于需求中提到的那個解決思路,我希望是拼接字符串,將拼接后的整個字符串作為完整的SQL語句,然后執行生成結果。

def execute_multi_sql(self, sql, params_list):
 result_list = []
  try:
   self._db_connection = self._db_connection_pool.connection()
   self._db_cursor = self._db_connection.cursor()
 for params in params_list:
  combined_sql = []
  combined_sql.append(sql)
  combined_sql.append('.format(')
  combined_sql.append(','.join(map(str, params)))
  combined_sql.append(')')
  combined_sql = ''.join(combined_sql)
  logger.debug("executing sql: %s" % combined_sql)
  self._db_cursor.execute(combined_sql)
  result = self._db_cursor.fetchall()
  logger.debug(u"SQL語句已經被執行, 結果是:\n %s" % str(result))
  result_list.append(result)
 except Exception as e:
   logger.exception(u"執行sql語句時,發生了錯誤: %s", e.message)
   raise
  finally:
   self._db_connection.close()
   return result_list

但是在執行這個函數的時候,會報異常,異常說明是:tuple out of bounds.

以下是問題產生的原因:

2.2 思路二:

通過google搜索,最終找到的解決方案是如下鏈接所示:

expanding tuples into arguments.

https://stackoverflow.com/questions/1993727/expanding-tuples-into-arguments

from DBUtils.PooledDB import PooledDB
import logging
......

 def execute_multi(self, sql, params_list):
  if not isinstance(params_list, list):
   raise Exception(u'傳入參數要求是列表類型,請檢查傳入參數類型!')
  result_list = []
  try:
   self._db_connection = self._db_connection_pool.connection()
   self._db_cursor = self._db_connection.cursor()

   for params in params_list:
    # 將每一個元組中存的參數傳入format中,替換sql中的變量值.
    # 如果數組中的元素不是元組,則sql中只有一個變量需要替換,將參數直接替換.
    if isinstance(params, tuple):
     combined_sql = sql.format(*params)
    else:
     combined_sql = sql.format(params)

    logger.debug("executing sql: %s" % combined_sql)
    self._db_cursor.execute(combined_sql)
    result = self._db_cursor.fetchall()
    logger.debug(u"SQL語句已經被執行, 結果是:\n %s" % str(result))
    if len(result) > 0:
     result_list.append(result)
  except Exception as e:
   logger.exception(u"執行sql語句時,發生了錯誤: %s", e.message)
   raise
  finally:
   self._db_connection.close()
   return result_list

這段代碼中,最主要的修改就是關于處理參數的部分. 由于傳入的參數是一個數組,數組中的每一個元素是一個tuple, tuple內的元素個數是由第2個參數sql中需要傳入的參數個數對應的。

如上述需求中提到的,傳入的sql中需要補充兩個參數值,分別是body_part和modality, 因此數組中每一個tuple的長度也是2.

這樣通過*tuple的方式,可以依次取出tuple中的每一個元素作為變量,傳入前面的sql語句中,組成一個完整的sql語句。

然后再調用db.execute, 便可以獲取到查詢結果.

補充知識:Python——利用元組作為函數返回值:輸出最值和個數

廢話不多說,看代碼!

# 利用元組作為函數返回值:輸出最值和個數
def yuanzu(*xxx):
  i = max(xxx)
  j = min(xxx)
  print("最大值是%s" % i)
  print("最小值是%s" % j)
  l = len(xxx)
  print("長度是{0}".format(l))

yuanzu(1,2,5,6,5)

以上就是關于Python如何實現將元組中的元素作為參數傳入函數的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

色达县| 根河市| 昭苏县| 满城县| 峨眉山市| 剑阁县| 梓潼县| 东港市| 甘孜县| 左权县| 普定县| 宁陕县| 黑河市| 大埔县| 水城县| 开阳县| 大英县| 全州县| 汝阳县| 虎林市| 凌源市| 临泽县| 克拉玛依市| 如皋市| 涿州市| 新民市| 龙州县| 余姚市| 丽江市| 方城县| 都兰县| 潮安县| 巍山| 黄山市| 峨边| 宝应县| 黄大仙区| 万宁市| 西乡县| 安泽县| 黎平县|