目 錄
集合,切片,字符串,基本數據處理,輸入輸出,自定義函數,控制流,正則表達式
文件編程,網絡編程,多線程
sys,os,optparse
1 Python規範——無規矩不成方圓
(1)縮進
Python對代碼縮進是硬性要求,嚴格使用縮進來體現代碼的邏輯從屬關係。一般以4個空格(或一個TAB)爲一個縮進單位,並且相同級別的代碼塊應具有相同的縮進量。
(2)空格與空行
在每個類、函數定義或一段完整的功能代碼之後增加一個空行,在運算符兩側各增加一個空格,逗號後面增加一個空格,讓代碼適當鬆散一點,不要過於密集。
(3)續行
儘量不要寫過長的語句,應儘量保證一行代碼不超過屏幕寬度。如果語句確實太長而超過屏幕寬度,最好在行尾使用續行符“\”表示下一行代碼仍屬於本條語句,或者使用圓括號把多行代碼括起來表示是一條語句。
(4)註釋
有兩種常用的註釋形式:#和三引號。井號#用於單行註釋,表示本行中#符號之後的內容不作爲代碼運行;三引號常用於大段說明性文本的註釋,也可以用於界定包含換行符的長字符串。
2 基礎介紹——入門必備的乾糧
2.1 集合
1)列表:https://www.w3school.com.cn/python/python_lists.asp
列表的所有元素放在一對方括號中,相鄰元素之間使用逗號分隔。同一個列表中元素的數據類型可以各不相同,可以同時包含整數、實數、複數、字符串等基本類型的元素,也可以包含列表、元組、字典、集合、函數或其他任意對象。
2)元組:https://www.w3school.com.cn/python/python_tuples.asp
- 可以通過把若干元素放在一對圓括號中創建元組,如果只有一個元素的話則需要多加一個逗號,例如(3,)。
- 可以使用tuple()函數把列表、字典、集合、字符串以及range對象、map對象、zip對象或其他類似對象轉換爲元組。
- 元組是不可變的,不能直接修改元組中元素的值,也不能爲元組增加或刪除元素。
3)字典:https://www.w3school.com.cn/python/python_dictionaries.asp
4)集合:https://www.w3school.com.cn/python/python_sets.asp
Python集合是無序、可變的容器對象,所有元素放在一對大括號中,元素之間使用逗號分隔,同一個集合內的每個元素都是唯一的,不允許重複。
集合中只能包含數字、字符串、元組等不可變類型的數據,而不能包含列表、字典、集合等可變類型的數據,包含列表等可變類型數據的元組也不能作爲集合的元素。
集合中的元素是無序的,元素存儲順序和添加順序並不一致。
集合不支持使用下標直接訪問特定位置上的元素,也不支持使用random中的choice()函數從集合中隨機選取元素,但支持使用random模塊中的sample()函數隨機選取部分元素。
2.2 切片
是用來獲取列表、元組、字符串等有序序列中部分元素的一種語法。在形式上,切片使用2個冒號分隔的3個數字來完成。
[start:end:step]
其中第一個數字start表示切片開始位置,默認爲0;第二個數字end表示切片截止(但不包含)位置(默認爲列表長度);第三個數字step表示切片的步長(默認爲1),省略步長時還可以同時省略最後一個冒號。當step爲負整數時,表示反向切片,這時start應該在end的右側。
2.3 字符串
Python 中的字符串是表示 unicode 字符的字節數組。但是,Python 沒有字符數據類型,單個字符就是長度爲 1 的字符串。
方括號可用於訪問字符串的元素。( a[1])
字符串屬於不可變對象,所有方法都是返回處理後的字符串或字節串,不對原字符串進行任何修改。
創建:單引號=雙引號;三引號(多行文本)
常用方法
format
1.作爲拼接字符串進行使用
'{}'.format(變量)
2. 保留小數
'{:.2f}'.format(12.333)
'{0:.4f}'.format(10/3)
# 0表示format()方法的參數下標,對應於第一個參數,.4f表示格式化爲實數,保留4位小數
3.百分比格式
print('{0:>10.2%}'.format(1/3))
# 格式化爲百分數字符串,總寬度爲10,保留2位小數,>表示右對齊
4.進制轉換
print("{0:,} in hex is: {0:#x}, in oct is {0:#o}".format(5555555))
# 逗號表示在數字字符串中插入逗號作爲千分符,#x表示格式化爲十六進制數
5.對齊方式
'{a:<10}'.format(a=12.3,b=13.44) 左對齊,長度爲10
'{a:0>10}'.format(a=12.3,b=13.44) 右對齊...
'{a:0^10}'.format(a=12.3,b=13.44) 居中對齊...
'{a:0<10}'.format(a=12.3,b=13.44) 數字補x (填充左邊)
6.轉義{和}符號
'{{ hello{0} }}'.format('python’)
f = ' hello {0} '.format
f('python’)
2.4 基本數據處理
(1)int()、float()、complex()
(2)bin()、oct()、hex() 把整數轉換爲二進制,八進制,十六進制
(3)ord()、chr()、str() 返回字符的ASCII碼,
(4)list()、tuple()、dict()、set()
(5)eval()
2.5 輸入輸出
(1)內置函數input
內置函數input()用來接收用戶的鍵盤輸入,不論用戶輸入什麼內容,input()一律作爲字符串對待,
必要的時候可以使用內置函數int()、float()或eval()對用戶輸入的內容進行類型轉換。
(2)內置函數print
內置函數print()用於以指定的格式輸出信息,語法格式爲:
print(value1, value2, ..., sep=' ', end='\n')
其中,sep參數之前爲需要輸出的內容(可以有多個);sep參數用於指定數據之間的分隔符,如果不指定則默認爲空格;
end參數表示輸出完所有數據之後的結束符,如果不指定則默認爲換行符。
2.6 自定義函數
lambda 函數是一種小的匿名函數。lambda 函數可接受任意數量的參數,但只能有一個表達式。
表達式————lambda arguments : expression
實例————x = lambda x: x+2
def name(data):return data
必選參數 (data)
默認參數 (data,p=2)
可變參數 (*args)
關鍵字參數 (**args)
補充:模塊
每一個後綴爲.py的文件都被視作一個Python模塊,可以被其它Python程序調用(import)。
每個Python腳本在運行時都有一個__ name__ 屬性, 通過它可以識別程序的使用方式,即程序是在作爲模塊被導入,還是在獨立運行。
如果是在作爲模塊被導入,那麼__name__ 屬性的值就被自動設置爲模塊名;
如果是在獨立運行,那麼__ name__ 屬性的值會被自動設置爲字符串“_main_“
2.7 控制流
if
if else
if elif else
for
for i in list
for i in range(a,b)
[i++ for i in list if i >2]
2.8 正則表達式
查詢 findall(pattern,string,flags)
替換 sub(pattern,replace,string,count,flags)
分割 split(pattern,string,maxsplit,flags)
3 深入學習——更上一層樓
3.1 文件編程
流程化:
1. 調用open函數打開文件,並創建一個File對象: f = open(方式,路徑)
2. 調用File對象的read()或write()等方法,對文件的內容進行讀或寫操作。
3. 調用File對象的close()方法,關閉保存文件
1 打開文件open與with
open()方法,必須在用完後使用close()關閉文件
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
f = open('test.txt', 'r')
f.read()
f.close()
關於open()的mode參數:
‘r’ | 只讀 |
‘w’ | 只寫 |
‘a’ | 追加內容 |
‘r+’ == r+w | 可讀可寫,文件若不存在就報錯(IOError) |
‘w+’ == w+r | 可讀可寫,文件若不存在就創建 |
‘a+’ ==a+r | 可追加可寫,文件若不存在就創建 |
對應的,如果是二進制文件,就都加一個b就好啦:‘rb’ ‘wb’ ‘ab’ ‘rb+’ ‘wb+’ ‘ab+’
with方法,自動調用close()方法關閉文件
with open('/path/to/file', 'r') as f:
f.read()
2 read()、readline() 、 readlines()、seek()方法
read() 每次讀取整個文件。
readlines() 與read() 一樣讀取整個文件,readlines() 自動將文件內容分析成一個行的列表,該列表可以由 for循環進行迭代。
readline() 每次只讀取一行。
seek()可以控制指針
3 write() 和 writelines()方法
write()方法和read()方法對應,是將字符串寫入到文件中。
write()方法不寫/n
writelines()方法和readlines()方法對應,也是針對列表的操作。它接收一個字符串列表作爲參數,將他們寫入到文件中,換行符不會自動的加入,因此,需要顯式的加入換行符。
4 remove()
刪除文件
3.2 網路編程
Import socket
socket.setdefaulttimeout(2)
S = Socket.socket()
s.connect((“192.168.1.12”,21))
ans = s.recv(1024)
print (ans)
Python 提供了兩個級別訪問的網絡服務:
低級別的網絡服務支持基本的 Socket,它提供了標準的 BSD Sockets API,可以訪問底層操作系統Socket接口的全部方法。
高級別的網絡服務模塊 SocketServer, 它提供了服務器中心類,可以簡化網絡服務器的開發。
Socket又稱"套接字",應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求:
格式:socket.socket([family[, type[, protocal]]])
參數
family: 套接字家族可以使AF_UNIX或者AF_INET
type: 套接字類型可以根據是面向連接的還是非連接分爲SOCK_STREAM或SOCK_DGRAM
protocol: 一般不填默認爲0
函數
3.3 多線程
當進程被創建時,操作系統會自動爲之創建一個線程,稱爲主線程,主線程再根據需要動態創建其它子線程。通過threading模塊中的Thread()類可以創建和管理線程對象。
import threading
threading.Thread(target=None, name=None, args=())
參數
target 是函數名字,需要調用的函數。
name 設置線程名字。
args 函數需要的參數,以元祖( tuple)的形式傳入
函數
run(): 用以表示線程活動的方法。
start():啓動線程活動。
join(): 等待至線程中止。
isAlive(): 返回線程是否活動的。
getName(): 返回線程名。
setName(): 設置線程名。
4 豐富模塊探索——介紹黑客常用的
4.1 sys
sys.argv變量是一個字符串的列表。
當我們執行"python using_sys.py a b c "的時候,後面跟着的內容被作爲參數傳遞給程序,Python爲我們把它存儲在sys.argv變量中。
(1)參數獲取
腳本文件‘using_sys.py'是sys.argv[0]
'a'是sys.argv[1]
'b'是sys.argv[2]
'c'是sys.argv[3]
sys.argv是輸出所有參數
sys.startswith() 是用來判斷一個對象是以什麼開頭的
(2)sys.exit()退出程序。
sys.exit()會引發一個異常:SystemExit,如果這個異常沒有被捕獲,那麼python解釋器將會退出。如果有捕獲此異常的代碼,那麼這些代碼還是會執行。捕獲這個異常可以做一些額外的清理工作。
注意,os._exit()會直接將python程序終止,之後的所有代碼都不會繼續執行。
sys.exit(1), 退出當前程序,並返回SystemExit異常。0爲正常退出,其他數值(1-127)爲不正常,可拋異常事件供捕獲。
sys. exit(0),正常退出。
sys. exit(“程序退出”),顯示一段提示信息退出。
4.2 os
os模塊提供了訪問操作系統服務的功能。它最常用的是os. system()方法。
1)系統相關:
os.sep可以取代操作系統特定的路徑分隔符。windows下爲 “\\”
os.name字符串指示你正在使用的平臺。比如對於Windows,它是'nt',而對於Linux/Unix用戶,它是'posix'。
os.getcwd()函數得到當前工作目錄,即當前Python腳本工作的目錄路徑。
os.getenv()獲取一個環境變量,如果沒有返回none
os.putenv(key, value)設置一個環境變量值
os.listdir(path)返回指定目錄下的所有文件和目錄名。
os.remove(path)函數用來刪除一個文件。
os.system(command)函數用來運行shell命令。
os.linesep給出當前平臺使用的行終止符。例如,Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'。
os.curdir:返回當前目錄('.')
os.chdir(dirname):改變工作目錄到dirname
2)文件相關
os.getcwd() #獲取當前工作目錄,即當前python腳本工作的目錄路徑
os.chdir("dirname") #改變當前腳本工作目錄;相當於shell下cd
os.curdir #返回當前目錄: ('.')
os.pardir #獲取當前目錄的父目錄字符串名:('..')
os.makedirs('dir1/dir2') #可生成多層遞歸目錄
os.removedirs(‘dirname1’) #遞歸刪除空目錄(要小心)
os.mkdir('dirname') #生成單級目錄
os.rmdir('dirname') #刪除單級空目錄,若目錄不爲空則無法刪除並報錯
os.listdir('dirname') #列出指定目錄下的所有文件和子目錄,包括隱藏文件
os.remove('filename') #刪除一個文件
os.rename("oldname","new") #重命名文件/目錄
os.stat('path/filename') #獲取文件/目錄信息
os.path.abspath(path) #返回path規範化的絕對路徑
os.path.split(path) #將path分割成目錄和文件名二元組返回
os.path.dirname(path) #返回path的目錄。其實就是os.path.split(path)的第一個元素
os.path.basename(path) #返回path最後的文件名。如果path以/或\結尾,那麼就會返回空值。
os.path.exists(path或者file) #如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) #如果path是絕對路徑,返回True
os.path.isfile(path) #如果path是一個存在的文件,返回True。否則返回False
os.path.isdir(path) #如果path是一個存在的目錄,則返回True。否則返回False
os.path.join(path1[, path2[, ...]]) #將多個路徑組合後返回,第一個絕對路徑之前的參數將被忽略
os.path.getatime(path) #返回path所指向的文件或者目錄的最後存取時間
os.path.getmtime(path) #返回path所指向的文件或者目錄的最後修改時間
os.path.getsize(filename) #返回文件包含的字符數量
參考:https://docs.python.org/3.7/library/os.html?highlight=os#module-os
4.3 optparse
from optparse import OptionParser
usage="python -f <target file> -p/-P <target ports>" #用於顯示幫助信息
parser=OptionParser(usage) #創建對象實例
parser.add_option('-f','--file',type='string',dest='filename') ##需要的命令行參數
parser.add_option('-P','-p',type='string',help='target ports' ,default="20,21",dest='Ports') ## -p/-P 都可以
(options,args)=parser.parse_args()
print(options.filename)
print(options.Ports)
利用add_ option()方法添加選項。-f和--file分別表示長短選項名,長選項可以省略。type指定了 參數類型,默認爲string, dest指定將參數賦值給哪個變量。
利用parse_ args()方法來獲取定義的選項和參數,parse_ args()方法返回兩個值, 其中options對象保存了所傳遞進來的參數值。
通過options. filename和options.address的方式調用參數值。