1. python中的變數:
python中的變數聲明不需要像C++、Java那樣指定VARIANT 資料型別(int、float等),因為python會自動地根據賦給變數的值確定其類型。如 radius = 20,area = radius * radius * 3.14159 ,python會自動的將radius看成“整型”,area看成“浮點型”。所以編程時不用再像之前那樣小心翼翼的查看資料類型有沒有出錯,挺人性化的。
2. input和print:
先貼個小的程式
# Prompt the user to enter three numbersnumber1 = eval(input("Enter the first number: "))number2 = eval(input("Enter the second number: "))number3 = eval(input("Enter the third number: "))# Compute averageaverage = (number1 + number2 + / number3) / 3#Display resultprint("The average of ", number1, number2, number3, "is", average)
小程式中的幾個知識點:
1)print的格式,print(itme1, item2, ..., itemk),如果print的內容過長,可以直接換行;
2)'/'符號,它是用來串連兩個行的,如果一行內容過長可以用該符號來分割;
3)input(" "),獲得輸入資料,要注意的是,python2.x版本中有兩個輸入函數input()和raw_input(),input()輸入實數時,它的值就是實數;而raw_input()不管輸入的是什麼,它的值都是string,所以需要用eval()函數將值轉換為實數,eval()下面再深入學習;而在python3.x版本中只有一個輸入函數input(),它的功能就相當於python2.x中的raw_input()函數,所以編程時要特別注意版本問題,像這樣的差異還有許多。我的程式是在python3.2下解釋的,如果在python2.x下,可以去掉eval()或者將input改成raw_input,結果一樣。
3. eval()函數
上面的小程式中用到了eval()函數,功能是將string變成算術運算式來執行,比如eval("1+2")的結果是3。那麼是不是它的功能就局限於此呢?
在這個基礎上,我查了python官方文檔關於eval函數的定義和解釋。官網python3.4.1文檔中關於eval的定義如下:
eval(expression, globals=None, locals=None) --- 官方文檔中的解釋是,globals和locals參數是可選的,如果提供了globals參數,那麼它必須是dictionary類型;如果提供了locals參數,那麼它可以是任意的map對象。
在繼續往下之前,要先補充一點關於python命名空間的知識(引用自http://blog.sina.com.cn/s/blog_64668ff00100od2b.html),python是用命名空間來記錄變數的軌跡的,命名空間是一個dictionary,鍵是變數名,值是變數值。
在一個 Python 程式中的任何一個地方,都存在幾個可用的名字空間。每個函數都有著自已的名字空間,叫做局部名字空間,它記錄了函數的變數,包括函數的參數和局部定義的變 量。每個模組擁有它自已的名字空間,叫做全域名字空間,它記錄了模組的變數,包括函數、類、其它匯入的模組、模組層級的變數和常量。還有就是內建名字空間, 任何模組均可訪問它,它存放著內建的函數和異常。
當一行代碼要使用變數 x 的值時,Python 會到所有可用的名字空間去尋找變數,按照如下順序:
1)局部名字空間 - 特指當前函數或類的方法。如果函數定義了一個局部變數 x, 或一個參數 x,Python 將使用它,然後停止搜尋。
2)全域名字空間 - 特指當前的模組。如果模組定義了一個名為 x 的變數,函數或類,Python 將使用它然後停止搜尋。
3)內建名字空間 - 對每個模組都是全域的。作為最後的嘗試,Python 將假設 x 是內建函數或變數。
其實這並不難理解,說白了,就是c++中全域變數和局部變數的意思。比如你在一個函數中用了num這個變數,它首先會尋找函數裡,也就是局部名字空間是否有這個變數名;如果找不到,就會到函數外也就是全域名字空間中繼續尋找;如果再找不到,就會尋找內建關鍵字;如果都找不到,那麼就只有報NameError了。
理解了這一點,就比較容易了。python的全域名字空間儲存在一個叫globals()的dict對象中;局部名字空間儲存在一個叫locals()的dict對象中。我們可以用print (locals())來查看該函數體內的所有變數名和變數值。繼續eval()函數...
1)當後兩個參數都為空白時,很好理解,就是一個string類型的算術運算式,計算出結果即可。等價於eval(expression)。
2)當locals參數為空白,globals參數不為空白時,先尋找globals參數中是否存在變數,並計算。
3)當兩個參數都不為空白時,先尋找locals參數,再尋找globals參數。
舉一個小例子:
#test eval() and locals()x = 1y = 1num1 = eval("x+y")print (num1)def g(): x = 2 y = 2 num3 = eval("x+y") print (num3) num2 = eval("x+y",globals()) # num2 = eval("x+y",globals(),locals()) print (num2)g()
num1的值不用說,是2;num3的值也很好理解,是4;num2的值呢?由於提供了globals()參數,那麼首先應當找全域的x和y值,也就是都為1,那麼顯而易見,num2的值也是2。如果注釋掉該句,執行下面一句呢?根據第3)點可知,結果為4。(PS:我的運行環境是python3.2)當然,也可以顯式的定義dict對象作為eval()的參數,規則是一樣的。
補充一下:locals()對象的值不能修改,globals()對象的值可以修改,寫一個小程式測試一下。
#test globals() and locals()z=0def f(): z = 1 print (locals()) locals()["z"] = 2 print (locals()) f() globals()["z"] = 2print (z)
可以得出,兩個print (locals())的結果是一樣的,說明沒有修改成功。而print (z)的值是2,說明修改成功了。另外,貌似locals()可以添加變數,感興趣的可以試一下。
以上內容是小編給大家分享的Python學習筆記整理3之輸入輸出、python eval函數的全部敘述,希望大家喜歡。