少年,看你骨骼精奇。傳你一套Python 編程速成大法哦~

Python是一種非常流行的腳本語言,而且功能非常強大,幾乎可以做任何事情,比如爬蟲、網絡工具、科學計算、樹莓派、Web開發、遊戲等各方面都可以派上用場。同時無論在哪種平臺上,都可以用 Python 進行系統編程。

少年,看你骨骼精奇。傳你一套Python 編程速成大法哦~


機器學習可以用一些 Python 庫來實現,比如人工智能常用的TensorFlow。也可以用像 NLTK 這樣的 Python 庫進行自然語言處理(NLP)。

本文討論基本的 Python 編程,後續會寫一些 Python 編程的實際案例。

操作字符串

Python 中的字符串是不可變的,所以不能直接修改。對字符串內容的任何更改都需要產生新的副本。在 Python 中處理字符串非常簡單。

拼接字符串

<code>str = "welcome " + "to Python" 
print (str) /<code>

這是字符串連接,你也可以對字符串做乘法操作:

重複字符串

str = "Python" * 2 print (str)

與非字符串拼接

可以用 str() 函數將非字符串的值轉換為字符串,然後再連接,如下所示:

<code>str = "This is test number " + str(15) 
print (str)/<code>

搜索子字符串

可以使用 find() 方法搜索子字符串,如下所示:

<code>str = "welcome to Python" 
print(str.find("Python"))/<code>

如果找到了字符串"Python",則 find 方法會返回第一次出現這個字符串的位置。

如果沒有找到,則返回 -1。

find 函數默認從第一個字符開始搜索,也可以從第n個字符開始,如下所示:

<code>str = "welcome to Python" 
print(str.find("Python",12))
/<code>

因為我們從第12個字符開始,所以找不到 Python 這個單詞,所以它會返回 -1。

獲取子字符串

所以我們得到了我們要搜索的字符串的索引,現在我們要打印匹配的字符串。

你可以按索輸出印字符串,如下所示:

<code>str = "first second third" 
print(str[:2])
print(str[2:])
print(str[3:5])
print(str[-1])/<code>

在第 2 行的代碼會打印第一個和第二個字符,而第 3 行會從第二個字符開始打印到結束。要注意代碼中結冒號的位置。字符串從 0 開始計數。

如果使用負數,則會從最後開始計數。第 5 行代碼會打印最後一個字符。

替換字符串

你可以用如下方法替換字符串:

<code>str = "This website is about programming" 
str2 = str.replace("This", "That")
print(str2)/<code>

如果你想替換的字符串多次出現,但是隻想替換第一次出現的,可以指定位置:

<code>str = "This website is about programming I like this website" 
str2 = str.replace("website", "page",1)
print(str2)
/<code>

第一個詞只被替換了。

去除字符串兩端的空格

可以用 strip 方法去掉字符串兩端的空格,如下所示:

<code>str = " This website is about programming "
print(str.strip())/<code>

你可以用rstrip僅去除最右的空格,或者用 lstrip 去除最左邊的空格。

改變字符大小寫

在某些情況下你可能需要改變字符的大小寫。

<code>str="Welcome to likegeeks" 
print(str.upper())
print(str.lower())
/<code>

將字符串轉換為數字

前面學到了用 str()函數將數字轉為字符串,但這不是 Python 中唯一的轉換函數,另外還有 int() 、float()、long()和其他強制轉換函數。

int() 可以把輸入的字符串轉為整數,float() 函數將字符串轉為float。

<code>str="10" 
str2="20"
print(str+str2)
print(int(str)+int(str2))/<code>

第 3 行只是連接兩個字符串,而第 4 行把兩個值相加並輸出結果。

字符串計數

可以用min()找到字符串中 ASCII 值最小的字符,max()找到最大的字符,用len()函數得到字符的總長度。

<code>str="welcome to Python" 
print(min(str))
print(max(str))
print(len(str))/<code>

迭代字符串

