亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將 f-string 與變量一起使用,而不是與字符串文字一起使用?

如何將 f-string 與變量一起使用,而不是與字符串文字一起使用?

達令說 2021-10-19 16:58:13
我想將 f-string 與我的字符串變量一起使用,而不是使用字符串文字定義的字符串,"...".這是我的代碼:name=["deep","mahesh","nirbhay"]user_input = r"certi_{element}" # this string I ask from user  for element in name:    print(f"{user_input}")此代碼提供輸出:certi_{element}certi_{element}certi_{element}但我想要:certi_{deep}certi_{mahesh}certi_{nirbhay}我怎樣才能做到這一點?
查看完整描述

3 回答

?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

f"..."將表達式結果插入到文字中時,字符串非常有用,但是您沒有文字,而是在單獨的變量中有一個模板字符串。


您可以使用str.format()將值應用于該模板:


name=["deep","mahesh","nirbhay"]

user_input = "certi_{element}" # this string i ask from user  


for value in name:

    print(user_input.format(element=value))

使用名稱(例如{element})的字符串格式化占位符不是變量。您可以為str.format()調用的關鍵字參數中的每個名稱分配一個值。在上面的示例中,element=value傳入value變量的值以使用element.


與f-strings不同,{...}占位符不是表達式,您不能在模板中使用任意 Python 表達式。這是一件好事,您不希望最終用戶能夠在您的程序中執行任意 Python 代碼。有關詳細信息,請參閱格式字符串語法文檔。


您可以傳入任意數量的名稱;字符串模板不具有使用其中任何一個。如果你把str.format()與**mapping調用約定,你可以使用任何字典作為價值的源泉:


template_values = {

    'name': 'Ford Prefect',

    'number': 42,

    'company': 'Sirius Cybernetics Corporation',

    'element': 'Improbability Drive',

}


print(user_input.format(**template_values)

以上將允許用戶使用template_values他們模板中的任何名稱,他們喜歡的次數不限。


雖然您可以使用locals()和globals()生成將變量名稱映射到值的字典,但我不推薦這種方法。使用像上面這樣的專用命名空間來限制可用的名稱,并為您的最終用戶記錄這些名稱。


查看完整回答
反對 回復 2021-10-19
?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

如果你定義:


def fstr(template):

    return eval(f"f'{template}'")

然后你可以這樣做:


name=["deep","mahesh","nirbhay"]

user_input = r"certi_{element}" # this string i ask from user  


for element in name:

    print(fstr(user_input))

作為輸出給出:


certi_deep

certi_mahesh

certi_nirbhay

但請注意,用戶可以在模板中使用表達式,例如:


import os  # assume you have used os somewhere

user_input = r"certi_{os.environ}"


for element in name:

    print(fstr(user_input))

你絕對不想要這個!


因此,更安全的選擇是定義:


def fstr(template, **kwargs):

    return eval(f"f'{template}'", kwargs)

任意代碼不再可能,但用戶仍然可以使用字符串表達式,例如:


user_input = r"certi_{element.upper()*2}"


for element in name:

    print(fstr(user_input, element=element))

作為輸出給出:


certi_DEEPDEEP

certi_MAHESHMAHESH

certi_NIRBHAYNIRBHAY

在某些情況下這可能是需要的。


查看完整回答
反對 回復 2021-10-19
?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

如果您希望用戶能夠訪問您的命名空間,您可以這樣做,但后果完全由您承擔。除了使用 f-strings,您還可以使用該format方法以非常相似的語法進行動態插值。


如果您希望用戶只能訪問少數特定變量,您可以執行以下操作


name=["deep", "mahesh", "nirbhay"]

user_input = "certi_{element}" # this string i ask from user  


for element in name:

    my_str = user_input.format(element=element)

    print(f"{my_str}")

您當然可以重命名用戶輸入的鍵與您使用的變量名稱:


my_str = user_input.format(element=some_other_variable)

你可以讓用戶訪問你的整個命名空間(或至少大部分)。請不要這樣做,但請注意,您可以:


my_str = user_input.format(**locals(), **globals())

我使用print(f'{my_str}')而不是的原因print(my_str)是為了避免文字大括號被視為進一步的錯誤擴展的情況。例如,user_input = 'certi_{{{element}}}'


查看完整回答
反對 回復 2021-10-19
  • 3 回答
  • 0 關注
  • 251 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號