天天看點

[PYTHON] 核心程式設計筆記之三-Python基礎

3.1 語句和文法

#  表示注釋

\n 表示換行符

\  表示繼續上一行

;  将兩個語句連接配接在一行

:  将代碼塊的頭和體分開

語句(代碼塊)用縮進塊的方式展現

不同的縮進深度分隔不同的代碼塊

Python檔案以子產品的形式組織

3.1.1 注釋(#)

顧名思義

3.1.2 繼續(\)

同shell的換行連接配接符

if (a == 1) and \

(b == 2):

  print a,b

注:在含有小括号,中括号,花括号,三引号時不使用\也可以多行書寫

3.1.3 多個語句構成代碼組(:):

縮進相同的一組語句構成一個代碼組,我們稱之代碼組

例如: if,while,def,class的符合語句,首行以關鍵字開始,以冒号:結束,改行之後的一行或多行代碼構成代碼組.

我們将首行及後面的代碼組成為一個子句(clause)

3.1.4 代碼組由不同的縮進分隔

使用4個空格作為一個代碼組,避免使用制表符

3.1.5 同一行書寫多個語句;

import sys; x = 'foo'; sys.stdout.write(x + '\n')

不推薦

3.1.6 子產品

每一腳本檔案,一段執行腳本,一段庫檔案代碼都可組成一個子產品

3.2 變量指派

指派運算符 =

注:指派并不是直接将一個值賦給一個變量的

Python語言中,對象是通過引用傳遞的,在指派時,不管這個對象是新建立的,還是一個已經存在的,都是将該對象的引用(并不是值)指派給變量

Python指派語句不會傳回值

>>> x = 1

>>> y = (x = x + 1)

 File "<stdin>", line 1

   y = (x = x + 1)

          ^

SyntaxError: invalid syntax

鍊式指派沒問題

>>> y = x = x + 1

>>> x,y

(2, 2)

增量指派

x = x + 1 或 x += 1

>>> m = 12

>>> m %= 7

>>> m

5

>>> m **=2

25

>>> aList = [123,'xyz']

>>> aList += [45.6e7]

>>> aList

[123, 'xyz', 456000000.0]

注:Python不支援類似x++或--x這樣的前置/後置自增/自減運算

多重指派

>>> x = y = z =1

>>> x

1

>>> y

>>> z

"多元"指派

采用這種方式指派時,等号兩邊的對象都是元祖

>>> x,y,z = 1,2,'a string'

2

'a string'

建議這麼寫

>>> (x,y,z) = (1,2,'a string')

C語言交換變量需要用一個臨時變量tmp來儲存其中一個值

例:

tmp=x;

x=y;

y=tmp;

Python的多元指派可以實作無需中間變量即可交換兩個變量的值

>>> x,y =1,2

>>> x,y =y,x

3.3 辨別符

辨別符是電腦語言中允許作為名字的有效字元串集合,有一部分是關鍵字,關鍵字不能作為辨別符,否則會引起文法錯誤(SyntaxError 異常)

3.3.1 合法的Python辨別符

(1) 第一個字元必須是字母或下劃線_

(2) 剩下的字元可以是字母和數字或下劃線

(3) 大小寫敏感

3.3.2 關鍵字

關鍵字清單和iskeyword()函數都放入了keyword子產品一邊查閱

3.3.3 内建

built-in是__builttins__子產品的成員,在程式開始或互動解釋器>>>進入前,已由解釋器自動導入,視為Python的全局變量

3.3.4 專用下劃線辨別符

_xxx 不用'from module import x'導入

__xxx__ 系統定義名稱

__xxx 類中的私有變量名

注:避免使用下劃線作為變量名的開始,因為_xxx被看成是私有的,在子產品或類外不可以使用

3.4 基本風格指南

注釋

確定注釋的準确性

文檔

可以通過__doc__特别變量,動态獲得文檔字串

縮進

推薦四個空格作為一層代碼的縮進,跨平台使用不要使用TAB做縮進

選擇辨別符名稱

言簡意赅

3.4.1 子產品結構和布局

(1)起始行

僅在類Unix環境下才使用起始行,可僅輸入腳本名字來執行腳本,無需直接調用解釋器

(2)子產品文檔

介紹子產品功能及重要全局變量含義,子產品外可通過module.__doc__通路這些内容

(3)子產品導入

導入目前子產品的代碼需要的所有子產品:

(4)變量定義

除非必須,盡量使用局部變量代替全局變量

(5)類定義語句

所有類都需要在這裡定義,當子產品被導入時class語句會被執行,類也就會被定義,類的文檔變量時class.__doc__

(6)函數定義語句

此處定義的函數可以通過module.function()在外部被通路到,當子產品被導入時def語句被執行,函數也就會定義好,函數文檔的變量是function.__doc__

(7)主程式

無論這個子產品是被别的子產品導入還是作為腳本直接執行,都會執行這部分代碼

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

#!/usr/bin/env python     #(1)起始行

"this is a test module"   #(2)子產品文檔

import sys

import os                 #(3)子產品導入

debug = True  #(4)(全局)變量

class FooClass(object):

   "Foo class"  #(5)類定義語句

 def test():

   "test function"

   foo = FooClass()

   if debug:

print 'ran test()' #(6)函數定義語句

if __name__ == '__main__':

   test()   #(7)主程式

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

注:

推薦代碼風格:主程式調用main()函數

如果子產品是被導入,__name__的值為子產品名字

如果子產品是被直接執行,__name__的值為'__mail__'

3.4.2 在主程式中書寫測試代碼

3.5 記憶體管理

變量無需事先聲明

 變量無需指定類型

 程式員不用關心記憶體管理

 變量名會被"回收"

 del 語句能夠直接釋放資源

3.5.1 變量定義

變量無需聲明,也無需放到代碼塊最開始

>>> a

Traceback (most recent call last):

 File "<stdin>", line 1, in <module>

NameError: name 'a' is not defined

變量一旦被複制,就可以通過變量名來通路它

>>> x = 4

>>> y = 'this is a string'

4

'this is a string'

3.5.2 動态類型

3.5.3 記憶體配置設定

3.5.4 引用計數

要保持追蹤記憶體中的對象,Python使用了引用計數這一簡單計數,當對象被建立,就建立了一個引用計數,當這個對象不再需要時,這個對象引用變為0,而後被垃圾回收

增加引用計數

當對象被建立并指派給變量,該對象的引用計數就設為1

x = 3.14  # 3.14作為對象被引用+1

y = x     # 引用+2

foobar(x) # 作為參數傳遞給函數 引用+3

myList = [123,x,'xyz'] # 作為容器對象的一個元素 引用+4

減少引用計數

當變量被指派給另外一個對象時,原對象的引用計數-1

foo = 'xyz' # 引用+1

bar = foo   # 引用+2

foo = 123   # 引用-1

當使用del語句删除一個變量,引用計數-1

del bar     # 引用-1

對象被從一個視窗對象中移除,引用計數-1

myList.remove(x)

視窗對象本身被銷毀

del myList

3.5.5 垃圾收集

不再被使用的記憶體會被一種稱為垃圾回收的機制釋放,垃圾回收器作為一塊獨立代碼用來釋放記憶體,不僅用來尋找引用計數為0的對象,還負責引用計數大于0但也應該被銷毀的對象

3.6 第一個Python程式

例3.1

# vi makeTextFile.py

#!/usr/bin/env python

'make TextFile.py -- create text file'

import os

ls = os.linesep

# get filename

while True:

   if os.path.exists('fname.txt'):

       print "ERROR: '%s' already exists" %fname

   else:

       break

# get file content (text) lines

all =[]

print "\nEnter lines ('.' by itself to quit)\n"

#loop until user terminates input

   entry = raw_input(">")

   if entry == '.':

       all.append(entry)

#write lines to file with proper line_ending

fobj = open('fname.txt','w')

fobj.writelines(['%s%s' %(x,ls) for x in all])

fobj.close()

print 'DONE!'

例3.2

# vi readTextFile.py

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

'readTextFile.py -- read and display text file'

fname = raw_input('Enter filename:')

print

# attempt to open file for reading

try:

   fobj = open(fname,'r')

except IOError,e:

   print "*** file open error: ", e

else:

   # display contents to the screen

   for eachLine in fobj:

       print eachLine,

   fobj.close()

3.6 相關子產品和開發工具

Debugger:  pdb

Logger:    logging

Profilers: profile,hotshot,cProfile

     本文轉自 showerlee 51CTO部落格,原文連結:http://blog.51cto.com/showerlee/1330261,如需轉載請自行聯系原作者