考書籍《Python極客項目編程》
操作系統Win11。
Python 3.10.5。
電腦連接互聯網。
在命令行窗口使用pip命令(我的電腦上,“pip.exe”文件所在目錄是“D:\Programs\Python\Python310\Scripts”)安裝numpy、matplotlib、scipy等相關包,命令如下:
pip install numpy
pip install matplotlib
pip install scipy
并根據提示使用如下命令升級:
D:\Programs\Python\Python310\python.exe -m pip install --upgrade pip
安裝包相關信息的查看(以numpy為例)
啟動python,進入python提示符,依次鍵入import numpy、print(numpy)、dir(numpy);或者help()、numpy,顯示該模塊的相關信息。(help(numpy)也可以)。
源代碼網址: https://github.com/electronut/pp/blob/master/boids/boids.py
源代碼如下:
"""
boids.py
Implementation of Craig Reynold's BOIDs
Author: Mahesh Venkitachalam
"""
import sys, argparse
import math
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from scipy.spatial.distance import squareform, pdist, cdist
from numpy.linalg import norm
width, height = 640, 480
class Boids:
"""Class that represents Boids simulation"""
def __init__(self, N):
""" initialize the Boid simulation"""
# init position & velocities
self.pos = [width/2.0, height/2.0] + 10*np.random.rand(2*N).reshape(N, 2)
# normalized random velocities
angles = 2*math.pi*np.random.rand(N)
self.vel = np.array(list(zip(np.sin(angles), np.cos(angles))))
self.N = N
# min dist of approach
self.minDist = 25.0
# max magnitude of velocities calculated by "rules"
self.maxRuleVel = 0.03
# max maginitude of final velocity
self.maxVel = 2.0
def tick(self, frameNum, pts, beak):
"""Update the simulation by one time step."""
# get pairwise distances
self.distMatrix = squareform(pdist(self.pos))
# apply rules:
self.vel += self.applyRules()
self.limit(self.vel, self.maxVel)
self.pos += self.vel
self.applyBC()
# update data
pts.set_data(self.pos.reshape(2*self.N)[::2],
self.pos.reshape(2*self.N)[1::2])
vec = self.pos + 10*self.vel/self.maxVel
beak.set_data(vec.reshape(2*self.N)[::2],
vec.reshape(2*self.N)[1::2])
def limitVec(self, vec, maxVal):
"""limit magnitide of 2D vector"""
mag = norm(vec)
if mag > maxVal:
vec[0], vec[1] = vec[0]*maxVal/mag, vec[1]*maxVal/mag
def limit(self, X, maxVal):
"""limit magnitide of 2D vectors in array X to maxValue"""
for vec in X:
self.limitVec(vec, maxVal)
def applyBC(self):
"""apply boundary conditions"""
deltaR = 2.0
for coord in self.pos:
if coord[0] > width + deltaR:
coord[0] = - deltaR
if coord[0] < - deltaR:
coord[0] = width + deltaR
if coord[1] > height + deltaR:
coord[1] = - deltaR
if coord[1] < - deltaR:
coord[1] = height + deltaR
def applyRules(self):
# apply rule #1 - Separation
D = self.distMatrix < 25.0
vel = self.pos*D.sum(axis=1).reshape(self.N, 1) - D.dot(self.pos)
self.limit(vel, self.maxRuleVel)
# different distance threshold
D = self.distMatrix < 50.0
# apply rule #2 - Alignment
vel2 = D.dot(self.vel)
self.limit(vel2, self.maxRuleVel)
vel += vel2;
# apply rule #1 - Cohesion
vel3 = D.dot(self.pos) - self.pos
self.limit(vel3, self.maxRuleVel)
vel += vel3
return vel
def buttonPress(self, event):
"""event handler for matplotlib button presses"""
# left click - add a boid
if event.button is 1:
self.pos = np.concatenate((self.pos,
np.array([[event.xdata, event.ydata]])),
axis=0)
# random velocity
angles = 2*math.pi*np.random.rand(1)
v = np.array(list(zip(np.sin(angles), np.cos(angles))))
self.vel = np.concatenate((self.vel, v), axis=0)
self.N += 1
# right click - scatter
elif event.button is 3:
# add scattering velocity
self.vel += 0.1*(self.pos - np.array([[event.xdata, event.ydata]]))
def tick(frameNum, pts, beak, boids):
#print frameNum
"""update function for animation"""
boids.tick(frameNum, pts, beak)
return pts, beak
# main() function
def main():
# use sys.argv if needed
print('starting boids...')
parser = argparse.ArgumentParser(description="Implementing Craig Reynold's Boids...")
# add arguments
parser.add_argument('--num-boids', dest='N', required=False)
args = parser.parse_args()
# number of boids
N = 100
if args.N:
N = int(args.N)
# create boids
boids = Boids(N)
# setup plot
fig = plt.figure()
ax = plt.axes(xlim=(0, width), ylim=(0, height))
pts, = ax.plot([], [], markersize=10,
c='k', marker='o', ls='None')
beak, = ax.plot([], [], markersize=4,
c='r', marker='o', ls='None')
anim = animation.FuncAnimation(fig, tick, fargs=(pts, beak, boids),
interval=50)
# add a "button press" event handler
cid = fig.canvas.mpl_connect('button_press_event', boids.buttonPress)
plt.show()
# call main
if __name__ == '__main__':
main()
將上述代碼保存為文件“d:\temp\boids.py”。
在命令行窗口執行命令 “python d:\temp\boids.py”,運行結果如下:
要熟練使用 python 解決各種問題,開發工具必不可少,其中就包括 IDE 或者代碼編輯器,或者集成的開發編輯器(IDE),一個好的開發工具可以讓你事半功倍,接下來主要介紹 python 的一些常用的開發工具。
IDLE(Integrated Development and Learning Environment),集成開發和學習環境,是 Python 的集成開發環境,純 Python 下使用 Tkinter 編寫的 IDE。
IDLE 提供了一些針對初學者非常友好的功能,例如:
IPython 主要包含三個組件:增加的交互式 “Python shell”,解耦的雙過程通信模型,交互式并行計算的架構。可以實現并行化計算,同時支持變量自動補全。使用In [x]和Out [x]表示輸入輸出
IPython 提供以下交互性功能:
IPython 支持 Python2.7 版本或者 3.3 以上的版本,通過以下命令安裝 IPython:
pip install ipython
復制代碼
PyCharm 是一個跨平臺的全功能 Python 開發工具,是由 JetBrains 打造的一款 Python IDE (Integrated Development Environment,集成開發環境)。它有兩個版本,一個是免費的社區版本,另一個是面向企業開發者的更先進的專業版本。
Pycharm 是程序員常使用的開發工具,簡單、易用,并且能夠設置不同的主題模式。它還能與 IPython notebook 進行集成,并支持 Anaconda 及其他的科學計算包,比如 matplotlib 和 NumPy。同時它支持很多的第三方 web 開發框架,比如 Django、 Pyramid、web2py、google app engine 和 Flask
PyCharm 具有一些可以幫助開發者提高效率的工具,比如智能代碼補全、調試、語法高亮、項目管理與導航、代碼跳轉、智能提示、圖形化的調試器和運行器、自動完成、單元測試、版本控制、遵循 PEP8 規范的代碼質量檢查、智能重構??????等。
主要功能包括:
Spyder Python 是一個開源的 python 集成開發環境,非常適合用來進行科學計算方面的 python 開發,是用 python 開發的輕量級軟件,遵循 MIT 協議,可免費使用。
Spyder 有一個 Editor(編輯器)用于編寫代碼,Console(控制臺)可以評估代碼并且在任何時候都可以看到運行結果,Variable Explorer(變量管理器)可以查看代碼中定義的變量。
Spyder python 的基本功能包括:
Jupyter 是一款開源 IDE,IPython 的衍生品,它的名字來自 Julia、python、R 三種語言的組合,主要是用來做數據科學。
Jupyter 家族有 Jupyter Notebook、Jupyter Lab、Jupyter Hub 三大產品,前兩者都是基于 Web 的交互式計算環境,Hub 是服務器端的應用。
Jupyter Notebook 的本質是一個 Web 應用程序,便于創建和共享程序文檔,支持實時代碼,數學方程,可視化和 markdown。 用途包括:數據清理和轉換,數值模擬,統計建模,機器學習等。
Windows 打開 Jupyter Notebook 的方法:
Win + R打開運行窗口,輸入 Jupyter Notebook,回車,就會默認在本地 8888 端口啟動一個 web 服務,并自動打開瀏覽器,打開http://localhost:8888/tree頁面,在這個頁面可以看到當前目錄下的所有文件夾以及ipynb文件。
Anaconda 是一款 python 數據科學平臺,安裝它后就默認安裝了 python、IPython、集成開發環境 Spyder 和眾多的包和模塊。Anaconda 包含了 conda、Python 在內的超過 180 個科學包及其依賴項,比如:numpy、pandas、TensorFlow、scipy 等。
PTVS (Python Tools for Visual Studio)在 IronPython Tools for Visual Studio 的代碼基礎上進行了增強并添加了對 Cython、集群的支持,以及諸如 Numpy 和 Scipy 這樣的新模塊。
PTVS 的主要特性包括:CPython、IronPython、Jython 和 PyPy;高級編輯功能如 IntelliSense;多重構;內置 REPL(read-eval-print loop)窗口;調試和分析功能等。
Visual Studio Code(簡稱 VS Code)是微軟開發的免費代碼編輯器,內置對 JavaScript, TypeScript 和 Node.js 的支持,還可以通過豐富的拓展支持 C++, C#, Java, Python, PHP, Go 等語言的開發。通過安裝 Python 插件,VS Code 可以變身為一款輕量級的 Python IDE,具有豐富的功能,包括代碼高亮、自動補全、debug、調試、單元測試、notebook 集成、網站開發等。
Eclipse 是非常流行的 IDE,Eclipse with Pydev 允許開發者創建有用和交互式的 Web 應用。Pydev 是一個運行在 eclipse 上的開源插件,PyDev 是 Eclipse 開發 Python 的 IDE,支持 Python,Jython 和 IronPython 的開發。
PyDev 具有許多功能,包括:
Eric 是一個開源 python 代碼編輯器和集成開發環境,遵循 GPL 協議,免費使用。它是純 python 編寫的,基于 Qt GUI 并集成了強大的 Scintilla 編輯器功能。它提供了一個可靠的插件管理系統,可以通過插件來擴展功能。
Eric 提供了所有的基礎功能,比如調用提示、代碼折疊、代碼高亮、類瀏覽器、代碼覆蓋及分析等等。但是 Eric 的關鍵功能讓它有了與其他商業 python IDE 競爭的能力:
Sublime- Text 是一個用 C++ 和 Python 開發的跨平臺 IDE。除了 Python 之外,它還提供對其他語言的支持。Sublime 有自己的包管理器,開發者可以用來安裝組件,插件和額外的樣式。
Sublime Text 的主要功能包括:
新手比較推薦的是 Pycharm、Jupyter Notebook,前者是目前最受歡迎的 Python IDE,可以進行專業的 python 項目開發,功能極為全面,后者是一款基于 Web 的 Python 工作臺,適合做數據分析、機器學習、可視化、教學演示,對新手非常友好。
原文出處:xie.infoq.cn/article/75c2bbe7f58722a2f9a089424