模組,一個模組就是一個py檔案,模組名和檔名一致
包,爲了組織模組,可以分組爲包,包就是模組所在的目錄,python中如果需要把目錄當作包,需要在目錄下建立一個__init__.py的檔案,如果匯入包實際匯入的是次檔案。
__all__變數,定義了模組的共有介面,在編寫模組時設定__all__變數,使用import *匯入只會匯入all中定義的內容,否則預設匯入模組中所有不以下劃線開頭的全域性名稱
__name__,主程式中值是__main__,在匯入模組中值設定爲模組的名稱
函數/變數 | 描述 |
---|---|
argv | 命令列參數,包括指令碼名稱 |
exit([arg]) | 退出當前的程式,可以參數爲給定的返回值或錯誤資訊 |
modules | 對映模組名稱到載入模組的字典 |
path | 查詢模組所在的目錄的目錄列表 |
platform | 平臺表示,類似sunos5或win32的平臺標識 |
stdin | 標準輸入流-------一個類檔案(file-like)物件 |
stdou | 標準輸出流-------一個類檔案(file-like)物件 |
stderr | 標準錯誤流-------一個類檔案(file-like)物件 |
函數/變數 | 描述 |
---|---|
environ | 對環境變數進行對映 |
system(command) | 在子shell中執行操作系統命令 |
sep | 路徑分隔符 |
pathsep | 分隔路徑的分隔符 |
linesep | 行分隔符(’\n’, ‘\r’或’\r\n’) |
urandom(n) | 返回n位元組的加密強隨機數據 |
函數 | 描述 |
---|---|
input(files[, inplace[, bakup]]) | 便於遍歷多個輸入流中的行 |
filename() | 返回當前檔案的名稱 |
lineno() | 返回當前(累計)的行數 |
filelineno() | 放回當前檔案的行數 |
isfirstline() | 檢測當前是否是檔案的第一行 |
isstdin() | 檢測最後一行是否來自sys.stdin |
nextfile() | 關閉當前檔案,移動下一個檔案 |
close() | 關閉序列 |
#!/bin/sh
# -*- coding: utf-8 -*-
import fileinput
import sys
for line in fileinput.input(inplace=True):
line = line.rstrip()
num = fileinput.filelineno()
print '%-40s # %02d' % (line, num)
#儲存爲numberlines.py,執行python numberlines.py numberlines.py
#執行後程式檔案
#!/bin/sh # 01
# -*- coding: utf-8 -*- # 02
# 03
import fileinput # 04
import sys # 05
# 06
for line in fileinput.input(inplace=True): # 07
line = line.rstrip() # 08
num = fileinput.filelineno() # 09
print '%-40s # %02d' % (line, num) # 10
集合Set類位於sets模組中,在python 2.3中通過set型別的實現成爲了語言的一部分,意味不需要匯入直接建立集合
集合是由序列構建的,主要用於檢查成員資格,因此副本是被忽略的,集閤中的元素都是唯一的
集合元素的順序是隨意的
>>> set(range(10))
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> set([0, 1, 2, 3, 4, 0, 1, 2, 3, 4])
set([0, 1, 2, 3, 4])
>>> set(['fee', 'fie', 'foe'])
set(['foe', 'fee', 'fie'])
集合操作,除了檢查成員資格,還可以使用標準的集合操作,比如並集和交集,可以使用方法,也可以使用對整數進行位元運算時使用的操作
>>> a = set([1, 2, 3])
>>> b = set([2, 3, 4])
# 1. 並集
>>> a.union(b)
set([1, 2, 3, 4])
>>> a | b
set([1, 2, 3, 4])
# 2. 交集
>>> a.intersection(b)
set([2, 3])
>>> c = a & b
>>> c
set([2, 3])
# 3. 判斷子集
>>> c.issubset(a)
True
>>> c <= a
True
# 4. 判斷超集
>>> c.issuperset(a)
False
>>> c >= a
False
# 5. 補集
>>> a.difference(b)
set([1])
>>> a - b
set([1])
# 6. 真補集
>>> a.symmetric_difference(b)
set([1, 4])
>>> a ^ b
set([1, 4])
集合是可變的,所有集合不能用做字典中的鍵,另外集合本身只能包含不可變的元素,所以集合不能包含其他集合。
frozenset,不可變集合,可以作爲集合的元素
>>> a = set()
>>> a
set([])
>>> b=set()
>>> a.add(b)
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
a.add(b)
TypeError: unhashable type: 'set'
>>> a.add(frozenset(b))
>>> a
set([frozenset([])])
優先佇列的一種,使用優先佇列能夠以任意順序增加物件,並且能在任何時間找到最小物件
python中沒有獨立的堆型別,只有一個包含一些堆操作的函數的模組,這個模組是heapq(q即queue的縮寫),包含以下函數
堆屬性(heap property)位於i位置上的元素總比i//2位置處的元素大,反過來說就是位置i處的元素總比2*i和2*i+1位置處的元素小,這是底層堆演算法的基礎
函數 | 描述 |
---|---|
heappush(heap, x) | 將x入堆 |
heappop(heap) | 將x中的最小元素彈出 |
heapify(heap, x) | 將heap屬性應用到任意一個列表 |
nlargest(n, iter) | 返回iter中第n大的元素 |
nsmallest(n, iter) | 返回iter中第n小的元素 |
>>> from heapq import *
>>> from random import shuffle
>>> data = range(10)
>>> shuffle(data)
>>> data
[9, 8, 1, 4, 3, 0, 6, 7, 5, 2]
>>> heap = []
# 1. heappush
>>> for n in data:
heappush(heap, n)
>>> heap
[0, 2, 1, 5, 3, 8, 6, 9, 7, 4]
>>> heappush(heap, 0.5)
>>> heap
[0, 0.5, 1, 5, 2, 8, 6, 9, 7, 4, 3]
# 2. heappop,彈出最小的元素,一般來說是在索引0處,並確保剩餘元素中最小的佔據這個位置
>>> heappop(heap)
0
>>> heap
[0.5, 2, 1, 5, 3, 8, 6, 9, 7, 4]
>>> heappop(heap)
0.5
>>> heappop(heap)
1
>>> heap
[2, 3, 4, 5, 7, 8, 6, 9]
# 3. heapify,使用任意列表做爲參數,並且通過儘可能少的移位轉換爲合法的堆
>>> heap = [5, 8, 0, 3, 6, 7, 9, 1, 4, 2]
>>> heapify(heap)
>>> heap
[0, 1, 5, 3, 2, 7, 9, 8, 4, 6]
# 4. heapreplace,彈出最小元素,並將新元素推入
>>> heapreplace(heap, 0.5)
0
>>> heap
[0.5, 1, 5, 3, 2, 7, 9, 8, 4, 6]
# 5. nlargest和nsmallest,分別尋找任何可迭代物件iter中第n大或n小的元素
>>> heap = [3, 2, 5, 9, 0 ,3, 1, 4]
>>> nlargest(3, heap)
[9, 5, 4]
>>> nlargest(2, heap)
[9, 5]
>>> nlargest(1, heap)
[9]
>>> nsmallest(2, heap)
[0, 1]
雙端佇列(double-ended queue或稱deque),在需要按元素增加的順序來移除元素時非常有用
python 2.4中增加了collections模組,包括deque型別
python 2.5中的collections模組只包括deque和defaultdict型別
雙端佇列通過可迭代物件建立,而且有些非常有用的方法,如下範例
>>> from collections import deque
>>> q = deque(range(5))
>>> q.append(5)
>>> q
deque([0, 1, 2, 3, 4, 5])
>>> q.appendleft(6)
>>> q
deque([6, 0, 1, 2, 3, 4, 5])
>>> q.pop()
5
>>> q.popleft()
6
>>> q
deque([0, 1, 2, 3, 4])
>>> q.rotate(3)
>>> q
deque([2, 3, 4, 0, 1])
>>> q.rotate(-1)
>>> q
deque([3, 4, 0, 1, 2])
>>>