Day02基礎(二)

python 基礎 (二)

一. 常量

Python裏還會用到常量,那麼常量是什麼呢?java

「常量」在程序運行時,不會被修改的量。換言之,常量雖然是爲了硬件、軟件、編程語言服務,可是它並非由於硬件、軟件、編程語言而引入;python

另外一層含義指它們的編碼方法是不變的,好比字符'A'不管在硬件、軟件仍是各類編程語言中,它的信息編碼即爲0x41,在除C/C++的一些高級程序語言中,常量能夠被稱做,在一個變化過程當中,始終不變的量。它們能夠是不隨時間變化的某些量和信息,也能夠是表示某一數值的字符或字符串,常被用來標識、測量和比較。 linux

常量區分爲不一樣的類型,如2五、0、-8爲整形常量,6.八、-7.89爲實型常量,‘a’‘b’爲字符常量。常量通常從其字面形式便可判斷。這種常量稱爲字面常量或直接常量。程序員

------ 以上內容來自百度百科。shell

  Python裏沒有對常量的檢查,也就是一個常量,也能被從新賦值、改變,so 咱們爲了區分,要有一個規範。常量的定義,常量名大寫,只要看到全大寫的變量名,能夠清楚的判斷這是不可改變的變量(常量);編程

二 . 模塊

1)標準庫之Sys模塊使用詳解

sys 模塊提供了許多函數和變量來處理 Python 運行時環境的不一樣部分。模塊的文件名必須以.py爲擴展名。緩存

用途:使用sys模塊得到腳本的參數、處理模塊、使用sys模塊操做模塊搜索路徑、使用sys模塊查找內建模塊、使用sys模塊查找已導入的模塊等...dom

咱們利用import語句導入sys模塊。編程語言

一、使用sys模塊得到腳本的參數函數

sys.argv變量是一個字符串的列表(列表會在後面的章節詳細解釋)。特別地,sys.argv包含了命令行參數的列表,即便用命令行傳遞給你的程序的參數。

import sys
print ("script name is", sys.argv[0]) # 使用sys.argv[0]採集腳本名稱 if len(sys.argv) > 1: print ("there are", len(sys.argv)-1, "arguments:") # 使用len(sys.argv)-1採集參數個數-1爲減去[0]腳本名稱 for arg in sys.argv[1:]: #輸出除了[0]外全部參數 print (arg) else: print ("there are no arguments!")

 二、處理模塊

path 列表是一個由目錄名構成的列表, Python 從中查找擴展模塊( Python 源模塊, 編譯模塊,或者二進制擴展).

啓動 Python 時,這個列表從根據內建規則, PYTHONPATH 環境變量的內容, 以及註冊表( Windows 系統)等進行初始化.

因爲它只是一個普通的列表, 你能夠在程序中對它進行操做。

  • 使用sys模塊操做模塊搜索路徑
import sys
print ("path has", len(sys.path), "members")
sys.path.insert(0, "samples")  #將路徑插入到path,[0]中
import sample
sys.path = []  #刪除path中全部路徑
import random 

三、使用sys模塊查找內建模塊

builtin_module_names 列表包含 Python 解釋器中全部內建模塊的名稱

import sys
def dump(module): print (module, "=>",) if module in sys.builtin_module_names: #查找內建模塊是否存在 print ("<BUILTIN>") else: module = _ _import_ _(module) #非內建模塊輸出模塊路徑 print (module._ _file_ _) dump("os") dump("sys") dump("string") dump("strop") dump("zlib") os => C:\python\lib\os.pyc sys => <BUILTIN> string => C:\python\lib\string.pyc strop => <BUILTIN> zlib => C:\python\zlib.pyd 

四、使用sys模塊查找已導入的模塊

modules 字典包含全部加載的模塊. import 語句在從磁盤導入內容以前會先檢查這個字典.

Python 在處理你的腳本以前就已經導入了不少模塊. 

