欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python將字符串常量轉化為變量方法總結

系統 1608 0

前幾天,我們Python貓交流學習群 里的 M 同學提了個問題。這個問題挺有意思,經初次討論,我們認為它無解。

然而,我認為它很有價值,應該繼續思考怎么解決,所以就在私密的知識星球上記錄了下來。

萬萬沒想到的是,在第二天,有兩位同學接連給出了解決方法!

由此,群內出現了一輪熱烈的技術交流。

本文將相關的內容要點作了梳理,并由此引申到更進一步的學習話題,希望對你有所幫助。

1、如何動態生成變量名?

M 同學的問題如下:

打擾一下大家,請教一個問題,已知 list = ['A', 'B', 'C', 'D'] , 如何才能得到以 list 中元素命名的新列表 A = [], B = [], C = [], D = [] 呢?

簡單理解,這個問題的意思是,將字符串內容作為其它對象的變量名。

list 中的元素是字符串,此處的 ‘A'-‘D' 是常量 ,而在要求的結果中,A-D 是變量 。

如果強行直接將常量當做變量使用,它會報錯:

>>> 'A' = []
...SyntaxError: can't assign to literal

報錯中的literal 指的是字面量 ,這是計算機科學中常見的一個概念,用于表達源代碼中的固定值。 例如,整數、浮點數、字符串等基本類型,就是字面量。

字面量指的就是一個量本身,可以理解為一種原子性的實體,當然不能再被賦值了。

所以,取出的字符串內容,并不能直接用作變量名,需要另想辦法。

有初學者可能會想,list[0] = [] 行不行?當然不行,因為沒有出現 A 。那 A = list[0] ,接著 A = [] 呢?那也不行,因為這里的 A 是你憑空定義出來的,而不是從已有條件中生成的。

當時,群里只有兩三個同學參與了討論,我們沒想到解決辦法。但是,我覺得這個題目很有意思,值得玩味。

因為,如果能解決這個問題,那就意味著可以不作預先定義,而是動態地生成變量名,這不僅能減少給變量取名的麻煩,還實現了自動編碼!

可以設想一下未來,人工智能在編寫代碼的時候,如果能根據已知條件,動態生成變量名,那編寫代碼的過程不就順利多了么?(據說,現在已經有人工智能可以編寫代碼了,不知它在取變量名時,是用的什么方法?)

2、辦法總是有的

最近,學習群里蒙混進來了幾個打廣告的,為此,我決定提高審核門檻,例如,用群里的問題來作個考核。

萬萬沒想到的是,第一個被考核到的 Q 同學,幾乎不假思索地就說出了一個解決上述問題的思路。而偏偏就是那么巧 ,幾乎在同時,群內的 J 同學給出了另外一個解決方法(他沒看到群內的討論,而是看到了知識星球的記錄,才知道這個問題的)。

也就是說,前一晚還以為無解的問題,在第二天竟得到了兩種不同的解決方法!

那么,他們的答案是什么呢?

            
# J 同學的解答
>>> list1 = ['A', 'B', 'C', 'D']
>>> for i in list1:
>>> globals()[i] = []
>>> A
[]
          

這個方法通過修改全局命名空間,巧妙地“定義”出了新的變量。globals() 方法取出來的是一個字典,字符串 ‘A' 是其中一個鍵值(key),而這個鍵值恰恰是全局命名空間中的一個變量,這就實現了從常量到變量的轉化。

在數據結構層面上,空列表 [] 作為一個值(value)跟它的字符串鍵值綁定在一起,而在運用層面上,它作為變量內容而跟變量名綁定在一起。

看到這個回答的時候,我就突然想起來了,上個月轉載過一篇《Python 動態賦值的陷阱》,講的正是動態地進行變量賦值 的問題??!我似乎只關注了 globals() 與 locals() 用法的區別,卻沒有真正地掌握它們的原初用途。

J 同學說,他正是看了那篇文章,才學得了這個方法。這就有意思了,我分享了一個自己囫圇吞棗的知識,然后它被 J 同學吸收掌握,最后反饋回來解決了我的難題。

我真切地感受到了知識分享的魅力:知識在流動中獲得生命,在碰撞中锃亮色澤。

同時,我也真切地明白了一個互助的學習團體的好處:利人者也利己,互助者共同進步。

3、動態執行代碼的方法

