今天老師布置了一個(gè)作業(yè),很簡(jiǎn)單的幾行代碼。但是也算讓我徹底知道了Python中的eval這個(gè)函數(shù)了,因?yàn)橹皩W(xué)過一點(diǎn)Python,以為自己已經(jīng)知道了eval函數(shù)的用法(還以為這是用來自動(dòng)識(shí)別輸入類型,可以用來輸入字典)
結(jié)果啪啪打臉了。嗚嗚嗚。。。
首先明確一下eval的用法:
value=eval(<字符串>)
讀取字符串參數(shù)的內(nèi)容
1.如果該字符串的內(nèi)容為包含運(yùn)算符的python表達(dá)式,則計(jì)算該表達(dá)式并返回結(jié)果。
2.若該字符串參數(shù)的內(nèi)容為變量,則返回該變量的值。
3.若該字符串的內(nèi)容為常量,則返回該常量。
題目如下:
在Python窗口界面的shell window執(zhí)行下列代碼,觀察輸出結(jié)果,掌握**eval()**函數(shù)的使用方法。(沒辦法老師要求用shell)
>>> s = '3**3**2’
>>> s1 = 's’
>>> s1
>>> print(s1)
>>> print(eval(s1))
>>> print(eval(eval(s1)))
PS:這是老師在word里面打出來的,所以就是這個(gè)樣子啦.
(<<<也是老師自己打出來的)
我一開始看見了eval(eval()),確實(shí)人都有點(diǎn)傻了,很是奇怪,反應(yīng)了一會(huì)才反應(yīng)過來。
首先我們所以知道的eval函數(shù)的返回值是返回表達(dá)式的計(jì)算結(jié)果
那么現(xiàn)在我們先明白這些變量的值
s='3 ** 3 ** 2’,再將's’的值賦給s1,那么我認(rèn)為此時(shí)就可以相當(dāng)于字符串中的字符串
那么s1就可以相當(dāng)于' '3 ** 3 ** 2’ ’(為了和雙引號(hào)分開,我在兩個(gè)單引號(hào)中加了個(gè)空格),此時(shí)的s1就有兩層,在我的理解看來,此時(shí)使用eval函數(shù)就像剝開洋蔥一樣,返回其中所蘊(yùn)含的值。
>>> s='3**3**2'
>>> s1='s'
>>> s1
's'
>>> s
'3**3**2'
>>> print(s1)
s
s1是代表s這個(gè)字符串,Python中的字符串是有單引號(hào)'’或是雙引號(hào)“”的,而輸出則就是將其字符串輸出出來,不需要帶引號(hào)。
>>> print(eval(s1))
3**3**2
>>> print(s)
3**3**2
我們從這里可以看到s和eval(s1)的效果是一樣的,而s就僅僅比s1多了一個(gè)引號(hào)。
所以我們可以知道的就是eval(s1)的返回值就是返回s當(dāng)中的值,注意此時(shí)都是字符串的形式。我們可以驗(yàn)證一下。
>>> isinstance(s,str)
True
>>> isinstance(s1,str)
True
那么問題來了,eval(eval())呢?
現(xiàn)在問題就變得很簡(jiǎn)單了。eval(s1)就是'3 ** 3 ** 2’,再對(duì)其進(jìn)行eval就是返回這個(gè)表達(dá)式的結(jié)果了。PS:這個(gè)冪運(yùn)算的結(jié)合性是從右往左的呦~
>>> print(eval(eval(s1)))
19683
>>> print(eval(s))
19683
那么就是3的9次方啦
總代碼如下:
>>> s='3**3**2'
>>> s1='s'
>>> s1
's'
>>> print(s1)
s
>>> print(eval(s1))
3**3**2
>>> print(s)
3**3**2
>>> print(eval(eval(s1)))
19683
>>> print(eval(s))
19683
但是這里能如果你想有一次性輸出的話呢,可以在每一句的后面加一個(gè);\即可,如下圖所示:
>>> s='3**3**2'; s1='s'; print(s1); print(eval(s1)); print(eval(eval(s1)))
s
3**3**2
19683
就是這樣啦嘻嘻收工!
最后說一下,本人只是大一新生,初學(xué)編程,也是剛接觸Python不久,這篇文章也只是我自己看書做題上網(wǎng)查了之后,自己思考的結(jié)果。如果我有什么地方不正確的話,懇請(qǐng)各位大佬斧正!謝謝!