可以用 for 迭代字符串並單獨操作每個字符,如下所示:

<code>str="welcome to likegeeks website" 
for i in range(len(str)):
print(str[i])
/<code>

其中 len() 函數用來得到字符串的長度。

字符串編碼

如果你使用的是Python 3,默認情況下所有字符都是 Unicode 字符集編碼,但是如果用的是Python 2,可能需要對字符串進行編碼,如下所示:

<code>str="welcome to Python" 
str.encode('utf-8')/<code>


操作數字

在 Python 中定義數字變量的方式如下:

a=15

可以定義整數,也可以定義浮點數。

浮點數可以用 int()函數進行舍入,如下所示:

<code>a=15.5 
print(int(a))
/<code>

舍入數字

可以用 round() 函數對數字進行舍入:

<code>a=15.5652645
print(round(a,2))/<code>


只需指定需要舍入到小數點後幾位。

自定義精度的數字

很多情況下會用到自定義精度的浮點數。

可以處理用戶自定義精度數的 decimal 模塊。

這樣導入模塊並使用:

<code>from decimal import *

a=Decimal(5.5)
/<code>


生成隨機數

Python 中的 random 模塊提供了生成隨機數的函數。

<code>import random

print(random.random())
/<code>

生成的隨機數介於 0.0 和 1.0 之間。

可以從自己定義的範圍中生成一個隨機數,如下所示:

<code>import random

numbers=[1,2,3,4,5,6,7]
print(random.choices(numbers))
/<code>


操作日期和時間

你可以從日期中提取所需的值,如下所示。

<code>import datetime

cur_date = datetime.datetime.now()
print(cur_date)
print(cur_date.year)
print(cur_date.day)
print(cur_date.weekday())
print(cur_date.month)
print(cur_date.time())

/<code>

可以得到兩個時間或日期之間的差,如下所示:

<code>import datetime

time1 = datetime.datetime.now()
time2 = datetime.datetime.now()
timediff = time2 - time1
print(timediff.microseconds())
/<code>

上例中的 timediff 變量是 timedelta 類型的對象,你也可以自己創建這種對象:

<code>time1 = datetime.datetime.now() 
time2 = datetime.timedelta(days=3)
time3=time1+time2
print(time3.date())/<code>

格式化日期和時間

可以用 strftime() 格式化日期或時間。

下表指定了一些常用的格式選項:

<code>%y 兩位數的年份表示(00-99)
%Y 四位數的年份表示(000-9999)
%m 月份(01-12)

%d 月內中的一天(0-31)
%H 24小時制小時數(0-23)
%I 12小時制小時數(01-12)
%M 分鐘數(00=59)
%S 秒(00-59)
%a 本地簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化的月份名稱
%B 本地完整的月份名稱
%c 本地相應的日期表示和時間表示
%j 年內的一天(001-366)
%p 本地A.M.或P.M.的等價符
%U 一年中的星期數(00-53)星期天為星期的開始
%w 星期(0-6),星期天為星期的開始
%W 一年中的星期數(00-53)星期一為星期的開始
%x 本地相應的日期表示
%X 本地相應的時間表示
%Z 當前時區的名稱
%% %號本身
import datetime

date1 = datetime.datetime.now()
print(date1.strftime('%d. %B %Y %I:%M%p'))/<code>

從字符串創建日期

可以用 strptime()函數從字符串創建日期,如下所示:

date1=datetime.datetime.strptime(“2015-11-21”, “%Y-%m-%d”)

也可以像這樣創建:

date1= datetime.datetime(year=2015, month=11, day=21)

處理文件系統

在 Python 中處理文件非常容易,不管你信不信,在所欲語言中是是最簡單的。當然你也可以說 Python 是一種做什麼事情都最簡單的語言。

複製文件

shutil 模塊中包含用於複製文件的功能。

<code>import shutil 
copied_path = shutil.copy('my_file.txt', 'copied_file.txt')
/<code>

如果 my_file.txt 是一個軟連接的話,那麼上面的代碼將會把 copied_file.txt 創建為獨立的文件。