新進群的 Q 同學,提供了一個不同的答案:

            
# Q 同學的解答
>>> list1 = ['A', 'B', 'C', 'D']
>>> for i in list1:
>>> exec(f"{i} = []")
>>> A
[]
          

他的寫法用到了 Python 3.6 才引入的 f-strings 特性,事實上,在較低版本中,也是可以實現的,只需要保證 exec() 方法接收的參數是包含了變量 i 的字符串即可,例如這樣寫:

            
# 以下代碼可替換上例的第 4 行
exec(i + " = []")
# 或者:
exec("{} = []".format(i))
# 或者:
exec(' '.join([i, '= []']))
          

這幾種寫法的區別只是字符串拼接法的區別,關于如何拼接字符串,以及不同方法之間的區別,可參看《詳解Python拼接字符串的七種方式》。

Q 同學這個答案的核心在于 exec() 方法,它是內置的,用途是執行儲存在字符串或文件中的代碼段。

它的基礎用法如下:

            
>>> exec('x = 1 + 2')
>>> x
3

# 執行代碼段
>>> s = """
>>> x = 10
>>> y = 20
>>> sum = x + y
>>> print(sum)
>>> """
>>> exec(s)
30
          

看完了 exec() 的用法,我們再回來看 Q 同學的答案。for-循環中取出來的 i 是字符串,而拼接后的字符串經過 exec() 的處理,就獲得了動態編寫代碼的效果。

也就是說,因為字符串常量的內容被當做有效代碼而執行了,其中的 'A'-'D' 元素,就取得了新的身份,變成了最終的 A-D 變量名。

這個方法看起來很簡單啊,可是由于 exec() 方法太生僻了,直到 Q 同學提出,我們才醒悟過來。

注意:在 Python3 中,exec() 是個內置方法;而在 Python2 中,exec 是個語句(statement),另外有個 execfile() 方法,兩者相合并,就成了 Python3 中的 exec() 方法。本文使用的是 Python3。

4、總結

抽象一下最初的問題,它實際問的是“如何將字符串內容作為其它對象的變量名”,更進一步地講是――“如何將常量轉化為變量 ”。

使用直接進行賦值的靜態方法,行不通。

兩位同學提出的方法都是間接的動態方法:一個是動態地進行變量賦值,通過修改命名空間而植入變量;一個是動態地執行代碼,可以說是通過“走后門”的方式,安插了變量。

兩種方法殊途同歸,不管是白貓還是黑貓,它們都抓到了老鼠。

這兩種方法已經給我們帶來了很有價值的啟發,同時,因為它們,群內小伙伴們更是發散地討論一些相關聯的話題,例如:S 同學提出了另一種修改命名空間中變量的寫法、L 同學提到了 eval() 的意義、eval() 與 exec() 的區別、我查到了為什么要慎用 eval() 、C 與 H 同學提到了 eval() 的安全用法……

雖然,某些話題無法在群聊中充分展開,但是,這些話題知識的延展聯系,大大地豐富了本文開頭的問題,這一個微小的問題,牽連出來了兩個大的知識體系。

最后,真得感謝群內的這些愛學習的優秀的同志們!除了文中提及的,還有一些同學也做了積極貢獻,大家都很給力!


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 色秀视频免费高清网站 | 久久国产精品久久 | 午夜精品老牛av一区二区三区 | 欧美激情第二页 | wwwwxxxx免费 | 亚洲va国产va | 亚洲精品国产成人无码区A片 | 欧美精品久久一区 | 99久久免费国产精品 | 日本特黄特色大片免费视频 | 国产色| 99久久精品费精品国产一区二区 | 天天做天天爱天天影视综合 | 免费一级毛片在线播放视频 | 日韩在线视频免费 | 五月色综合 | 免费一级毛片不卡不收费 | av在线成人 | 免费观看一级特黄欧美大片 | 91精品久久久久久综合五月天 | 瑟瑟网站免费网站入口 | 国产午夜精品理论片影院 | 成人伊人 | 成人激情视频在线观看 | 国产亚洲综合视频 | 婷婷影音 | 91久久夜色精品国产九色 | 国产成人激情视频 | 免费一区二区三区 | 中文字幕精品视频 | 一区在线免费观看 | 东京一热本色道久久爱 | 亚洲综合国产精品 | 在线观看国产免费高清不卡 | 欧美一级二级三级视频 | 涩涩屋av | 激情丁香六月 | 国产免费av大片 | 成人午夜视频免费 | 国产精品最新 | 窝窝午夜精品一区二区 |