python基礎教程1


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://wenku.baidu.com/link?url=2EE55MZiNreqM_fdh44k7o8fKweZ1GhPzotnL3nPRXytXJsXJhzkAOY91zUxAJZiVtj3Rrao6E7d-xnIz_owai7sx24L7KgJK1X52P-Rw1_

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),但是一些特性不會在舊式類起作用。
所以,為了確保自己使用的是新式類,有以下方法:
  1. 把這個賦值語句放在類模塊代碼的最前面 __metaclass__ = type(前面有提過)。
  2. 自己的類都從內建類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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM