Python 編程速成

翻譯:瘋狂的技術宅
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() 格式化日期或時間。

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

  • %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'))

從字符串建立日期

能夠用 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 函數打開文件,而後再用 readwrite 方法進行讀寫。

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對象

此過程用於將 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()

解析CSV文件

一個很是有用的包叫作 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)

解析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 訪問網絡的方法,它支持許多網絡協議。

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)

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

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

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()

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

能夠用 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 表單

若是你想要提交 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 中的線程

併發運行任務是很是有用的,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)

經過樹莓派的GPIO中讀取數據

你能夠用 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 這種充滿魅力的語言,請關注我。


本文首發微信公衆號:前端先鋒

歡迎掃描二維碼關注公衆號,天天都給你推送新鮮的前端技術文章

歡迎掃描二維碼關注公衆號,天天都給你推送新鮮的前端技術文章


歡迎繼續閱讀本專欄其它高贊文章:

相關文章
相關標籤/搜索