python作為一種編程語言,誕生於1990年左右,算是一門比較年輕的語言(也算是90后吧),它是面向對象的,但不同於JAVA\C#那么嚴格要求一切皆對象,更接近於C++,是面向過程和面向對象的結合;它是解釋型語言,但是也可以編譯成 .pyc 跨平台的字節碼文件(由類似於JAVA 的 .class 文件,由python虛擬機來執行),.pyc 文件有幾個好處,一是可以簡單的隱藏源碼,二是提高載入速度,三是跨平台。
編譯:python -m py_compile test.py 會生成 test.pyc 文件
python -O -m py_compile test.py 會生成 test.pyo 文件,就是 .pyc 的簡單優化。
批量編譯一個文件夾中所有的 .py 文件,可以使用 python -m compileall dirname
在 windows 下執行 .py/.pyc 文件時,默認會有閃現一個dos窗口,如果不要這個窗口,可以將 .py/.pyc 的文件后綴改成 .pyw 即可。
其實這種改動,並沒有本質上的區別,真正的區別在於 .py/.pyc 文件默認調用 python.exe 來執行,而 .pyw 文件默認調用 pythonw.exe 執行,僅此而已。(w 表示窗口)
python 也有動態鏈接庫,如 linux 下的 .so 或 windows 下的 .dll。
可以通過 python -m pdb test.py 來調試python程序,方法基本與gdb相同。
http://www.cnblogs.com/mindsbook/archive/2009/07/19/pdb.html
python 的用武之地
由於本人並非python開發者,所知有限,歡迎補充。
1、服務器維護腳本,比 shell 腳本可強大得多。
2、服務端程序
3、膠水程序,如游戲開發中的任務腳本等
4、WEB開發,如 django \web.py 等
5、手游開發,如 cocos-2dx 就有 python 版。
6、桌面應用開發,如 wxpython等等。
7、雲,如 openstack
優點:
1、代碼風格優雅(見仁見智了)
2、一次編寫,隨處運行(這句話不是JAVA的特權)
3、即寫即運行
4、由於膠水特性,性能要求高的地方可以使用c/c++來編寫。
5、簡單易學,所以接下來,不必緊張,請愉快的學習它吧
6、開源
7、龐大的標准庫
缺點:
1、tab 與 空格帶來的噩夢
2、性能,不過可以通過膠水特性彌補
3、python2 與 3之間的抉擇
python腳本的第一行一般是特定的,使用 #! 開始,其后緊跟着機器python解釋器的路徑。在一些LINUX系統上,為了避免硬編碼 python 解釋器的路徑,也可以這樣寫: #!/usr/bin/env python
通過 import 可以導入一個模塊,如果那個模塊可執行,則執行此模塊,但是,多次 import 同個模塊,只會執行一次,因為導入是一個開銷很大的工作,所以第一次導入時將其編譯成字節碼,並且運行代碼。如果希望可以再次運行模塊,可以使用
import imp import hello imp.reload(hello)
python2.6~2.7中,reload 是內置函數,不需要導入,即這樣也是可以的:
import hello reload(hello)
reload函數的返回值是一個python模塊對象。
此外,還有一種方法,借助於 exec 函數:
exec(open('hello.py').read())
但這種方法不會導入模塊,而是類似於宏替換,把文件中代碼粘貼進來一樣,如果變量有重名,會造成覆蓋。
關於 from ... import ...
from 后跟模塊名,即可當模塊的文件名或文件夾名(文件夾中包括 __init__.py 文件),而 import 后跟模塊中的屬性名或方法名等。通過 dir(模塊名) 可以返回模塊中所有的可用的變量名列表
IDE
交互式解釋器:windows\linux
源碼執行:windows\linux
與 perl\php\lua\ruby 的對比
最近的語言使用排行榜。
python是蟒蛇的意思,如華蟒的由來。
不必緊張,請保持愉快,python是一門簡單且功能強大的語言。
弱類型,但是大小寫敏感。
int long float str bool
字符串是不可變的
注釋
#!/usr/bin/python #coding:utf-8
chmod +x test.py
分號的用武之地:
python可以不使用分號,唯一必須要使用分號的場所為將多行語句寫在同一行的時候,如:
i=3;j=4
但推薦一行只寫一個語句。將多行寫成一行是不被推薦的,但有時卻需要把一行寫成多行,則需要使用行連接符號 \,如:
print \ i
另外,列表、元組可以不需要行連接符號,即可拆成多行書寫,如:
mytuple=(3,
4,5,)
轉義符 \
同一層次的語句必須要有相同的縮進。
不要混用制表符和空格來縮進。
SyntaxError: invalid syntax
int/int == int,如 3/2 的結果是1,同 c/c++,如果要得到浮點結果,則兩數字至少要有一個是浮點數,如 3.0/2 或 3/2.0 即可。也可以 from __future__ import division ,或以 python -Qnew 的方式啟動python交互解釋器。
關於 import 與 include
str 與 repr(``)
input 與 raw_input
原始字符串 r
------------------------------------------------
序列和映射:
列表類似於其它語言中動態可變的數組,如 c++的vector,java的 arraylist ,索引也是從0開始,但不同的是,python的列表索引還可以從反向開始,最后一個元素為-1,倒數第二個為-2……
六種序列:列表、元組、字符串、Unicode字符串、buffer對象和 xrange對象。
元組用作配置文件的情況非常常見。
通用序列操作:
分片操作,如果熟知 go 語言,會有助於理解。
字符串是不可變的,更類似於 tuple。
格式化字符串,%s,%d,%f,%%
模板字符串
print 'ab','cd' 會輸出 ab cd,中間會自帶空格,如果不需要空格 print 'ab','\bcd' 即可,或 print 'ab'+'cd'
i = int() --> i = 0
b = bool() --> b = False
強制類型轉換
str\unicode\basestring
print isinstance('a',basestring) 僅適用於 str 和 unicode
下面不僅適用於str和unicode,且適用於 UserString ,不過比較慢
def isStringLike(obj): try:obj+'' except:return False else: return True print isStringLike(3)
閉包:
http://blog.csdn.net/marty_fu/article/details/7679297
dict的 copy 與 deepcopy
print 語句默認會在輸出信息后加上換行符,如果不需要換行,則可以在行尾加上一個逗號,如:
print 'hello,', print 'world'
序列解包:
x,y,z = 1,2,3
x,y = y,x
values = 1,2,3
x,y,z = values
FALSE:
False/None/0/''/()/[]/{}
比較運算符可以連在一起使用,如 0<age<100
is / is not
and / or 代替 &&/|| ,短路邏輯。沒有 & / | 的非短路版本。
assert
沒有類C語言的for循環語句,只有 for ... in 循環,類似於其它語言的 foreach
zip 並行迭代。
編號迭代。
翻轉 reversed、排序迭代 sorted。
循環:while,for,列表推導式
其它語言用一個分號表示空語句,python使用 pass
exec/eval
命名空間:http://www.cnblogs.com/windlaughing/archive/2013/05/26/3100362.html
return 返回None,一般用來表示函數結束
默認參數傳遞是值傳遞,參數如果是列表,在函數內部操作列表索引,就可達到引用傳遞的效果,(但如果想整個給列表賦新值,也是不可以的。貌似傳進來的參數,不能直接做為左值,否則就是新的變量)如:
def fun(lt): lt[0]=3 mylt = [1,2,3,4] fun(mylt) print mylt
所以如果想改變參數,可以把值放在列表中。
關鍵字參數和默認值
可變參數 */**,前者用元組,表示可變的位置參數,jj后者用字典,表示可變的關鍵字參數
globals()["i"] 來引用全局變量 i
kkk
一些有意思的函數:
map/filter/reduce/sum/apply
關於 Unicode / utf-8 / ascii 編碼:
http://blog.renren.com/share/68464/3096404244
http://blog.163.com/longsu2010@yeah/blog/static/173612348201173115733728/
import types
dir(types) 可以查看所有類型
import exceptions
dir(exceptions) 可以查看所有異常
dir(dict) 可以查看所有字典方法與屬性
help(dict) 可以查看所有字典方法 (詳細)
help(dict.pop) 可以查看指定方法或屬性
x,y,z = 1,2,3
這種賦值稱為多元賦值,左邊當作元組,右邊也當作元組。等同於 (x,y,z) = (1,2,3)
面向對象:
class A(object): count = 0 def __init__(self,name): self.name = name self.__class__.count += 1 print '__init__' print 'count:',self.__class__.count def __del__(self): print '__del__' self.__class__.count -= 1 def msg(self): print self.name @staticmethod def get_count1(): print 'staticmethod:',A.count @classmethod def get_count2(cls): print 'classmethod:',cls.count class B(A): def __init__(self,name,age): super(self.__class__,self).__init__(name) self.age = age def msg(self): print self.name,self.age a1 = A('a1') a1.msg() del a1 a2 = A('a2') a2.msg() print '----------------' b1 = B('b1',18) b1.msg() A.get_count2() A.get_count2()
@classmethod 的第一個參數是 cls,因此可以訪問類變量,或是用作類工廠,而 @staticmethod 除了自身代碼是位於類里面之外,對類的情況一無所知;@staticmethod 只適用於不想定義全局函數的情況。兩者能做的事幾乎一樣,區別是更明晰的暴露使用意圖,為了有更好的編程風格。
新式類和舊式類
python的新式類是2.2版本引進來的,我們可以將之前的類叫做經典類或者舊類。
為什么要在2.2中引進new style class呢?官方給的解釋是:
為了統一類(class)和類型(type)。
在2.2之前,比如2.1版本中,類和類型是不同的,如a是ClassA的一個實例,那么a.__class__返回 ‘ class __main__.ClassA‘ ,type(a)返回總是<type 'instance'>。而引入新類后,比如ClassB是個新類,b是ClassB的實例,b.__class__和type(b)都是返回‘class '__main__.ClassB' ,這樣就統一了。
引入新類后,還有其他的好處,比如更多的內置屬性將會引入,描述符的引入,屬性可以來計算等等。
為了向前兼容,默認情況下用戶定義的類為經典類,新類需要繼承自所有類的基類 object 或者繼承自object的新類。
值得注意的地方是,雖然使用的是最新的python(2.7),但是一些特性不會在舊式類起作用。所以,為了確保自己使用的是新式類,有以下方法:
- 把這個賦值語句放在類模塊代碼的最前面 __metaclass__ = type(前面有提過)。
- 自己的類都從內建類object直接或者間接地繼承。
當然,在Python3里面,不存在這些問題了,因為所有的類都是object類的子類(隱式)。
類實現迭代器如下:
#coding:utf-8 class Odd(object): val,i = 1,1 def __init__(self,num,count=0): self.num = num self.count = count def next(self): if self.__class__.val > self.num: raise StopIteration #只能使用這句才能退出循環 if self.count != 0 and self.__class__.i > self.count: raise StopIteration ret = self.__class__.val self.__class__.val += 2 self.__class__.i += 1 return ret def __iter__(self): return self #print list(Odd(100,3)) #for item in Odd(100,3):print item while True: try: print Odd(100,3).next() except StopIteration: break
關於生成器,也是一種特殊的迭代器
#coding:utf-8 def odd(num,count=0): val,i = 1,1 while val <= num: yield val val += 2 i += 1 #生成器退出的三種情況: #1、執行到函數末尾,如此處的 val>num 時 #2、執行到 return 語句 #3、拋出 StopIteration 異常 if count != 0: if i>count: return #raise StopIteration for i in odd(100): print(i) print list(odd(100,3)) fun = odd(100,4) while True: try: print fun.next() except StopIteration: break
將一段字符串中指定字符替換成指定字符:
s1 = '1234' s2 = '5678' s = '10203040' print ''.join(dict(zip(list(s1),list(s2))).get(c,c) for c in s) import string print string.translate(s,string.maketrans(s1,s2)) import re print re.sub('.',lambda m: dict(zip(list(s1),list(s2))).get(m.group(),m.group()),s)
第三種方法,目前暫不熟練。
try...except...else...finally
else子句是當沒有捕捉到異常時執行的語句,表示正常運行。
finally是不管有沒有捕捉到異常都必然執行的語句
如果 except 后面沒有跟上指定異常(或異常元組),則默認為全捕捉,這是很危險的,因為它也會捕捉語法或書寫方面的異常,如 AttributeError 、 IndentationError 和SyntaxError。
不同於C/C++,python的賦值語句不能做為表達式,即沒有返回值。
python3.2教程:
http://docspy3zh.readthedocs.org/en/latest/tutorial/index.html