你也可以創建一個軟鏈接的副本,如下所示:

copied_path = shutil.copy('my_file.txt', 'copied_file.txt',follow_symlinks=False)

移動文件

你可以像這樣移動一個文件:

<code>import shutil 
shutil.move('file1.txt', 'file3.txt')
/<code>

也可以使用 os 模塊中的 rename 函數重命名文件,如下所示:

<code>import os 
os.rename('file1.txt', 'file3.txt')/<code>


讀寫文本文件

可以用 open 函數打開文件,然後再用 read 或write 方法進行讀寫。

<code>fd = open('file1.txt') 
content = fd.read()
print(content)/<code>


首先,使用 open 函數打開文件並讀取,然後我再用 read 函數讀取文件內容,最後,將得到的內容放入變量 content 中。

你可以指定 read()()函數讀取的字節數:

fd.read(20)

如果文件不是太大的話,你可以將整個內容讀入一個列表,然後再遍歷列表打印輸出。

<code>content = fd.readlines() 
print(content[0])/<code>


可以通過指定打開的模式來寫入文件。有兩種寫入模式,即寫入模式和追加模式。

下面是寫入模式,會覆蓋掉文件中的舊內容。

<code>fd = open('file1.txt','w') 
content = fd.write('YOUR CONTENT GOES HERE')
/<code>

下面是附加模式:

<code>fd = open('file1.txt','a') 
content = fd.write('YOUR CONTENT GOES HERE')
/<code>

創建目錄

可以用 os模塊中的 mkdir 函數創建一個新目錄,如下所示:

<code>import os

