翻譯:瘋狂的技術宅
https://likegeeks.com/python-...
本文首發微信公衆號:前端先鋒
歡迎關注,天天都給你推送新鮮的前端技術文章前端
Python是一種很是流行的腳本語言,並且功能很是強大,幾乎能夠作任何事情,好比爬蟲、網絡工具、科學計算、樹莓派、Web開發、遊戲等各方面均可以派上用場。同時不管在哪一種平臺上,均可以用 Python 進行系統編程。python
機器學習能夠用一些 Python 庫來實現,好比人工智能經常使用的TensorFlow。也能夠用像 NLTK 這樣的 Python 庫進行天然語言處理(NLP)。程序員
本文討論基本的 Python 編程,後續會寫一些 Python 編程的實際案例。web
Python 中的字符串是不可變的,因此不能直接修改。對字符串內容的任何更改都須要產生新的副本。
在 Python 中處理字符串很是簡單。面試
str = "welcome " + "to Python" print (str)
這是字符串鏈接,你也能夠對字符串作乘法操做:編程
str = "Python" * 2 print (str)
能夠用 str()
函數將非字符串的值轉換爲字符串,而後再鏈接,以下所示:segmentfault
str = "This is test number " + str(15) print (str)
可使用 find()
方法搜索子字符串,以下所示:安全
str = "welcome to Python" print(str.find("Python"))
若是找到了字符串"Python",則 find
方法會返回第一次出現這個字符串的位置。bash
若是沒有找到,則返回 -1。服務器
find
函數默認從第一個字符開始搜索,也能夠從第n個字符開始,以下所示:
str = "welcome to Python" print(str.find("Python",12))
由於咱們從第12個字符開始,因此找不到 Python 這個單詞,因此它會返回 -1。
因此咱們獲得了咱們要搜索的字符串的索引,如今咱們要打印匹配的字符串。
你能夠按索輸出印字符串,以下所示:
str = "first second third" print(str[:2]) print(str[2:]) print(str[3:5]) print(str[-1])
在第 2 行的代碼會打印第一個和第二個字符,而第 3 行會從第二個字符開始打印到結束。要注意代碼中結冒號的位置。字符串從 0 開始計數。
若是使用負數,則會從最後開始計數。第 5 行代碼會打印最後一個字符。
你能夠用以下方法替換字符串:
str = "This website is about programming" str2 = str.replace("This", "That") print(str2)
若是你想替換的字符串屢次出現,可是隻想替換第一次出現的,能夠指定位置:
str = "This website is about programming I like this website" str2 = str.replace("website", "page",1) print(str2)
第一個詞只被替換了。
能夠用 strip
方法去掉字符串兩端的空格,以下所示:
str = " This website is about programming " print(str.strip())
你能夠用rstrip
僅去除最右的空格,或者用 lstrip
去除最左邊的空格。
在某些狀況下你可能須要改變字符的大小寫。
str="Welcome to likegeeks" print(str.upper()) print(str.lower())
前面學到了用 str()
函數將數字轉爲字符串,但這不是 Python 中惟一的轉換函數,另外還有 int()
、float()
、long()
和其餘強制轉換函數。
int()
能夠把輸入的字符串轉爲整數,float()
函數將字符串轉爲float。
str="10" str2="20" print(str+str2) print(int(str)+int(str2))
第 3 行只是鏈接兩個字符串,而第 4 行把兩個值相加並輸出結果。
能夠用min()
找到字符串中 ASCII 值最小的字符,max()
找到最大的字符,用len()
函數獲得字符的總長度。
str="welcome to Python" print(min(str)) print(max(str)) print(len(str))
能夠用 for
迭代字符串並單獨操做每一個字符,以下所示:
str="welcome to likegeeks website" for i in range(len(str)): print(str[i])
其中 len()
函數用來獲得字符串的長度。
若是你使用的是Python 3,默認狀況下全部字符都是 Unicode 字符集編碼,可是若是用的是Python 2,可能須要對字符串進行編碼,以下所示:
str="welcome to Python" str.encode('utf-8')
在 Python 中定義數字變量的方式以下:
a=15
能夠定義整數,也能夠定義浮點數。
浮點數能夠用 int()
函數進行舍入,以下所示:
a=15.5 print(int(a))
能夠用 round()
函數對數字進行舍入:
a=15.5652645 print(round(a,2))
只需指定須要舍入到小數點後幾位。
不少狀況下會用到自定義精度的浮點數。
能夠處理用戶自定義精度數的 decimal 模塊。
這樣導入模塊並使用:
from decimal import * a=Decimal(5.5)
Python 中的 random 模塊提供了生成隨機數的函數。
import random print(random.random())
生成的隨機數介於 0.0 和 1.0 之間。
能夠從本身定義的範圍中生成一個隨機數,以下所示:
import random numbers=[1,2,3,4,5,6,7] print(random.choices(numbers))
你能夠從日期中提取所需的值,以下所示。
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())
能夠獲得兩個時間或日期之間的差,以下所示:
import datetime time1 = datetime.datetime.now() time2 = datetime.datetime.now() timediff = time2 - time1 print(timediff.microseconds())
上例中的 timediff
變量是 timedelta
類型的對象,你也能夠本身建立這種對象:
time1 = datetime.datetime.now() time2 = datetime.timedelta(days=3) time3=time1+time2 print(time3.date())
能夠用 strftime()
格式化日期或時間。
下表指定了一些經常使用的格式選項:
import datetime date1 = datetime.datetime.now() print(date1.strftime('%d. %B %Y %I:%M%p'))
能夠用 strptime()
函數從字符串建立日期,以下所示:
date1=datetime.datetime.strptime(「2015-11-21」, 「%Y-%m-%d」)
也能夠像這樣建立:
date1= datetime.datetime(year=2015, month=11, day=21)
在 Python 中處理文件很是容易,無論你信不信,在所欲語言中是是最簡單的。固然你也能夠說 Python 是一種作什麼事情都最簡單的語言。
shutil
模塊中包含用於複製文件的功能。
import shutil copied_path = shutil.copy('my_file.txt', 'copied_file.txt')
若是 my_file.txt 是一個軟鏈接的話,那麼上面的代碼將會把 copied_file.txt 建立爲獨立的文件。
你也能夠建立一個軟連接的副本,以下所示:
copied_path = shutil.copy('my_file.txt', 'copied_file.txt',follow_symlinks=False)
你能夠像這樣移動一個文件:
import shutil shutil.move('file1.txt', 'file3.txt')
也可使用 os
模塊中的 rename
函數重命名文件,以下所示:
import os os.rename('file1.txt', 'file3.txt')
能夠用 open
函數打開文件,而後再用 read
或write
方法進行讀寫。
fd = open('file1.txt') content = fd.read() print(content)
首先,使用 open
函數打開文件並讀取,而後我再用 read
函數讀取文件內容,最後,將獲得的內容放入變量 content
中。
你能夠指定 read()
()函數讀取的字節數:
fd.read(20)
若是文件不是太大的話,你能夠將整個內容讀入一個列表,而後再遍歷列表打印輸出。
content = fd.readlines() print(content[0])
能夠經過指定打開的模式來寫入文件。有兩種寫入模式,即寫入模式和追加模式。
下面是寫入模式,會覆蓋掉文件中的舊內容。
fd = open('file1.txt','w') content = fd.write('YOUR CONTENT GOES HERE')
下面是附加模式:
fd = open('file1.txt','a') content = fd.write('YOUR CONTENT GOES HERE')
能夠用 os
模塊中的 mkdir
函數建立一個新目錄,以下所示:
import os os.mkdir('./NewFolder)
若是目錄已經存在將會引起錯誤。不過不用擔憂,在之後的文章中會討論異常處理,能夠幫你避免此類錯誤。
能夠用 getmtime()
、 getatime()
和 getctime()
分別獲取修改時間、訪問時間和建立時間。
返回的時間格式爲 Unix 時間戳,咱們能夠把它轉換爲人類可讀的格式,以下所示:
import os import datetime tim=os.path.getctime('./file1.txt') print(datetime.datetime.fromtimestamp(tim))
你能夠用 os
模塊中的 listdir()
函數來獲取文件:
import os files = os.listdir('.') print(files)
此外,你能夠用 glob
模塊執行相同的操做:
import glob files = glob.glob('*') print(files)
你能夠爲 glob()
設定任何一種擴展名,例如設定爲 * .doc
獲取全部word文檔。
此過程用於將 Python 對象序列化爲字節流,以便之後重用。
你能夠用 pickle
模塊作到這一點:
import pickle fd = open('myfile.pk ', 'wb') pickle.dump(mydata,fd)
能夠用 load()
函數反序列化此數據,以下所示:
import pickle fd = open('myfile.pk ', 'rb') mydata = pickle.load(fd)
Python 標準庫使你能夠處理不一樣格式的壓縮文件,如tar,zip,gzip,bzip2。
要處理 zip
文件,你可使用 zipfile
模塊:
import zipfile my_zip = zipfile.ZipFile('zipped_file.zip', mode='r') print(file.namelist())
你能夠把一個文件壓縮成 zip 格式,以下所示:
import zipfile file=zipfile.ZipFile('files.zip','w') file.write('file1.txt') file.close()
能夠用 extractall()
方法提取 zip 壓縮包中的文件:
import zipfile file=zipfile.ZipFile('files.zip','r') file.extractall() file.close()
另外還能夠用附加模式將文件附加到現有的zip文件,以下所示:
import zipfile file=zipfile.ZipFile('files.zip','a') file.write('file2.txt') file.close()
在處理 gz 或 bz 文件時,能夠用和上面相同的套路。不過要導入 gzip
模塊或 bz2
模塊。
import gzip import bz2 gz_file=gzip.GzipFile('files.gz','r') bz_file=bz2.BZ2File('fiels.bz2','r')
而後用一樣的方式讀寫。
你可使用 unrar 包處理rar文件。首先,安裝包:
pip install unrar
而後用一樣的方式使用。
import unrar.rarfile m=unrar.rarfile.RarFile('file.rar') m.namelist() m.extractall()
一個很是有用的包叫作 pandas。它能夠解析 CSV 和 Excel 文件,並輕鬆地從中提取數據。
首先,安裝包
pip install pandas
而後你能夠在本身的代碼中使用它,以下所示:
import pandas data=pandas.read_csv('file.csv)
默認狀況下,Pandas 將第一列視爲每行的標籤。若是列索引不是第一列,則能夠經過傳遞 index_col
參數來指定列索引。
若是文檔中沒有行標籤,則應使用參數 index_col = False
。
要寫入CSV文件,可使用 to_csv()
方法。
data.to_csv('file.csv)
能夠用 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 訪問網絡的方法,它支持許多網絡協議。
import socket host = '192.168.1.5' port = 5050 m_sock = socket.create_connection ((host, port))
這段代碼與 IP 地址爲 192.168.1.5 的主機經過 5050 端口創建鏈接。
打開 socket 後,就能夠發送和接收數據了。
m_sock.sendall(b'Hello World')
注意,我在字符串以前使用了 b 字符,由於數據須要是字節字符串。
若是發送的數據太大,你應該經過循環分割併發送,以下所示:
msg = b'Longer Message Goes Here' mesglen = len(msg) total = 0 while total < msglen: sent = m_sock.send(msg[total:]) total = total + sent
要接收數據,你須要告訴 recv()
方法一次讀入多少個字節。
data_in = m_sock.recv(2000)
這是有效的,由於你可以肯定發送的消息長度小於2000個字節。
若是消息很大,則必須反覆循環,直到收到全部的數據塊。
buffer = bytearray(b' ' * 2000) m_sock.recv_into(buffer)
在這裏定義了一個空緩衝區,而後將消息寫入緩衝區。
poplib
模塊使你能夠與 POP 服務器進行通訊。
import getpass,poplib pop_serv = poplib.POP3('192.168.1.5') pop_serv.user("myuser") pop_serv.pass_(getpass.getpass())
getpass
模塊能夠安全地處理密碼。
若是須要安全鏈接,能夠用 POP3_SSL 類。
要獲取郵件列表和郵件計數,能夠這樣作:
msg_list = pop_serv.list() # to list the messages msg_count = pop_serv.msg_count() # to get message count
處理完畢後,必定要記得關閉全部打開的鏈接。
pop_serv.quit()
能夠用 imaplib
模塊與 IMAP 郵件服務器通訊。
import imaplib, getpass my_imap = imaplib.IMAP4('imap.server.com') my_imap.login("myuser", getpass.getpass())
若是你的 IMAP 服務器上使用 SSL,則應用 IMAP4_SSL 類。
要獲取電子郵件列表,須要先執行查詢操做:
data = my_imap.search(None, 'ALL')
而後,經過迭代 data
變量中的郵件索引獲取郵件內容
msg = my_imap.fetch(email_id, '(RFC822)')
最後,不要忘記關閉鏈接:
my_imap.close() my_imap.logout()
想要經過 SMTP 協議發送電子郵件。能夠用 smtplib
。
import smtplib, getpass my_smtp = smtplib.SMTP(smtp.server.com') my_smtp.login("myuser", getpass.getpass())
若是在 SMTP服務器上使用SSL,則應用 SMTP_SSL 類。
打開鏈接後,你能夠這樣發送郵件:
from_addr = 'me@example.com' to_addr = 'you@example.com' msg = 'From: me@example.com\r\nTo: you@example.com\r\n\r\nHello, this is a test message' my_smtp.sendmail(from_addr, to_addr, msg)
要與Web服務器進行通訊,須要用到 urllib.request
子模塊。
import urllib.request my_web = urllib.request.urlopen('https://www.google.com') print(my_web.read())
若是你想要提交 Web 表單,應該向網頁發送POST請求。
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)
另外還能夠用 mechanize 或 urllib2 模塊,還有不少方法能夠實現這個功能。
socket
類支持偵聽鏈接請求。
import socket host = '' port = 3535 my_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) my_server.bind((host, port)) my_server.listen(1)
如今你能夠接受這樣的鏈接請求:
addr = my_server.accept() print('Connected ... ', addr) data = conn.recv(1024)
最後不要忘記在操做完成後關閉鏈接
conn.close()
併發運行任務是很是有用的,Python 有一個名爲 threading
的模塊,它包含一個 Thread
類。
import threading def print_message(): print('The message got printed from a different thread') my_thread = threading.Thread(target=print_message) my_thread.start()
若是函數須要很長時間才能完成,能夠用 is_alive()
方法檢查它是否仍在運行。
有時你的線程須要安全地訪問全局資源。這時候就須要用到鎖。
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()
使用樹莓派是一種價格便宜的單板電腦,能夠在上面開發各類有趣的應用。
能夠用 Python 的 RPi.GPIO 模塊使樹莓派與外接的傳感器通訊。
首先,在你的樹莓派中安裝包,以下所示:
$ sudo apt-get install python-dev python-rpi.gpio
而後你就能在Python腳本中使用它了。能夠在樹莓派的 GPIO 總線上寫輸出:
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(1, GPIO.OUT, initial=GPIO.LOW) GPIO.output(1, GPIO.HIGH)
你能夠用 RPi.GPIO
模塊從 GPIO 接口讀取數據,以下所示:
import RPi.GPIO RPi.GPIO.setup(1, GPIO.IN) if RPi.GPIO.input(1): print('Input was HIGH') else: print('Input was LOW')
以上只是 Python 的一小部分基礎知識,還有很長的路須要走。
實際上,咱們已經介紹了一小部分Python,還有不少內容須要介紹。未來會有更多的文章來幫助你們學習 Python 這種充滿魅力的語言,請關注我。