print (sys.modules.keys())
['os.path', 'os', 'exceptions', '_ _main_ _', 'ntpath', 'strop', 'nt',
'sys', '_ _builtin_ _', 'site', 'signal', 'UserDict', 'string', 'stat']

五、使用sys模塊得到當前平臺 

 sys.platform  返回當前平臺 出現如: "win32" "linux2" 等

六、處理標準輸出/輸入

標準輸入和標準錯誤 (一般縮寫爲 stdout 和 stderr) 是內建在每個 UNIX 系統中的管道。

當你 print 某些東西時,結果前往 stdout 管道;

當你的程序崩潰並打印出調試信息 (例如 Python 中的 traceback (錯誤跟蹤)) 的時候,信息前往 stderr 管道

>>> for i in range(3):
...     print('Dive in')
Dive in
Dive in
Dive in
>>> import sys
>>> for i in range(3):
...     sys.stdout.write('Dive in')
Dive inDive inDive in
>>> for i in range(3):
...     sys.stderr.write('Dive in')
Dive inDive inDive in  

stdout 是一個類文件對象;調用它的 write 函數能夠打印出你給定的任何字符串。

實際上,這就是 print 函數真正作的事情;它在你打印的字符串後面加上一個硬回車,而後調用 sys.stdout.write 函數。

在最簡單的例子中,stdout 和 stderr 把它們的輸出發送到相同的地方

和 stdout 同樣,stderr 並不爲你添加硬回車;若是須要,要本身加上。

stdout 和 stderr 都是類文件對象,可是它們都是隻寫的。

它們都沒有 read 方法,只有 write 方法。然而,它們仍然是類文件對象,所以你能夠將其它任何 (類) 文件對象賦值給它們來重定向其輸出。

七、使用sys重定向輸出

print ('Dive in')        # 標準輸出
saveout = sys.stdout        # 終在重定向前保存stdout,這樣的話以後你還能夠將其設回正常
fsock = open('out.log', 'w')      # 打開一個新文件用於寫入。若是文件不存在,將會被建立。若是文件存在,將被覆蓋。
sys.stdout = fsock                 # 全部後續的輸出都會被重定向到剛纔打開的新文件上。
print  ('This message will be logged instead of displayed' )   # 這樣只會將輸出結果「打印」到日誌文件中;屏幕上不會看到輸出
sys.stdout = saveout   # 在咱們將 stdout 搞亂以前,讓咱們把它設回原來的方式。    
fsock.close()     # 關閉日誌文件。

重定向錯誤信息

fsock = open('error.log', 'w')           # 打開你要存儲調試信息的日誌文件。 
sys.stderr = fsock                           # 將新打開的日誌文件的文件對象賦值給stderr以重定向標準錯誤。
raise Exception, 'this error will be logged'   # 引起一個異常,沒有在屏幕上打印出任何東西,全部正常的跟蹤信息已經寫進error.log

還要注意你既沒有顯式關閉日誌文件,也沒有將 stderr 設回最初的值。

這樣挺好,由於一旦程序崩潰 (因爲引起的異常),Python 將替咱們清理並關閉文件

打印到 stderr

向標準錯誤寫入錯誤信息是很常見的,因此有一種較快的語法能夠馬上導出信息

>>> print ('entering function')
entering function
>>> import sys
>>> print >> sys.stderr, 'entering function'
entering function 

print 語句的快捷語法能夠用於寫入任何打開的文件 (或者是類文件對象)。

在這裏,你能夠將單個print語句重定向到stderr並且不用影響後面的print語句。

八、使用sys模塊退出程序

import sys
sys.exit(1)

注意 sys.exit 並非當即退出. 而是引起一個 SystemExit 異常. 這意味着你能夠在主程序中捕獲對 sys.exit 的調用.

捕獲sys.exit調用

import sys
print ("hello")
try:
    sys.exit(1)
except SystemExit:   # 捕獲退出的異常
    pass                    # 捕獲後不作任何操做
print ("there")
hello there

若是準備在退出前本身清理一些東西(好比刪除臨時文件), 你能夠配置一個 "退出處理函數"(exit handler), 它將在程序退出的時候自動被調用