os.mkdir('./NewFolder)
/<code>


如果目錄已經存在將會引發錯誤。不過不用擔心,在以後的文章中會討論異常處理,可以幫你避免此類錯誤。

獲取訪問和修改以及創建時間可以用 getmtime()、 getatime() 和 getctime() 分別獲取修改時間、訪問時間和創建時間。

返回的時間格式為 Unix 時間戳,我們可以把它轉換為人類可讀的格式,如下所示:

<code>import os 
import datetime

tim=os.path.getctime('./file1.txt')
print(datetime.datetime.fromtimestamp(tim))
/<code>


迭代文件

你可以用 os 模塊中的 listdir() 函數來獲取文件:

<code>import os

files = os.listdir('.')
print(files)
/<code>


此外,你可以用 glob 模塊執行相同的操作:

<code>import glob 
files = glob.glob('*')
print(files)/<code>


你可以為 glob()設定任何一種擴展名,例如設定為 * .doc 獲取所有word文檔。

序列化Python對象

此過程用於將 Python 對象序列化為字節流,以便以後重用。

你可以用 pickle 模塊做到這一點:

<code>import pickle

fd = open('myfile.pk ', 'wb')
pickle.dump(mydata,fd)
/<code>


可以用 load() 函數反序列化此數據,如下所示:

<code>import pickle

fd = open('myfile.pk ', 'rb')
mydata = pickle.load(fd)
/<code>


壓縮文件

Python 標準庫使你可以處理不同格式的壓縮文件,如tar,zip,gzip,bzip2。

要處理 zip文件,你可以使用 zipfile模塊:

<code>import zipfile

my_zip = zipfile.ZipFile('zipped_file.zip', mode='r')
print(file.namelist())
/<code>


你可以把一個文件壓縮成 zip 格式,如下所示:

<code>import zipfile

file=zipfile.ZipFile('files.zip','w')
file.write('file1.txt')
file.close()
/<code>


可以用 extractall() 方法提取 zip 壓縮包中的文件:

<code>import zipfile

file=zipfile.ZipFile('files.zip','r')
file.extractall()
file.close()
/<code>


另外還可以用附加模式將文件附加到現有的zip文件,如下所示:

<code>import zipfile

file=zipfile.ZipFile('files.zip','a')
file.write('file2.txt')
file.close()
/<code>


在處理 gz 或 bz 文件時,可以用和上面相同的套路。不過要導入 gzip 模塊或 bz2 模塊。

<code>import gzip 
import bz2

gz_file=gzip.GzipFile('files.gz','r')
bz_file=bz2.BZ2File('fiels.bz2','r')
/<code>


然後用同樣的方式讀寫。

你可以使用 unrar 包處理rar文件。首先,安裝包:

pip install unrar

然後用同樣的方式使用。

<code>import unrar.rarfile

m=unrar.rarfile.RarFile('file.rar')
m.namelist()
m.extractall()
/<code>


解析CSV文件

一個非常有用的包叫做 pandas。它可以解析 CSV 和 Excel 文件,並輕鬆地從中提取數據。

首先,安裝包

pip install pandas

然後你可以在自己的代碼中使用它,如下所示:

<code>import pandas

data=pandas.read_csv('file.csv)
/<code>


默認情況下,Pandas 將第一列視為每行的標籤。如果列索引不是第一列,則可以通過傳遞 index_col 參數來指定列索引。

如果文檔中沒有行標籤,則應使用參數 index_col = False。

要寫入CSV文件,可以使用 to_csv() 方法。

data.to_csv('file.csv)

解析Excel文件

可以用 pandas 模塊中的 read_excel() 方法來解析excel文件。

data = pd.read_excel('file.xls', sheetname='Sheet1')

如果有多個工作表,可以這樣加載:

ta = pd.ExcelFile('file.xls')

這樣寫入excel文件:

ta.to_excel('file.xls', sheet='Sheet1')

網絡和連接

Python 有一個 socket 類,它提供了一種通過低級 API 訪問網絡的方法,它支持許多網絡協議。

<code>import socket 
host = '192.168.1.5'
port = 5050

m_sock = socket.create_connection ((host, port))/<code>


這段代碼與 IP 地址為 192.168.1.5 的主機通過 5050 端口建立連接。

打開 socket 後,就可以發送和接收數據了。

m_sock.sendall(b'Hello World')

注意,我在字符串之前使用了 b 字符,因為數據需要是字節字符串。

如果發送的數據太大,你應該通過循環分割併發送,如下所示:

<code>msg = b'Longer Message Goes Here' 
mesglen = len(msg)
total = 0
while total < msglen:
sent = m_sock.send(msg[total:])
total = total + sent/<code>


要接收數據,你需要告訴 recv() 方法一次讀入多少個字節。

data_in = m_sock.recv(2000)

這是有效的,因為你能夠確定發送的消息長度小於2000個字節。

如果消息很大,則必須反覆循環,直到收到所有的數據塊。

<code>buffer = bytearray(b' ' * 2000)  

m_sock.recv_into(buffer)/<code>


在這裡定義了一個空緩衝區,然後將消息寫入緩衝區。

從POP郵件服務器接收電子郵件 poplib 模塊使你可以與 POP 服務器進行通信。

<code>import getpass,poplib

pop_serv = poplib.POP3('192.168.1.5')
pop_serv.user("myuser")
pop_serv.pass_(getpass.getpass())
/<code>


getpass 模塊可以安全地處理密碼。

如果需要安全連接,可以用 POP3_SSL 類。

要獲取郵件列表和郵件計數,可以這樣做:

<code>msg_list = pop_serv.list() # to list the messages 
msg_count = pop_serv.msg_count() # to get message count/<code>


處理完畢後,一定要記得關閉所有打開的連接。

pop_serv.quit()

從IMAP郵件服務器接收電子郵件

可以用 imaplib 模塊與 IMAP 郵件服務器通信。

<code>import imaplib, getpass

my_imap = imaplib.IMAP4('imap.server.com')
my_imap.login("myuser", getpass.getpass())
/<code>


如果你的 IMAP 服務器上使用 SSL,則應用 IMAP4_SSL 類。

要獲取電子郵件列表,需要先執行查詢操作:

data = my_imap.search(None, 'ALL')

然後,通過迭代 data 變量中的郵件索引獲取郵件內容

msg = my_imap.fetch(email_id, '(RFC822)')

最後,不要忘記關閉連接:

<code>my_imap.close() 
my_imap.logout()/<code>


發送電子郵件

想要通過 SMTP 協議發送電子郵件。可以用 smtplib 。

<code>import smtplib, getpass

my_smtp = smtplib.SMTP(smtp.server.com')
my_smtp.login("myuser", getpass.getpass())

/<code>

如果在 SMTP服務器上使用SSL,則應用 SMTP_SSL 類。

打開連接後,你可以這樣發送郵件:

<code>from_addr = '[email protected]' 
to_addr = '[email protected]'
msg = 'From: [email protected]\\r\\nTo: [email protected]\\r\\n\\r\\nHello, this is a test message'
my_smtp.sendmail(from_addr, to_addr, msg)/<code>


抓取網頁

要與Web服務器進行通信,需要用到 urllib.request 子模塊。

<code>import urllib.request

my_web = urllib.request.urlopen('https://www.google.com')
print(my_web.read())
/<code>


提交 Web 表單

如果你想要提交 Web 表單,應該向網頁發送POST請求。

<code>import urllib.request 
my_data = b'Your Data Goes Here'
my_req = urllib.request.Request('http://localhost', data=my_data,method='POST')
my_frm = urllib.request.urlopen(my_req)
print(my_frm.status)/<code>

另外還可以用 mechanize或 urllib2 模塊,還有很多方法可以實現這個功能。

創建一個微型服務器

socket 類支持偵聽連接請求。

<code>import socket

host = ''
port = 3535
my_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
my_server.bind((host, port))
my_server.listen(1)
/<code>

現在你可以接受這樣的連接請求:

<code>addr = my_server.accept() 
print('Connected ... ', addr)
data = conn.recv(1024)/<code>

最後不要忘記在操作完成後關閉連接

conn.close()

Python 中的線程

併發運行任務是非常有用的,Python 有一個名為 threading 的模塊,它包含一個 Thread 類。

<code>import threading 
def print_message():
print('The message got printed from a different thread')
my_thread = threading.Thread(target=print_message)
my_thread.start()/<code>

如果函數需要很長時間才能完成,可以用 is_alive()方法檢查它是否仍在運行。

有時你的線程需要安全地訪問全局資源。這時候就需要用到鎖。

<code>import threading
num = 1
my_lock = threading.Lock()
def my_func():
global num, my_lock
my_lock.acquire()
sum = num + 1
print(sum)
my_lock.release()
my_thread = threading.Thread(target=my_func)
my_thread.start()/<code>

使用樹莓派

使用樹莓派是一種價格便宜的單板電腦,可以在上面開發各種有趣的應用。

可以用 Python 的 RPi.GPIO 模塊使樹莓派與外接的傳感器通信。

首先,在你的樹莓派中安裝包,如下所示:

$ sudo apt-get install python-dev python-rpi.gpio

然後你就能在Python腳本中使用它了。可以在樹莓派的 GPIO 總線上寫輸出:

<code>import RPi.GPIO as GPIO 
GPIO.setmode(GPIO.BOARD)
GPIO.setup(1, GPIO.OUT, initial=GPIO.LOW)
GPIO.output(1, GPIO.HIGH)/<code>

通過樹莓派的GPIO中讀取數據你可以用 RPi.GPIO 模塊從 GPIO 接口讀取數據,如下所示:

<code>import RPi.GPIO 
RPi.GPIO.setup(1, GPIO.IN)
if RPi.GPIO.input(1):

print('Input was HIGH')
else:
print('Input was LOW')/<code>

以上只是 Python 的一小部分基礎知識,還有很長的路需要走。

最後,小編想說:我是一名python開發工程師,

整理了一套最新的python系統學習教程,

想要這些資料的可以關注私信小編“01”即可(免費分享哦)希望能對你有所幫助


分享到:


相關文章: