對於多數從其他編程語言轉入Python的來說,或多或少會有些不習慣。如果沿用其他編程語言的語法來寫Python代碼,那麼碰壁是不可避免的了。 本文是基於我看了兩個小時的官方文檔(Python 2.7 : https://docs.python.org/2/tutorial/index.html , ...
對於多數從其他編程語言轉入Python的來說,或多或少會有些不習慣。如果沿用其他編程語言的語法來寫Python代碼,那麼碰壁是不可避免的了。
本文是基於我看了兩個小時的官方文檔(Python 2.7 : https://docs.python.org/2/tutorial/index.html , 至於我學習Python2.x的原因:工作需要),
從中提取的重要的細節,以避免再次踩坑。
先上一個Python文件(Foo.py):
#!python #-*- coding: utf-8 -*- ''' python 的註釋: 多行註釋: 用成對的3個單引號或者3個雙引號組成 (例如當前位置) 單行註釋:使用# ''' # 定義一個foo函數,用於把指定msg列印 count次 """ params: count: int, 列印的次數 msg: string,消息內容 useFor:多次列印時,是否採用for loop。 raise: ValueError : 當count<0時拋出 """ def foo(count=1, msg='Hello'+' '+ "Foo", useFor=1): if count < 0 : raise ValueError('count < 0') if useFor : # 0,1 可以用作bool判定 print("print use for, count = " + bytes(count) +" :") for i in range(count): # range(N),會生成一個從0到N的list,恰好可以用作索引 print(msg+' '+bytes(i)) else: print("print use while, count = " + bytes(count)+" :") i = 0 while i < count: print(msg+" "+bytes(i)) i+=1 # python中不支持 i++的寫法,支持 i+= 的寫法 if __name__ == '__main__' : print('main in Foo.py') foo(2,useFor=1) foo(useFor=0, count=3); foo(-1)
1、文件頭
作為一個腳本語言,文件頭指定一些執行環境等,是很常見的事情。在shell中就很常見的。
那麼對於Python腳本,也有同樣的內容:
1.1 指定解釋器
腳本語言,很常見的配置:
#!/bin/sh shell腳本 #!/usr/bin/perl perl腳本 #!/usr/bin/python python腳本 #!/usr/bin/python3 python3腳本 #!/usr/bin/python2 python2腳本 而有時不太清楚腳本解釋器的具體全路徑名;或者開發環境與運行環境的安裝路徑不同。為了保證相容性,也可以寫作: #!/usr/bin/env python3
這樣運行時會自動搜索腳本解釋器的絕對路徑。
1.2 指定文件編碼
py文件的預設編碼是ASCII,上面的腳本中很多都是ASCII不支持的,那麼需要指定文件編碼。格式是:
#-*- coding: encoding -*-
2、註釋
python 的註釋:
多行註釋: 用成對的3個單引號或者3個雙引號組成 (例如當前位置)
單行註釋:使用#
3、代碼塊,縮進
代碼塊:從上面的Foo.py文件中,很容易可以看出,代碼塊是以 冒號 : 開始的。不論是function定義,if,else,還是loop(for, while)
都是用 : 作為代碼塊的開始。不是用 { } 來包括代碼塊的。
縮進:Python的程式中,不是用 { } 來包括代碼塊的,用縮進來維持代碼塊的。不要寫 tab,用4個空格為縮進。
4、基本數據類型
4.1 String
Python中的字元串與JavaScript中的字元串一樣,既可以使用單引號,也可以使用雙引號。
不會像Shell那樣具備轉義。如果需要對字元轉義,使用 \ ,如果你不想要 字元串內部的 \ 代表轉義,那需要在第一個引號前加上 r 。例如:
#!python #-*- coding: utf-8 -*- ''' Python String, 1)表示字元串:用單引號或者雙引號。他們是等價的,不存在取值轉義等問題 2)字元串內的\表示轉義 3)如果不希望字元串內的\表示轉義,需要在字元串前加上 r 。 4)判定兩個字元串是否相等,類似於JavaScript,用 == 即可
5)兩個字元串拼接,使用 + 即可
6)String 與 Number 拼接,不能直接使用 +
'''
def testString(): a = 'aaa' b = "aaa" print(a==b) print(a==b) c = "\n" d = r"\n" print(c) print(d) print(c == d) if __name__ == '__main__' : print('current module name is "' + __name__+'"') testString()
4.2 Number
#!python #-*- coding: utf-8 -*- ''' Python String, 1)對於數字,Python與JavaScript仍然是類似的,沒有那麼多的限制 2)可以在數字上直接進行 + - * / 運算 3)String 與 Number 拼接,不能直接使用 + ''' def testNumber(): a = 1 # int b = 1.0 # float c = 1.1 print(a==b) print(b<c) print(a + (b - c * 3) / 2 ) d = "1" print(a == d) print(bytes(1)+d)
4.3 Boolean
類似於JavaScript,Python的boolean也是多變的。
True, False 分別表示真、假
以下幾種情況是false:
1.None
2.False
3.任何類型的數字0,包括0,0.0,0L,0j
4.空的序列(sequence)或者映射(mapping)類型對象
5.對於用戶自定義類型的對象,如果其類定義了__nonzero__() 或者 __len__()特殊方法並且返回False或者0
對於最後一條規則,有幾點需要說明:
1.如果類沒有定義這兩個方法中的任何一個,則這種類型的對象真值測試時總是為True
2.如果類同時定義了__nonzero__() 和 __len__(),只會參考__nonzero__()的返回值
以下幾種情況是false:1.None2.False3.任何類型的數字0,包括0,0.0,0L,0j4.空的序列(sequence)或者映射(mapping)類型對象5.對於用戶自定義類型的對象,如果其類定義了__nonzero__() 或者 __len__()特殊方法並且返回False或者0
對於最後一條規則,有幾點需要說明:1.如果類沒有定義這兩個方法中的任何一個,則這種類型的對象真值測試時總是為True2.如果類同時定義了__nonzero__() 和 __len__(),只會參考__nonzero__()的返回值
def testBoolean(): a = True b = False print(a!=b) if(3): print("3 is True") if __name__ == '__main__' : print('current module name is "' + __name__+'"') testBoolean()
5、 變數
Python中的變數,可以分為 local variable, global variable。
1)local variable 的作用與在一個代碼塊內部
2)global variable 的作用與在一個Python的module (一個 py文件) 內。它屬於模塊對象的。如果 A module 中定義了 一個global 變數 a, B module import 了 A, B仍然不能直接使用 A模塊的global 變數 a(例如不能 print a),而應該通過 A.a來使用。
聲明 global 變數需要使用 global 關鍵字,且有兩步,先聲明後賦值。
聲明local 變數,不需要額外的關鍵字。
#!python #-*- coding: utf-8 -*- ''' 全局變數 ''' global moduleName moduleName = __name__ a = 1 def printModuleName(): print(a+1) print(__name__) print(moduleName) ''' if __name__ == '__main__' : print('current module name is "' + __name__+'"') ''' printModuleName() print(a)
6、異常捕獲與處理
Java中的try ... catch .. finally,在Python中也有類似的處理機制:try ... except ... else ... finally ...