另外一種捕獲sys.exit調用的方法

def exitfunc():
    print ("world")
sys.exitfunc = exitfunc  # 設置捕獲時調用的函數
print ("hello")
sys.exit(1)     # 退出自動調用exitfunc()後,程序依然退出了
print ("there")  # 不會被 print
hello
world

 2)系統庫os模塊功能

經常使用方法:

一、os.name

輸出字符串指示正在使用的平臺。若是是window 則用'nt'表示,對於Linux/Unix用戶,它是'posix'。

二、os.getcwd()

函數獲得當前工做目錄,即當前Python腳本工做的目錄路徑。

三、os.listdir()

返回指定目錄下的全部文件和目錄名。

>>> os.listdir(os.getcwd())
['Django', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'MySQL-python-wininst.log', 'NEWS.txt', 'PIL-wininst.log', 'python.exe', 'pythonw.exe', 'README.txt', 'RemoveMySQL-python.exe', 'RemovePIL.exe', 'Removesetuptools.exe', 'Scripts', 'setuptools-wininst.log', 'tcl', 'Tools', 'w9xpopen.exe']
>>> 

四、os.remove()

刪除一個文件。

五、os.system()

運行shell命令。

>>> os.system('dir')
0
>>> os.system('cmd') #啓動dos

六、os.sep 能夠取代操做系統特定的路徑分割符。

七、os.linesep字符串給出當前平臺使用的行終止符

>>> os.linesep
'\r\n'            #Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'。
>>> os.sep
'\\'              #Windows
>>> 

八、os.path.split()

函數返回一個路徑的目錄名和文件名

>>> os.path.split('C:\\Python25\\abc.txt')
('C:\\Python25', 'abc.txt')

九、os.path.isfile()和os.path.isdir()函數分別檢驗給出的路徑是一個文件仍是目錄。

>>> os.path.isdir(os.getcwd())
True
>>> os.path.isfile('a.txt')
False

十、os.path.exists()函數用來檢驗給出的路徑是否真地存在

>>> os.path.exists('C:\\Python25\\abc.txt')
False
>>> os.path.exists('C:\\Python25')
True
>>> 

十一、os.path.abspath(name):得到絕對路徑

十二、os.path.normpath(path):規範path字符串形式

1三、os.path.getsize(name):得到文件大小,若是name是目錄返回0L

1四、os.path.splitext():分離文件名與擴展名

>>> os.path.splitext('a.txt')
('a', '.txt')

1五、os.path.join(path,name):鏈接目錄與文件名或目錄

>>> os.path.join('c:\\Python','a.txt')
'c:\\Python\\a.txt'
>>> os.path.join('c:\\Python','f1')
'c:\\Python\\f1'
>>> 

1六、os.path.basename(path):返回文件名

>>> os.path.basename('a.txt')
'a.txt'
>>> os.path.basename('c:\\Python\\a.txt')
'a.txt'
>>> 

1七、os.path.dirname(path):返回文件路徑

>>> os.path.dirname('c:\\Python\\a.txt')
'c:\\Python'

三. python 生成的.pyc 是什麼?

這是用一個過程,,哈哈!!

當執行的程序,存在導入的模塊時纔會生產.pyc,手動執行不會生成.pyc文件;

不要急,,咱們先說下python的運行過程,天然就明白了。

四. python 的運行過程

1. Python是一門解釋型語言?

  初學Python,聽到的關於Python的第一句話就是,Python是一門解釋性語言,我就這樣一直相信下去,直到發現了*.pyc文件的存在。若是是解釋型語言,那麼生成的*.pyc文件是什麼呢?c應該是compiled的縮寫纔對啊!
  爲了防止其餘學習Python的人也被這句話誤解,那麼咱們就在文中來澄清下這個問題,而且把一些基礎概念給理清。 

