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