【Python學習】python學習手冊--第三章 如何運行程序

交互式運行程序

在計算機上,最簡單運行Python程序的方法就是直接調用Python程序,與Python交互式運行程序,即輸入一句命令,馬上返回結果,類似於unix裏面的執行命令。

liximin@ubuntu:~$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello World")
Hello World
>>> 

交互模式下,每一句輸入的命令都會立即運行,並且會自動將輸入語句的結果打印出來。可以執行ctrl-D或關閉窗口來結束Python程序。
交互模式主要有以下幾個作用:

  • 實驗:在交互模式下,所有語句都是立即輸出結果,這樣的環境就給程序員一個絕佳的實驗環境。不會對計算機上的其他程序造成任何影響。
  • 測試:在開發過程中,交互模式下也是一個測試語句的絕佳環境。對於拿不準的語句,可以在交互模式下調試,以輸出自己想要的結果。

交互模式下常見的一些問題總結如下:

  • 交互模式下只能運行Python語句。
  • 在Python文件中,打印語句print是必需的。交互模式下,Python語句是直接輸出結果,這跟文件中的程序很不一樣,Python程序在需要輸出結果時,必須使用打印語句(print)。
  • 交互模式下不需要縮進:在確定沒有任何嵌套語句的情況下,Python語句都從第一列開始寫起。每一行開頭有空格,會產生錯誤的信息。
  • 留意交互模式下,提示符的變化和複合語句。在輸入複合語句時,你會注意到,Python程序上的提示符會發生變化。
>>> for i in range(5):
...    print(i) #注意這裏提示,每行開頭的提示符發生了變化
...         #需要多輸入一個回車,以結束符合語句。這是交互模式下的特性,在文件中不是必需的。
0
1
2
3
4
  • 交互模型下,一次運行一條語句。在運行完成一條語句之後才能輸入下一條語句。

系統命令行和文件

交互模式下,運行後的命令無法保存。需要執行大量程序時,我們最好把他們保存在.py文件中,再執行Python文件。一個Python程序(.py文件)通常叫做模塊。模塊是包含了Python程序的簡單文本文件。一旦編寫完成,可以讓Python解釋器多次運行。一個Python程序是有很多Python命令組成的(就像Linux中的shell一樣)。

  • 保存文件時,主要將Python程序默認保存爲.py的擴展名。尤其是在window系統下,默認情況下,是將文件擴展名隱藏了。
  • 在運行Python程序時,需要更上.py擴展名。而在Python程序裏導入模塊時,就不需要跟擴展名。

    • 運行modul模塊:python modul.py
    • 在Python中導入modul模塊: import modul
  • 在python文件中需要輸出某個結果時,需要使用打印語句(print),這也是Python文件運行和交互模式下運行,最主要的特徵。