2. 解釋型語言和編譯型語言

  計算機是不可以識別高級語言的,因此當咱們運行一個高級語言程序的時候,就須要一個「翻譯機」來從事把高級語言轉變成計算機能讀懂的機器語言的過程。這個過程分紅兩類,第一種是編譯,第二種是解釋。

編譯型語言在程序執行以前,先會經過編譯器對程序執行一個編譯的過程,把程序轉變成機器語言。運行時就不須要翻譯,而直接執行就能夠了。最典型的例子就是C語言。

解釋型語言就沒有這個編譯的過程,而是在程序運行的時候,經過解釋器對程序逐行做出解釋,而後直接運行,最典型的例子是Ruby。

  經過以上的例子,咱們能夠來總結一下解釋型語言和編譯型語言的優缺點,由於編譯型語言在程序運行以前就已經對程序作出了「翻譯」,因此在運行時就少掉了「翻譯」的過程,因此效率比較高。可是咱們也不能一律而論,一些解釋型語言也能夠經過解釋器的優化來在對程序作出翻譯時對整個程序作出優化,從而在效率上超過編譯型語言。

  此外,隨着Java等基於虛擬機的語言的興起,咱們又不能把語言純粹地分紅解釋型和編譯型這兩種。

  用Java來舉例,Java首先是經過編譯器編譯成字節碼文件,而後在運行時經過解釋器給解釋成機器文件。因此咱們說Java是一種先編譯後解釋的語言。

  再換成C#,C#首先是經過編譯器將C#文件編譯成IL文件,而後在經過CLR將IL文件編譯成機器文件。因此咱們說C#是一門純編譯語言,可是C#是一門須要二次編譯的語言。同理也可等效運用到基於.NET平臺上的其餘語言。

3. Python究竟是什麼?

其實Python和Java/C#同樣,也是一門基於虛擬機的語言,咱們先來從表面上簡單地瞭解一下Python程序的運行過程吧。
當咱們在命令行中輸入python hello.py時,實際上是激活了Python的「解釋器」,告訴「解釋器」:你要開始工做了。但是在「解釋」以前,其實執行的第一項工做和Java同樣,是編譯。
熟悉Java的同窗能夠想一下咱們在命令行中如何執行一個Java的程序:
javac hello.java
java hello
只是咱們在用Eclipse之類的IDE時,將這兩部給融合成了一部而已。其實Python也同樣,當咱們執行python hello.py時,他也同樣執行了這麼一個過程,因此咱們應該這樣來描述Python,Python是一門先編譯後解釋的語言。

4. 簡述Python的運行過程

在說這個問題以前,咱們先來講兩個概念,PyCodeObject和pyc文件。

咱們在硬盤上看到的pyc天然沒必要多說,而其實PyCodeObject則是Python編譯器真正編譯成的結果。咱們先簡單知道就能夠了,繼續向下看。

當python程序運行時,編譯的結果則是保存在位於內存中的PyCodeObject中,當Python程序運行結束時,Python解釋器則將PyCodeObject寫回到pyc文件中。

當python程序第二次運行時,首先程序會在硬盤中尋找pyc文件,若是找到,則直接載入,不然就重複上面的過程。

因此咱們應該這樣來定位PyCodeObject和pyc文件,咱們說pyc文件實際上是PyCodeObject的一種持久化保存方式。

6. pyc的目的是重用 

編譯型語言的優勢在於,咱們能夠在程序運行時不用解釋,而直接利用已經「翻譯」過的文件。也就是說,咱們之因此要把py文件編譯成pyc文件,最大的優勢在於咱們在運行程序時,不須要從新對該模塊進行從新的解釋。

因此,咱們須要編譯成pyc文件的應該是那些能夠重用的模塊,這於咱們在設計軟件類時是同樣的目的。因此Python的解釋器認爲:只有import進來的模塊,纔是須要被重用的模塊。

7. pyc的過時時間

