簡體   English   中英

函數每次運行不會返回相同的結果

[英]Function not returning same result on each run

我正在嘗試用HTML實體替換特殊字符,但是在相同的輸入下結果是隨機的,我不明白為什么。

這是代碼:

def secure(text):
    hsconvert = {"\'": "\\'", "\"": "\\\"", "¢": "&cent;", "©": "&copy;", "÷": "&divide;", ">": "&gt;", "<": "&lt;", "µ": "&micro;", "·": "&middot;", "¶": "&para;", "±": "&plusmn;", "€": "&euro;", "£": "&pound;", "®": "&reg;", "§": "&sect;", "™": "&trade;", "¥": "&yen;", "á": "&aacute;", "Á": "&Aacute;", "à": "&agrave;", "À": "&Agrave;", "â": "&acirc;", "Â": "&Acirc;", "å": "&aring;", "Å": "&Aring;", "ã": "&atilde;", "Ã": "&Atilde;", "ä": "&auml;", "Ä": "&Auml;", "æ": "&aelig;", "Æ": "&AElig;", "ç": "&ccedil;", "Ç": "&Ccedil;", "é": "&eacute;", "É": "&Eacute;", "è": "&egrave;", "È": "&Egrave;", "ê": "&ecirc;", "Ê": "&Ecirc;", "ë": "&euml;", "Ë": "&Euml;", "í": "&iacute;", "Í": "&Iacute;", "ì": "&igrave;", "Ì": "&Igrave;", "î": "&icirc;", "Î": "&Icirc;", "ï": "&iuml;", "Ï": "&Iuml;", "ñ": "&ntilde;", "Ñ": "&Ntilde;", "ó": "&oacute;", "Ó": "&Oacute;", "ò": "&ograve;", "Ò": "&Ograve;", "ô": "&ocirc;", "Ô": "&Ocirc;", "ø": "&oslash;", "Ø": "&Oslash;", "õ": "&otilde;", "Õ": "&Otilde;", "ö": "&ouml;", "Ö": "&Ouml;", "ß": "&szlig;", "ú": "&uacute;", "Ú": "&Uacute;", "ù": "&ugrave;", "Ù": "&Ugrave;", "û": "&ucirc;", "Û": "&Ucirc;", "ü": "&uuml;", "Ü": "&Uuml;", "ÿ": "&yuml;", "\\":"\\\\"};
    for i, j in hsconvert.items():
        text = text.replace(i, j)
        return text

print(secure("La Vie d'Adèle, chapitres 1 & 2"))

這是控制台輸出:

>>> ================================ RESTART ================================
>>> 
La Vie d\'Ad&egrave;le, chapitres 1 & 2
['TV Movie', 'Video Game', 'TV Episode', 'TV Series', 'TV Series ', 'Short', 'TV Mini-Series']
>>> ================================ RESTART ================================
>>> 
La Vie d\\'Ad&egrave;le, chapitres 1 & 2
['TV Movie', 'Video Game', 'TV Episode', 'TV Series', 'TV Series ', 'Short', 'TV Mini-Series']

問題在於'字符,有時返回為\\' ,有時返回為\\\\'

我認為它來自字典中的最后一項, "\\\\":"\\\\\\\\"但我不明白為什么每次運行都不能對它進行相同的解釋。

正如您在答案中推測的那樣,問題在於字典上的迭代沒有定義的順序。

Python 3文檔中

在字典上執行list(d.keys())會以任意順序返回字典中使用的所有鍵的列表(如果要對其進行排序,請改用sorted(d.keys()))。

它沒有明確說明,但是對items()也是一樣。

在這種情況下看到迭代之間的順序變化時,我感到有些驚訝,但是在這種情況下,任意表示意味着未定義-任何順序在技術上都是有效的。 如果您想要一致的結果,建議您重新設計算法,使其完全不影響項目的排序; 否則,首先對輸出進行排序或使用OrderedDict至少可以解決一致性問題。

我修改了如下功能,它正在工作:

def secure(text):
    text.replace("\\", "\\\\")
    hsconvert = {"\'": "\\'", "\"": "\\\"", "¢": "&cent;", "©": "&copy;", "÷": "&divide;", ">": "&gt;", "<": "&lt;", "µ": "&micro;", "·": "&middot;", "¶": "&para;", "±": "&plusmn;", "€": "&euro;", "£": "&pound;", "®": "&reg;", "§": "&sect;", "™": "&trade;", "¥": "&yen;", "á": "&aacute;", "Á": "&Aacute;", "à": "&agrave;", "À": "&Agrave;", "â": "&acirc;", "Â": "&Acirc;", "å": "&aring;", "Å": "&Aring;", "ã": "&atilde;", "Ã": "&Atilde;", "ä": "&auml;", "Ä": "&Auml;", "æ": "&aelig;", "Æ": "&AElig;", "ç": "&ccedil;", "Ç": "&Ccedil;", "é": "&eacute;", "É": "&Eacute;", "è": "&egrave;", "È": "&Egrave;", "ê": "&ecirc;", "Ê": "&Ecirc;", "ë": "&euml;", "Ë": "&Euml;", "í": "&iacute;", "Í": "&Iacute;", "ì": "&igrave;", "Ì": "&Igrave;", "î": "&icirc;", "Î": "&Icirc;", "ï": "&iuml;", "Ï": "&Iuml;", "ñ": "&ntilde;", "Ñ": "&Ntilde;", "ó": "&oacute;", "Ó": "&Oacute;", "ò": "&ograve;", "Ò": "&Ograve;", "ô": "&ocirc;", "Ô": "&Ocirc;", "ø": "&oslash;", "Ø": "&Oslash;", "õ": "&otilde;", "Õ": "&Otilde;", "ö": "&ouml;", "Ö": "&Ouml;", "ß": "&szlig;", "ú": "&uacute;", "Ú": "&Uacute;", "ù": "&ugrave;", "Ù": "&Ugrave;", "û": "&ucirc;", "Û": "&Ucirc;", "ü": "&uuml;", "Ü": "&Uuml;", "ÿ": "&yuml;"};
    for i, j in hsconvert.items():
        text = text.replace(i, j)
    return text

但我不明白為什么舊功能不起作用... x中的A ...並不總是相同的順序?

有時候,你的代碼替換\\\\\\\\\\\\第一,然后\\'\\\\' 有時它反過來做。

示例(使用“ \\'”作為輸入):

如果首先執行\\\\ -> \\\\\\\\ ,然后執行\\' -> \\\\' ,則在第一次嘗試替換后會得到\\' (因為沒有\\\\ ,所以什么也不會發生),然后是\\\\'在第二次之后。

但是如果以相反的方式進行操作,則在第一個之后得到\\\\' ,然后在第二個中將\\\\替換為\\\\\\\\ ,因此最終得到\\\\\\\\'

發生這種情況是因為hsconvert是一個字典,因此它不是有序的,並且遍歷它( for循環)不一定每次都以相同的方式發生。

解決該問題的方法很好,但是為了將來參考, collections模塊中有一個OrderedDict

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM