欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實(shí)現(xiàn)將元組中的元素作為參數(shù)傳入函數(shù)的操作

 更新時(shí)間:2020年06月05日 11:20:42   作者:inter_peng  
這篇文章主要介紹了Python實(shí)現(xiàn)將元組中的元素作為參數(shù)傳入函數(shù)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

1. 需求:

現(xiàn)在有一個(gè)Python的需求需要實(shí)現(xiàn):

就是實(shí)現(xiàn)連接一次數(shù)據(jù)庫,就能夠執(zhí)行多條SQL語句,而且這個(gè)SQL語句是需要通過調(diào)用者將每一次執(zhí)行的參數(shù)傳入進(jìn)來,組合成一條完整的SQL語句再去執(zhí)行。

經(jīng)過初步研究,傳入?yún)?shù)時(shí),通過數(shù)組的形式,數(shù)組中的每一個(gè)元素則是一個(gè)元組tuple(因?yàn)镾QL中需要填入的參數(shù)可能是多個(gè),所以需要通過元組的形式傳入)。

比如SQL語句的形式為:

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

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

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

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

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

2. 函數(shù)實(shí)現(xiàn):

雖然看起來這個(gè)需求非常明確,也比較簡單。但是實(shí)現(xiàn)起來,還是花費(fèi)了我好長的時(shí)間。究其原因,主要的困惑就是如何能夠?qū)⑦@個(gè)參數(shù)傳入到SQL中,并且去執(zhí)行SQL。

2.1 思路一:

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

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語句已經(jīng)被執(zhí)行, 結(jié)果是:\n %s" % str(result))
  result_list.append(result)
 except Exception as e:
   logger.exception(u"執(zhí)行sql語句時(shí),發(fā)生了錯(cuò)誤: %s", e.message)
   raise
  finally:
   self._db_connection.close()
   return result_list

但是在執(zhí)行這個(gè)函數(shù)的時(shí)候,會報(bào)異常,異常說明是:tuple out of bounds.

以下是問題產(chǎn)生的原因:

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'傳入?yún)?shù)要求是列表類型,請檢查傳入?yún)?shù)類型!')
  result_list = []
  try:
   self._db_connection = self._db_connection_pool.connection()
   self._db_cursor = self._db_connection.cursor()

   for params in params_list:
    # 將每一個(gè)元組中存的參數(shù)傳入format中,替換sql中的變量值.
    # 如果數(shù)組中的元素不是元組,則sql中只有一個(gè)變量需要替換,將參數(shù)直接替換.
    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語句已經(jīng)被執(zhí)行, 結(jié)果是:\n %s" % str(result))
    if len(result) > 0:
     result_list.append(result)
  except Exception as e:
   logger.exception(u"執(zhí)行sql語句時(shí),發(fā)生了錯(cuò)誤: %s", e.message)
   raise
  finally:
   self._db_connection.close()
   return result_list

這段代碼中,最主要的修改就是關(guān)于處理參數(shù)的部分. 由于傳入的參數(shù)是一個(gè)數(shù)組,數(shù)組中的每一個(gè)元素是一個(gè)tuple, tuple內(nèi)的元素個(gè)數(shù)是由第2個(gè)參數(shù)sql中需要傳入的參數(shù)個(gè)數(shù)對應(yīng)的。

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

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

然后再調(diào)用db.execute, 便可以獲取到查詢結(jié)果.

補(bǔ)充知識:Python——利用元組作為函數(shù)返回值:輸出最值和個(gè)數(shù)

廢話不多說,看代碼!

# 利用元組作為函數(shù)返回值:輸出最值和個(gè)數(shù)
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實(shí)現(xiàn)將元組中的元素作為參數(shù)傳入函數(shù)的操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python餐飲AI機(jī)器人學(xué)習(xí)數(shù)據(jù)網(wǎng)絡(luò)抓取

    Python餐飲AI機(jī)器人學(xué)習(xí)數(shù)據(jù)網(wǎng)絡(luò)抓取

    在餐飲行業(yè),AI機(jī)器人可以通過學(xué)習(xí)大量的相關(guān)數(shù)據(jù)來提供更好的服務(wù)和體驗(yàn),在文本中,我們將介紹如何使用python進(jìn)行餐飲A?I機(jī)器人學(xué)習(xí)數(shù)據(jù)的網(wǎng)絡(luò)抓取,并提供代碼的示例和最佳實(shí)踐
    2023-12-12
  • python實(shí)現(xiàn)從pdf文件中提取文本,并自動翻譯的方法

    python實(shí)現(xiàn)從pdf文件中提取文本,并自動翻譯的方法

    今天小編就為大家分享一篇python實(shí)現(xiàn)從pdf文件中提取文本,并自動翻譯的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python中ValueError報(bào)錯(cuò)的原因和解決辦法

    Python中ValueError報(bào)錯(cuò)的原因和解決辦法

    在Python編程中,ValueError是一種非常常見的異常類型,它通常發(fā)生在函數(shù)接收到一個(gè)有效類型但不適合該函數(shù)操作的值時(shí),本文將深入探討ValueError的報(bào)錯(cuò)原因、提供詳細(xì)的解決辦法,并通過豐富的代碼示例來加深理解,需要的朋友可以參考下
    2024-07-07
  • Python中協(xié)程coroutine適用場景分析

    Python中協(xié)程coroutine適用場景分析

    多線程中可能出現(xiàn)多個(gè)線程爭搶變量,所以變量需要加鎖;協(xié)程中任一時(shí)刻都只有一個(gè)線程,所以變量不需要加鎖,這篇文章主要介紹了Python中協(xié)程(coroutine)詳解,需要的朋友可以參考下
    2024-04-04
  • Python循環(huán)語句For?Range用法示例詳解

    Python循環(huán)語句For?Range用法示例詳解

    這篇文章主要為大家介紹了Python循環(huán)語句For?Range用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Python項(xiàng)目管理工具Poetry使用示例詳解

    Python項(xiàng)目管理工具Poetry使用示例詳解

    這篇文章主要為大家介紹了Python項(xiàng)目管理工具Poetry使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 10張動圖學(xué)會python循環(huán)與遞歸問題

    10張動圖學(xué)會python循環(huán)與遞歸問題

    今天為大家整理了十張動圖GIFS,有助于認(rèn)識循環(huán)、遞歸、二分檢索等概念的具體運(yùn)行情況。代碼實(shí)例以Python語言編寫,非常不錯(cuò),感興趣的朋友跟隨小編一起學(xué)習(xí)吧
    2021-02-02
  • Python 如何獲取目錄下的文件列表,并自然排序

    Python 如何獲取目錄下的文件列表,并自然排序

    這篇文章主要介紹了Python 如何獲取目錄下的文件列表,并自然排序的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Pytorch如何切換 cpu和gpu的使用詳解

    Pytorch如何切換 cpu和gpu的使用詳解

    這篇文章主要介紹了Pytorch如何切換 cpu和gpu的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • python模擬預(yù)測一下新型冠狀病毒肺炎的數(shù)據(jù)

    python模擬預(yù)測一下新型冠狀病毒肺炎的數(shù)據(jù)

    這篇文章主要介紹了python模擬預(yù)測一下新型冠狀病毒肺炎的數(shù)據(jù) ,需要的朋友可以參考下
    2020-02-02

最新評論