說完了pyc文件,可能有人會想到,每次Python的解釋器都把模塊給持久化成了pyc文件,那麼當個人模塊發生了改變的時候,是否是都要手動地把之前的pyc文件remove掉呢?
固然Python的設計者是不會犯這麼白癡的錯誤的。而這個過程其實就取決於PyCodeObject是如何寫入pyc文件中的。
寫入pyc文件的時候,寫了一個Long型變量,變量的內容則是文件的最近修改日期,其實每次在載入以前都會先檢查一下py文件和pyc文件保存的最後修改日期,若是不一致則從新生成一份pyc文件。

8. 最後寫點想法

其實瞭解Python程序的執行過程對於大部分程序員,包括Python程序員來講意義都是不大的,那麼真正有意義的是,咱們能夠從Python的解釋器的作法上學到什麼,我認爲有這樣的幾點:

A. 其實Python是否保存成pyc文件和咱們在設計緩存系統時是同樣的,咱們能夠仔細想一想,到底什麼是值得扔在緩存裏的,什麼是不值得扔在緩存裏的。

B. 在跑一個耗時的Python腳本時,咱們如何可以稍微壓榨一些程序的運行時間,就是將模塊從主模塊分開。(雖然每每這都不是瓶頸)

C. 在設計一個軟件系統時,重用和非重用的東西是否是也應該分開來對待,這是軟件設計原則的重要部分。

D. 在設計緩存系統(或者其餘系統)時,咱們如何來避免程序的過時,其實Python的解釋器也爲咱們提供了一個特別常見並且有效的解決方案。

五. Python運算符使用

 5.1)Python語言支持有如下幾種類型:

  • 算術運算符

  • 比較(即關係)運算符

  • 賦值運算符

  • 邏輯運算符

  • 位運算符

  • 會員操做符

  • 標識操做符

5.2)Python算術運算符:

假設變量a持有10和變量b持有20,則:

操做符	         描述符	                                         例子
+	加法 - 對操做符的兩側增長值                 	       a + b = 30
-	減法 - 減去從左側操做數右側操做數	                   a - b = -10
*	乘法 - 相乘的運算符兩側的值               	      a * b = 200
/	除   - 由右側操做數除以左側操做數	               b / a = 2
%	模   - 由右側操做數和餘返回除以左側操做數	          b % a = 0
**	指數 - 執行對操做指數(冪)的計算	               a**b = 10 的冪 20
//	地板除 - 操做數的除法,其中結果是將小數點後的位數被除去的商。	 9//2 =  4 而 9.0//2.0 = 4.0

5.3)Python的比較操做符:

假設變量a持有10和變量b持有20,則:

運算符	              描述	                                 示例
==	檢查,兩個操做數的值是否相等,若是是則條件變爲真。	        (a == b) 不爲 true.
!=	檢查兩個操做數的值是否相等,若是值不相等,則條件變爲真。	(a != b) 爲 true.
<>	檢查兩個操做數的值是否相等,若是值不相等,則條件變爲真。	(a <> b) 爲 true。這個相似於 != 運算符
>	檢查左操做數的值是否大於右操做數的值,若是是,則條件成立。	(a > b) 不爲 true.
<	檢查左操做數的值是否小於右操做數的值,若是是,則條件成立。	(a < b) 爲 true.
>=	檢查左操做數的值是否大於或等於右操做數的值,若是是,則條件成立。	(a >= b) 不爲 true.
<=	檢查左操做數的值是否小於或等於右操做數的值,若是是,則條件成立。	(a <= b) 爲 true.

5.4)Python賦值運算符:

假設變量持有10和變量b持有20,則:

運算符	        描述	                                               示例
=	簡單的賦值運算符,賦值從右側操做數左側操做數	                  c = a + b將指定的值 a + b 到  c
+=	加法AND賦值操做符,它增長了右操做數左操做數和結果賦給左操做數	         c += a 至關於 c = c + a
-=	減AND賦值操做符,它減去右邊的操做數從左邊操做數,並將結果賦給左操做數	    c -= a 至關於 c = c - a
*=	乘法AND賦值操做符,它乘以右邊的操做數與左操做數,並將結果賦給左操做數	    c *= a 至關於 c = c * a
/=	除法AND賦值操做符,它把左操做數與正確的操做數,並將結果賦給左操做數	    c /= a 至關於= c / a
%=	模量AND賦值操做符,它須要使用兩個操做數的模量和分配結果左操做數	         c %= a is equivalent to c = c % a
**=	指數AND賦值運算符,執行指數(功率)計算操做符和賦值給左操做數	         c **= a 至關於 c = c ** a
//=	地板除,並分配一個值,執行地板除對操做和賦值給左操做數	              c //= a 至關於 c = c // a