Unix可執行腳本(#!)

如果Python在UNIX類系統上運行,就可以視其爲可執行程序,它主要有兩個特徵:

  • 它們的第一行是特定的(與shell腳本一樣,以#!開頭),第一行標註了Python解釋器的位置。
  • Python文件都必須要擁有可執行權限。

在UNIX類系統上,避免硬編碼Python解釋器的路徑,我們可以使用env命令:
#! /user/bin/env python
這樣編寫的好處是通過env程序來查找Python解釋器的位置。提供程序的可移植性,不用在更換計算機環境時重新修改。當然這是在env程序在任何系統位置不變的情況下, 如果env程序在不同位置,那麼可移植性就無從談起了。

還有一些情況是在windows環境下直接雙擊py文件直接運行的,這時程序會像一個處理程序一樣,對話框一閃而過。應對這種情況,可以在程序的最末尾加入內置函數input(),這樣窗口會在敲下回車之後消失。直接雙擊文件運行最好是在調試好程序之後,否則一些運行錯誤會一閃而過,最後停止,你也不知道程序執行是否正確。

版本差異提示,2.6或者更早的版本使用raw_input()函數,在3.0版本中是使用input()函數。

模塊導入和重載

之前講過,一個python程序文件就可以成爲一個模塊,其它文件都能夠導入這個模塊的內容,導入從本質上講就是載入另一個文件中的內容。模塊的組織方式成了Python一個特點,一些很大的程序往往都是以多個模塊出現,並且運用了許多外部的模塊。真正需要用來執行,啓動後能夠運行整個程序的文件成爲主文件,有時候也叫做頂層文件

在第一次導入某個模塊之後,再次執行導入操作,就不會再由任何效果

print("import modul successfully.")   #importmodul.py 文件中的內容

導入modul效果:

Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import importmodul #第一次導入會執行文件,產生效果
import modul successfully.
>>> import importmodul  # 後面再執行導入操作,就不會有效果
>>> 

Python這麼做的原因就是因爲導入也是一個比較消耗資源的操作,在執行導入時,Python文件會編譯成爲字節碼,並且運行代碼。在其他終端修改了同樣的文件代碼再執行import也是沒有效果的。
如果真的需要在同一個文件或者會話中,多次導入同一個模塊,可以調用imp標準庫模塊中的reload函數


>>> import imp
>>> import importmodul
import modul successfully.
>>> import importmodul      # 直接使用import將不會有作用
>>> imp.reload(importmodul) # 使用reload函數重新導入
import modul successfully.
<module 'importmodul' from '/home/liximin/Learn/importmodul.py'>       
# 這一行顯示,reload函數返回的是導入模塊的對象
>>> 

reload函數參數是一個已經加載過的模塊對象的名稱,所以在執行reload重載之前,請確保你重載的模塊在之前被導入過。

在Python3.0版本中,reload函數放入imp模塊中,需要導入才能使用。但是在2.6之前的版本,reload作爲Python的內置函數,可以直接使用,不需要導入。

模塊的“屬性”

從宏觀的角度來看,模塊扮演了工具庫的一個角色。模塊往往是變量名的封裝,被認爲是命名空間,模塊中的變量名就是所謂的屬性,屬性就是綁定在特定對象上的變量名
在應用中,導入模塊後會得到模塊在外層定義的所有變量名。

liximin@ubuntu:~/Learn$ cat Attribute.py 
Focus="Learning need Focus"
liximin@ubuntu:~/Learn$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import Attribute
>>> Attribute.Focus                 #這裏需要跟上模塊名以確定程序的命名空間
'Learning need Focus'
>>> Focus                           #如果直接使用,就會報錯,提示沒有定義
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'Focus' is not defined
>>> from Attribute import Focus     #通過from方式,可以直接使用Focus變量。
>>> Focus                            
'Learning need Focus' 
>>> 

from與import很相似,from只不過增加了對載入組件屬性的額外複製,會獲得導入變量名的副本從技術上講,from複製了模塊的屬性,並且將它賦值給接受者的直接變量,所以通過from來的屬性,不需加上命名空間,而是可以直接使用。無論使用的是import還是from語句,模塊的代碼都會被執行,並且在文件的頂層上,獲得導入模塊的讀取權
導入模塊後,可以使用dir函數,來看模塊中能使用的變量名的列表。

>>> import Attribute       
>>> dir(Attribute)
['Focus', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__'] 
>>> 

上面的變量名列表中,可以看到一些額外的以雙下劃線開頭並結尾的變量名,這些變量名都是Python預定義的內置變量名,它們對於解釋器來說有特殊的含義。

模塊和命名空間

一般來說,Python程序都是由很多模塊(Python文件)組合而成,每一個模塊就像一個包,即命名空間,它們裝有自己的變量名,每一個模塊都是獨立的命名空間,它們用來解決變量的命名衝突。

在使用from時,要理解到它相當於在接受者的空間內新建了一個變量名稱,這樣可能會導致相同命名空間下,相同變量名的覆蓋。如果使用時注意到這一點,from的導入會將變量名變得更短,讓編程更簡潔。

import和from注意事項

import和from只是用於導入和重載模塊的,它有執行python程序的效果,但是完全不能夠用來執行python程序。同時reload是不可傳遞的,它不能夠重載模塊中需要導入的其它任何模塊。有時還必須有多個reload。
可運行模塊的exec函數

>>> open('Attribute.py').read()
'Focus="Learning need Focus"\n' 
>>> exec(open('Attribute.py').read()) #效果就像將代碼複製到它的位置,將它執行一下。
>>> Focus
'Learning need Focus'
>>> 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章