5.5)Python位運算符:

位運算符做用於位和位操做執行位。假設,若是a =60;且b =13;如今以二進制格式它們將以下:

a = 0011 1100

b = 0000 1101

-----------------

a&b = 0000 1100

a|b = 0011 1101

a^b = 0011 0001

~a  = 1100 0011

Python語言支持下位運算符

操做符	        描述	                          示例
&	二進制和複製操做了一下,結果,若是它存在於兩個操做數。	           (a & b) = 12  即 0000 1100
|	二進制或複製操做了一個比特,若是它存在一個操做數中。	           (a | b) = 61  即 0011 1101
^	二進制異或運算符的副本,若是它被設置在一個操做數而不是兩個比特。	       (a ^ b) = 49  即  0011 0001
~	二進制的補運算符是一元的,並有「翻轉」位的效果。	                (~a ) =  -61  即 1100 0011 以2的補碼形式因爲帶符號二進制數。
<<	二進位向左移位運算符。左操做數的值左移由右操做數指定的位數。	       a << 2 = 240 即 1111 0000
>>	二進位向右移位運算符。左操做數的值是由右操做數指定的位數向右移動。	  a >> 2 = 15   即 0000 1111

5.6)Python邏輯運算符:

Python語言支持如下邏輯運算符。假設變量a持有10和變量b持有20則:

運算符	        描述	                                 示例
and	所謂邏輯與運算符。若是兩個操做數都是真的,那麼則條件成立。	              (a and b) 爲 true.
or	所謂邏輯OR運算符。若是有兩個操做數都是非零而後再條件變爲真。	              (a or b) 爲 true.
not	所謂邏輯非運算符。用於反轉操做數的邏輯狀態。若是一個條件爲真,則邏輯非運算符將返回false。	 not(a and b) 爲 false.

5.7)Python成員運算符:

除了前面討論的運算符,Python成員運算符,在一個序列中成員資格的測試,如字符串,列表或元組。有兩個成員運算符解釋以下:

操做符	         描述	                      示例
in	計算結果爲true,若是它在指定找到變量的順序,不然false。	    x在y中,在這裏產生一個1,若是x是序列y的成員。
not in	計算結果爲true,若是它不找到在指定的變量順序,不然爲false。	    x不在y中,這裏產生結果不爲1,若是x不是序列y的成員。 

5.8)Python標識運算符:

標識符比較兩個對象的內存位置。兩個運算符標識解釋以下:

運算符	        描述	                        例子
is	計算結果爲true,若是操做符兩側的變量指向相同的對象,不然爲false。	x是y,這裏結果是1,若是id(x)的值爲id(y)。
is not	計算結果爲false,若是兩側的變量操做符指向相同的對象,不然爲true。	x不爲y,這裏結果不是1,當id(x)不等於id(y)。

5.9)Python運算符優先級:

下表列出了全部運算符從最高優先級到最低。

運算符	                描述
**	               冪(提升到指數)
~ + -	               補碼,一元加號和減號(方法名的最後兩個+@和 - @)
* / % //	          乘,除,取模和地板除
+ -	               加法和減法
>> <<	               左,右按位轉移
&	               位'AND'
^ |	               按位異'或`'和按期`或'
<= < > >=	          比較運算符
<> == !=	          等式運算符
= %= /= //= -= += *= **=	 賦值運算符
is  is not	          標識運算符
in  not in	          成員運算符
not or and	          邏輯運算符
相關文章
相關標籤/搜索