導航:首頁 > 編程語言 > python能模擬出地層嗎

python能模擬出地層嗎

發布時間:2023-04-18 17:57:17

1. ue5python原理

Python先把代碼(.py文件)編譯成位元組碼,交給位元組碼虛擬機,然後解釋器一條一條執行位元組碼指令,從而完成程序的執行。

1.1python先把代碼(.py文件)編譯成位元組碼,交給位元組碼虛擬機,然後解釋器會從編譯得到的PyCodeObject對象中一條一條執行位元組碼指令,
並在當前的上下文環境中執行這條位元組碼指令,從而完成程序的執行。Python解釋器實際上是在模擬操作中執行文件的過程。PyCodeObject對象
中包含了位元組碼指令以及程序的所有靜態信息,但沒有包含程序運行時的動態信息——執行環境(PyFrameObject)

2. 位元組碼
位元組碼在python解釋器程序里對應的是PyCodeObject對象
.pyc文件是位元組碼在磁碟上的表現形式

2.1從整體上看:OS中執行程序離不開兩個概念:進程和線程。python中模擬了這兩個概念,模擬進程和線程的分別是PyInterpreterState和
PyTreadState。即:每個PyThreadState都對應著一個幀棧,python解釋器在多個線程上切換。當python解釋器開始執行時,它會先進行一
些初始化操作,最後進入PyEval_EvalFramEx函數,它的作用是不斷讀取編譯好的位元組碼,並一條一條執行,類似CPU執行指令的過程。函數內部
主要是一個switch結構,根據位元組碼的不同執行不同的代碼。

3. .pyc文件
PyCodeObject對象的創建時機是模塊載入的時候,及import
Python test.py會對test.py進行編譯成位元組碼並解釋執行,但是不會生成test.pyc
如果test.py載入了其他模塊,如import urlib2, Python會對urlib2.py進行編譯成位元組碼,生成urlib2.pyc,然後對位元組碼進行解釋
如果想生成test.pyc,我們可以使用Python內置模塊py_compile來編譯。
載入模塊時,如果同時存在.py和pyc,Python會嘗試使用.pyc,如果.pyc的編譯時間早於.py的修改時間,則重新編譯.py並更新.pyc。

4. PyCodeObject
Python代碼的編譯結果就是PyCodeObject對象

typedef struct {
PyObject_HEAD
int co_argcount; /* 位置參數個數 */
int co_nlocals; /* 局部變數個數 */
int co_stacksize; /* 棧大小 */
int co_flags;
PyObject *co_code; /* 位元組碼指令序列 */
PyObject *co_consts; /* 所有常量集合 */
PyObject *co_names; /* 所有符號名稱集合 */
PyObject *co_varnames; /* 局部變數名稱集合 */
PyObject *co_freevars; /* 閉包用的的變數名集合 */
PyObject *co_cellvars; /* 內部嵌套函數引用的變數名集合 */
/* The rest doesn』t count for hash/cmp */
PyObject *co_filename; /* 代碼所在文件名 */
PyObject *co_name; /* 模塊名|函數名|類名 */
int co_firstlineno; /* 代碼塊在文件中的起始行號 */
PyObject *co_lnotab; /* 位元組碼指令和行號的對應關系 */
void *co_zombieframe; /* for optimization only (see frameobject.c) */
} PyCodeObject;

5. .pyc文件格式
載入模塊時,模塊對應的PyCodeObject對象被寫入.pyc文件

6.分析位元組碼

6.1解析PyCodeObject
Python提供了內置函數compile可以編譯python代碼和查看PyCodeObject對象

6.2指令序列co_code的格式

opcode oparg opcode opcode oparg …
1 byte 2 bytes 1 byte 1 byte 2 bytes
Python內置的dis模塊可以解析co_code

7. 執行位元組碼
Python解釋器的原理就是模擬可執行程序再X86機器上的運行,X86的運行時棧幀如下圖

Python解釋器的原理就是模擬上述行為。當發生函數調用時,創建新的棧幀,對應Python的實現就是PyFrameObject對象。
PyFrameObject對象創建程序運行時的動態信息,即執行環境

7.1 PyFrameObject

typedef struct _frame{
PyObject_VAR_HEAD //"運行時棧"的大小是不確定的
struct _frame *f_back; //執行環境鏈上的前一個frame,很多個PyFrameObject連接起來形成執行環境鏈表
PyCodeObject *f_code; //PyCodeObject 對象,這個frame就是這個PyCodeObject對象的上下文環境
PyObject *f_builtins; //builtin名字空間
PyObject *f_globals; //global名字空間
PyObject *f_locals; //local名字空間
PyObject **f_valuestack; //"運行時棧"的棧底位置
PyObject **f_stacktop; //"運行時棧"的棧頂位置
//...
int f_lasti; //上一條位元組碼指令在f_code中的偏移位置
int f_lineno; //當前位元組碼對應的源代碼行
//...

//動態內存,維護(局部變數+cell對象集合+free對象集合+運行時棧)所需要的空間
PyObject *f_localsplus[1];
} PyFrameObject;

每一個 PyFrameObject對象都維護了一個 PyCodeObject對象,這表明每一個 PyFrameObject中的動態內存空間對象都和源代碼中的一段Code相對應。

2. 一篇文章帶你深度解析Python線程和進程

使用Python中的線程模塊,能夠同時運行程序的不同部分,並簡化設計。如果你已經入門Python,並且想用線程來提升程序運行速度的話,希望這篇教程會對你有所幫助。

線程與進程

什麼是進程

進程是系統進行資源分配和調度的一個獨立單位 進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。每個進程都有自己的獨立內存空間,不同進程通過進程間通信來通信。由於進程比較重量,占據獨立的內存,所以上下文進程間的切換開銷(棧、寄存器、虛擬內存、文件句柄等)比較大,但相對比較穩定安全。

什麼是線程

CPU調度和分派的基本單位 線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。線程間通信主要通過共享內存,上下文切換很快,資源開銷較少,但相比進程不夠穩定容易丟失數據。

進程與線程的關系圖

線程與進程的區別:

進程

現實生活中,有很多的場景中的事情是同時進行的,比如開車的時候 手和腳共同來駕駛 汽車 ,比如唱歌跳舞也是同時進行的,再比如邊吃飯邊打電話;試想如果我們吃飯的時候有一個領導來電,我們肯定是立刻就接聽了。但是如果你吃完飯再接聽或者回電話,很可能會被開除。

注意:

多任務的概念

什麼叫 多任務 呢?簡單地說,就是操作系統可以同時運行多個任務。打個比方,你一邊在用瀏覽器上網,一邊在聽MP3,一邊在用Word趕作業,這就是多任務,至少同時有3個任務正在運行。還有很多任務悄悄地在後台同時運行著,只是桌面上沒有顯示而已。

現在,多核CPU已經非常普及了,但是,即使過去的單核CPU,也可以執行多任務。由於CPU執行代碼都是順序執行的,那麼,單核CPU是怎麼執行多任務的呢?

答案就是操作系統輪流讓各個任務交替執行,任務1執行0.01秒,切換到任務2,任務2執行0.01秒,再切換到任務3,執行0.01秒,這樣反復執行下去。表面上看,每個任務都是交替執行的,但是,由於CPU的執行速度實在是太快了,我們感覺就像所有任務都在同時執行一樣。

真正的並行執行多任務只能在多核CPU上實現,但是,由於任務數量遠遠多於CPU的核心數量,所以,操作系統也會自動把很多任務輪流調度到每個核心上執行。 其實就是CPU執行速度太快啦!以至於我們感受不到在輪流調度。

並行與並發

並行(Parallelism)

並行:指兩個或兩個以上事件(或線程)在同一時刻發生,是真正意義上的不同事件或線程在同一時刻,在不同CPU資源呢上(多核),同時執行。

特點

並發(Concurrency)

指一個物理CPU(也可以多個物理CPU) 在若幹道程序(或線程)之間多路復用,並發性是對有限物理資源強制行使多用戶共享以提高效率。

特點

multiprocess.Process模塊

process模塊是一個創建進程的模塊,藉助這個模塊,就可以完成進程的創建。

語法:Process([group [, target [, name [, args [, kwargs]]]]])

由該類實例化得到的對象,表示一個子進程中的任務(尚未啟動)。

注意:1. 必須使用關鍵字方式來指定參數;2. args指定的為傳給target函數的位置參數,是一個元祖形式,必須有逗號。

參數介紹:

group:參數未使用,默認值為None。

target:表示調用對象,即子進程要執行的任務。

args:表示調用的位置參數元祖。

kwargs:表示調用對象的字典。如kwargs = {'name':Jack, 'age':18}。

name:子進程名稱。

代碼:

除了上面這些開啟進程的方法之外,還有一種以繼承Process的方式開啟進程的方式:

通過上面的研究,我們千方百計實現了程序的非同步,讓多個任務可以同時在幾個進程中並發處理,他們之間的運行沒有順序,一旦開啟也不受我們控制。盡管並發編程讓我們能更加充分的利用IO資源,但是也給我們帶來了新的問題。

當多個進程使用同一份數據資源的時候,就會引發數據安全或順序混亂問題,我們可以考慮加鎖,我們以模擬搶票為例,來看看數據安全的重要性。

加鎖可以保證多個進程修改同一塊數據時,同一時間只能有一個任務可以進行修改,即串列的修改。加鎖犧牲了速度,但是卻保證了數據的安全。

因此我們最好找尋一種解決方案能夠兼顧:1、效率高(多個進程共享一塊內存的數據)2、幫我們處理好鎖問題。

mutiprocessing模塊為我們提供的基於消息的IPC通信機制:隊列和管道。隊列和管道都是將數據存放於內存中 隊列又是基於(管道+鎖)實現的,可以讓我們從復雜的鎖問題中解脫出來, 我們應該盡量避免使用共享數據,盡可能使用消息傳遞和隊列,避免處理復雜的同步和鎖問題,而且在進程數目增多時,往往可以獲得更好的可獲展性( 後續擴展該內容 )。

線程

Python的threading模塊

Python 供了幾個用於多線程編程的模塊,包括 thread, threading 和 Queue 等。thread 和 threading 模塊允許程序員創建和管理線程。thread 模塊 供了基本的線程和鎖的支持,而 threading 供了更高級別,功能更強的線程管理的功能。Queue 模塊允許用戶創建一個可以用於多個線程之間 共享數據的隊列數據結構。

python創建和執行線程

創建線程代碼

1. 創建方法一:

2. 創建方法二:

進程和線程都是實現多任務的一種方式,例如:在同一台計算機上能同時運行多個QQ(進程),一個QQ可以打開多個聊天窗口(線程)。資源共享:進程不能共享資源,而線程共享所在進程的地址空間和其他資源,同時,線程有自己的棧和棧指針。所以在一個進程內的所有線程共享全局變數,但多線程對全局變數的更改會導致變數值得混亂。

代碼演示:

得到的結果是:

首先需要明確的一點是GIL並不是Python的特性,它是在實現Python解析器(CPython)時所引入的一個概念。就好比C++是一套語言(語法)標准,但是可以用不同的編譯器來編譯成可執行代碼。同樣一段代碼可以通過CPython,PyPy,Psyco等不同的Python執行環境來執行(其中的JPython就沒有GIL)。

那麼CPython實現中的GIL又是什麼呢?GIL全稱Global Interpreter Lock為了避免誤導,我們還是來看一下官方給出的解釋:

主要意思為:

因此,解釋器實際上被一個全局解釋器鎖保護著,它確保任何時候都只有一個Python線程執行。在多線程環境中,Python 虛擬機按以下方式執行:

由於GIL的存在,Python的多線程不能稱之為嚴格的多線程。因為 多線程下每個線程在執行的過程中都需要先獲取GIL,保證同一時刻只有一個線程在運行。

由於GIL的存在,即使是多線程,事實上同一時刻只能保證一個線程在運行, 既然這樣多線程的運行效率不就和單線程一樣了嗎,那為什麼還要使用多線程呢?

由於以前的電腦基本都是單核CPU,多線程和單線程幾乎看不出差別,可是由於計算機的迅速發展,現在的電腦幾乎都是多核CPU了,最少也是兩個核心數的,這時差別就出來了:通過之前的案例我們已經知道,即使在多核CPU中,多線程同一時刻也只有一個線程在運行,這樣不僅不能利用多核CPU的優勢,反而由於每個線程在多個CPU上是交替執行的,導致在不同CPU上切換時造成資源的浪費,反而會更慢。即原因是一個進程只存在一把gil鎖,當在執行多個線程時,內部會爭搶gil鎖,這會造成當某一個線程沒有搶到鎖的時候會讓cpu等待,進而不能合理利用多核cpu資源。

但是在使用多線程抓取網頁內容時,遇到IO阻塞時,正在執行的線程會暫時釋放GIL鎖,這時其它線程會利用這個空隙時間,執行自己的代碼,因此多線程抓取比單線程抓取性能要好,所以我們還是要使用多線程的。

GIL對多線程Python程序的影響

程序的性能受到計算密集型(CPU)的程序限制和I/O密集型的程序限制影響,那什麼是計算密集型和I/O密集型程序呢?

計算密集型:要進行大量的數值計算,例如進行上億的數字計算、計算圓周率、對視頻進行高清解碼等等。這種計算密集型任務雖然也可以用多任務完成,但是花費的主要時間在任務切換的時間,此時CPU執行任務的效率比較低。

IO密集型:涉及到網路請求(time.sleep())、磁碟IO的任務都是IO密集型任務,這類任務的特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成(因為IO的速度遠遠低於CPU和內存的速度)。對於IO密集型任務,任務越多,CPU效率越高,但也有一個限度。

當然為了避免GIL對我們程序產生影響,我們也可以使用,線程鎖。

Lock&RLock

常用的資源共享鎖機制:有Lock、RLock、Semphore、Condition等,簡單給大家分享下Lock和RLock。

Lock

特點就是執行速度慢,但是保證了數據的安全性

RLock

使用鎖代碼操作不當就會產生死鎖的情況。

什麼是死鎖

死鎖:當線程A持有獨占鎖a,並嘗試去獲取獨占鎖b的同時,線程B持有獨占鎖b,並嘗試獲取獨占鎖a的情況下,就會發生AB兩個線程由於互相持有對方需要的鎖,而發生的阻塞現象,我們稱為死鎖。即死鎖是指多個進程因競爭資源而造成的一種僵局,若無外力作用,這些進程都將無法向前推進。

所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確定資源的合理分配演算法,避免進程永久占據系統資源。

死鎖代碼

python線程間通信

如果各個線程之間各干各的,確實不需要通信,這樣的代碼也十分的簡單。但這一般是不可能的,至少線程要和主線程進行通信,不然計算結果等內容無法取回。而實際情況中要復雜的多,多個線程間需要交換數據,才能得到正確的執行結果。

python中Queue是消息隊列,提供線程間通信機制,python3中重名為為queue,queue模塊塊下提供了幾個阻塞隊列,這些隊列主要用於實現線程通信。

在 queue 模塊下主要提供了三個類,分別代表三種隊列,它們的主要區別就在於進隊列、出隊列的不同。

簡單代碼演示

此時代碼會阻塞,因為queue中內容已滿,此時可以在第四個queue.put('蘋果')後面添加timeout,則成為 queue.put('蘋果',timeout=1)如果等待1秒鍾仍然是滿的就會拋出異常,可以捕獲異常。

同理如果隊列是空的,無法獲取到內容默認也會阻塞,如果不阻塞可以使用queue.get_nowait()。

在掌握了 Queue 阻塞隊列的特性之後,在下面程序中就可以利用 Queue 來實現線程通信了。

下面演示一個生產者和一個消費者,當然都可以多個

使用queue模塊,可在線程間進行通信,並保證了線程安全。

協程

協程,又稱微線程,纖程。英文名Coroutine。

協程是python個中另外一種實現多任務的方式,只不過比線程更小佔用更小執行單元(理解為需要的資源)。為啥說它是一個執行單元,因為它自帶CPU上下文。這樣只要在合適的時機, 我們可以把一個協程 切換到另一個協程。只要這個過程中保存或恢復 CPU上下文那麼程序還是可以運行的。

通俗的理解:在一個線程中的某個函數,可以在任何地方保存當前函數的一些臨時變數等信息,然後切換到另外一個函數中執行,注意不是通過調用函數的方式做到的,並且切換的次數以及什麼時候再切換到原來的函數都由開發者自己確定。

在實現多任務時,線程切換從系統層面遠不止保存和恢復 CPU上下文這么簡單。操作系統為了程序運行的高效性每個線程都有自己緩存Cache等等數據,操作系統還會幫你做這些數據的恢復操作。所以線程的切換非常耗性能。但是協程的切換只是單純的操作CPU的上下文,所以一秒鍾切換個上百萬次系統都抗的住。

greenlet與gevent

為了更好使用協程來完成多任務,除了使用原生的yield完成模擬協程的工作,其實python還有的greenlet模塊和gevent模塊,使實現協程變的更加簡單高效。

greenlet雖說實現了協程,但需要我們手工切換,太麻煩了,gevent是比greenlet更強大的並且能夠自動切換任務的模塊。

其原理是當一個greenlet遇到IO(指的是input output 輸入輸出,比如網路、文件操作等)操作時,比如訪問網路,就自動切換到其他的greenlet,等到IO操作完成,再在適當的時候切換回來繼續執行。

模擬耗時操作:

如果有耗時操作也可以換成,gevent中自己實現的模塊,這時候就需要打補丁了。

使用協程完成一個簡單的二手房信息的爬蟲代碼吧!

以下文章來源於Python專欄 ,作者宋宋

文章鏈接:https://mp.weixin.qq.com/s/2r3_ipU3HjdA5VnqSHjUnQ

3. python能做什麼

1、做日常任務,比如下載視頻、MP3、自動化操作excel、自動發郵件。

2、做網站開發、web應用開發,很多著名的網站像知乎、YouTube就是Python寫的。

許多大型網站就是用Python開發的,例如YouTube、Instagram,還有國內的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美國航空航天局)都大量地使用Python。

3、做網路游戲的後台,很多在線游戲的後台都是Python開發的。

4、系統網路運維

Linux運維是必須而且一定要掌握Python語言,它可以滿足Linux運維工程師的工作需求提升效率,總而提升自己的能力,運維工程師需要自己獨態穗立開發一個完整的自動化系統時,這個時候才是真正價值的體現,才能證明自身的能力,讓老闆重視。



5、3D游戲開發

Python也可以用來做游戲開發,因為它有很好的3D渲染庫和游戲開發框架,目前來說就有很多使用Python開發的游戲,如迪斯尼卡通城、黑暗之刃。

6、科學與數字計算

我們都知道現在來臨了大數據的時代,數據可以說明一切問題的原因,現在很多做數據分析的不是原來那麼簡單,Python語言成為了做數據分析師的第一首選,它同時可以給工作帶來很大的效率。

7、人工智慧

人工智慧是一門極富挑戰性的科學,帆散卜從事這項工作的人必須懂得計算機知識,心理學和哲學。人工智慧是包括十分廣泛的科學,它由不同的領域掘胡組成,如機器學習,計算機視覺等等,總的說來,人工智慧研究的一個主要目標是使機器能夠勝任一些通常需要人類智能才能完成的復雜工作。Python語言對於人工智慧來說是最好的語言。目前好多人都開始學習人工智慧+Python學科。

8、網路爬蟲

爬蟲是屬於運營的比較多的一個場景吧,比如谷歌的爬蟲早期就是用跑Python寫的. 其中有一個庫叫 Requests ,這個庫是一個模擬HTTP請求的一個庫,非常的出名! 學過Python的人沒有不知道這個庫吧,爬取後的數據分析與計算是Python最為擅長的領域,非常容易整合。不過目前Python比較流行的網路爬蟲框架是功能非常強大的scrapy。

9、數據分析

一般我們用爬蟲爬到了大量的數據之後,我們需要處理數據用來分析,不然爬蟲白爬了,我們最終的目的就是分析數據,在這方面 關於數據分析的庫也是非常的豐富的,各種圖形分析圖等 都可以做出來。也是非常的方便,其中諸如Seaborn這樣的可視化庫,能夠僅僅使用一兩行就對數據進行繪圖,而利用Pandas和numpy、scipy則可以簡單地對大量數據進行篩選、回歸等計算。

而後續復雜計算中,對接機器學習相關演算法,或者提供Web訪問介面,或是實現遠程調用介面,都非常簡單。

4. Python數據結構-隊列與廣度優先搜索(Queue)

隊列(Queue) :簡稱為隊,一種線性表數據結構,是一種只允許在表的一端進行插入操作,而在表的另一端進行刪除操作的線性表。
我們把隊列中允許插入的一端稱為 「隊尾(rear)」 ;把允許刪除的另一端稱為 「隊頭(front)」 。當表中沒有任何數據元素時,稱之為 「空隊」

廣度優先搜索演算法(Breadth First Search) :簡稱為 BFS,又譯作寬度優先搜索 / 橫向優先搜索。是一種用於遍歷或搜索樹或圖的演算法。該演算法從根節點開始,沿著樹的寬度遍歷樹或圖的節點。如果所有節點均被訪問,則演算法中止。

廣度優先遍歷 類似於樹的層次遍歷過程 。呈現出一層一層向外擴張的特點。先看到的節點先訪問,後看到的節點後訪問。遍歷到的節點順序符合「先進先出」的特點,所以廣度優先搜索可以通過「隊列」來實現。

力扣933

游戲時,隊首始終是持有土豆的人
模擬游戲開始,隊首的人出隊,之後再到隊尾(類似於循環隊列)
傳遞了num次之後,將隊首的人移除
如此反復,直到隊列中剩餘一人

多人共用一台列印機,採取「先到先服務」的隊列策略來執行列印任務
需要解決的問題:1 列印系統的容量是多少?2 在能夠接受的等待時間內,系統可容納多少用戶以多高的頻率提交列印任務?

輸入:abba
輸出:False
思路:1 先將需要判定的詞從隊尾加入 deque; 2從兩端同時移除字元並判斷是否相同,直到deque中剩餘0個(偶數)或1個字元(奇數)

內容參考: https://algo.itcharge.cn/04.%E9%98%9F%E5%88%97/01.%E9%98%9F%E5%88%97%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/01.%E9%98%9F%E5%88%97%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/

5. python能做什麼游戲

Python是一門高級且有趣的編程語言,除了網路爬蟲、人工智慧、數據分析之外,Python還可以進行游戲開發,為大家介紹五個支持Python的2D、3D游戲開發庫。
1、Cocos2d:是一系列開源軟體框架,用於構建跨平台2D游戲和應用程序,由cocos2d-x、cocos2d-js、cocos2d-xna和cocos2d多種框架組成,像大魚賭場、城堡沖突等小游戲,就是用此框架開發出來的。
2、Panda3D:是由迪士尼開發的3D游戲引擎,一個用於Python和C++程序的3D渲染和游戲開發框架,並由卡內基梅隴娛樂技術中心負責維護,使用C++編寫的,針對Python進行了完全的封裝。
3、Pygame:它是一組Python模塊,用來編寫游戲,可支持Python3.7,游戲例子有:紙牌游戲、超級馬里奧、擊球等多種游戲。
4、Pyogre:ogre 3D渲染引擎的Python綁定,可以用來開發游戲和模擬程序等任何3D應用,它的API更加穩定,也非常快速靈活。
5、RenPy:一個視覺小說引擎,被世界各地的成千萬的創造者所使用,它可以幫助你使用文字、圖像和聲音來講述電腦和移動設備上的故事。RenPy是開放源碼的,可免費的商業用途,易於學習的腳本語言任何人都能有效地編寫大型視覺小說,它的Python腳本足以用來模擬游戲。

6. 使用Matplotlib模擬Python中的三維太陽系

編程的一個用途是通過模擬來幫助我們理解真實世界。這一技術被應用於科學、金融和許多其他定量領域。只要控制現實世界屬性的「規則」是已知的,你就可以編寫一個計算機程序來 探索 你遵循這些規則所得到的結果。在本文中,您將 用Python模擬三維太陽系 使用流行的可視化庫Matplotlib

在這篇文章,你將能夠用Python創建你自己的3D太陽系,你可以用你想要的多少太陽和行星。下面是一個簡單的太陽系的一個例子,它有一個太陽和兩個行星:

你還可以打開動畫地板上的二維投影,更好地展示太陽系的三維本質。下面是同樣的太陽系模擬,包括2D投影:

下面是這篇文章的概要,以便您知道接下來會發生什麼:

在本文中,您將使用面向對象的編程和Matplotlib。如果您希望閱讀更多關於任何一個主題的內容,您可以閱讀:

讓我們從使用Matplotlib在Python中模擬一個3D太陽系開始。

太陽系中的太陽、行星和其他天體都是運動中的天體,它們相互吸引。引力在任何兩個物體之間施加。

如果這兩個對象有大量M_1和M_2是距離r然後,你可以用以下公式計算它們之間的引力:

常數G是一個引力常數。您將看到如何在模擬的版本中忽略這個常量,在本文中,您將使用任意單位的質量和距離,而不是kg和m。

一旦你知道了兩個物體之間的引力,你就可以計算出加速度。a每個物體都是由於這種引力而經歷的,使用以下公式:

使用這個加速度,你可以調整運動物體的速度。當速度發生變化時,速度和方向都會發生變化。

當用Python模擬一個三維太陽系時,你需要用三維空間來表示太陽系。因此,這個3D空間中的每個點都可以用三個數字來表示, x -, y -和 z -坐標。例如,如果你想把太陽放在太陽系的中心,你可以將太陽的位置表示為 (0, 0, 0) .

您還需要在3D空間中表示向量。矢量具有大小和方向。你需要像速度、加速度和力這樣的量的矢量,因為這些量都有一個方向和一個震級。

在本文中,我將不詳細討論向量代數。相反,我將陳述您需要的任何結果。你可以讀到更多關於向量與向量代數如果你願意的話。

為了在代碼中更容易地處理向量,您可以創建一個類來處理它們。編寫這個類將作為對類和面向對象編程的快速刷新。你可以讀到用Python進行面向對象的編程如果你覺得你需要一個更徹底的解釋。雖然您也可以創建一個類來處理3D空間中的點,但這並不是必要的,在本文中我也不會創建一個類。

如果您熟悉向量和面向對象編程,可以跳過本節,只需在定義 Vector 班級。

創建一個名為 vectors.py 中,您將定義 Vector 班級。您將使用此腳本定義類並對其進行測試。然後,可以刪除最後的測試代碼,只需在這個腳本中保留類定義:

這個 __init__() 方法的 Vector 類有三個參數,表示每個軸上的值。每個參數的默認值為 0 表示該軸的原點。雖然我們不喜歡在Python中使用單個字母名稱, x , y ,和 z 是恰當的,因為它們代表了數學中常用的笛卡爾坐標系的術語。

您還定義了兩個Dunder方法來將對象表示為一個字元串:

在代碼段的末尾,您可以更多地了解這兩種類型的字元串表示之間的差異。Python編碼書第9章 .

測試代碼塊的輸出如下:

在Python項目中的這個3D太陽系中,如果 Vector 類是可索引的,以便您可以使用 [] 帶有索引以提取其中一個值的符號。使用當前形式的類,如果添加 print(test[0]) 在您的腳本中,您將得到一個 TypeError 說 Vector 對象不可訂閱。您可以通過向類定義中添加另一個Dud方法來修復這個問題:

通過定義 __getitem__() ,你做了 Vector 可索引的類。向量中的第一項是 x 的價值。 y 的價值。 z 。任何其他索引都會引發錯誤。測試代碼塊的輸出如下:

test[0] 返迴向量中的第一個項, x .

可以定義類的對象的加法和減法。 __add__() 和 __sub__() DunderMethod.這些方法將使您能夠使用 + 和 - 執行這些操作的符號。如果沒有這些Dud方法,則使用 + 和 - 提出 TypeError .

若要添加或減去兩個向量,可以分別添加或減去向量的每個元素:

雙管齊下 __add__() 和 __sub__() 返回另一個 Vector 對象,每個元素等於兩個原始向量中相應元素的加減。輸出如下:

對於乘法和除法,您也可以這樣做,盡管在處理向量時,這些操作需要更多的注意。

在處理向量時,不能僅僅引用「乘法」,因為有不同類型的「乘法」。在這個項目中,你只需要標量乘法。標量乘法是指向量與標量相乘(標量有一個數量級,但沒有方向)。但是,在本小節中,您還將定義點積兩個向量。你想用 * 運算符,既適用於標量乘法,也適用於點積。因此,可以定義 __mul__() DunderMethod:

使用 * 運算符將取決於第二個操作數,即 * 符號,是標量或向量。如果由參數表示的第二個操作數 other ,是類型的 Vector ,計算了點積。但是,如果 other 是類型的 int 或 float ,返回的結果是一個新的 Vector ,按比例調整。

以上代碼的輸出如下:

如果您想要標量乘法,則需要標量乘法。 後 這個 * 象徵。如果您試圖運行該語句 3*Vector(3, 5, 9) 相反, TypeError 將被提高,因為 Vector 類不是用於使用的有效操作數。 * 帶有類型的對象 int .

兩個向量是分不開的。但是,可以將向量除以標量。您可以使用 / 運算符 Vector 如果定義 __truep__() DunderMethod:

產出如下:

如果你有一個向量(x,y,z),您可以找到它的震級使用表達式(x^2+y^2+z^2)。你也可以規范化向量。歸一化給出一個方向相同但大小為 1 。您可以通過將向量的每個元素除以矢量的大小來計算歸一化向量。

可以定義兩個新方法來完成 Vector 班級:

測試代碼提供了以下輸出:

第三個輸出給出了歸一化向量的大小,表明它的大小是 1 .

根據使用的IDE或其他工具,在分割時可能會收到警告 self.x , self.y ,和 self.z ,如在 __truep__() 和 normalize() 。您不需要擔心這個問題,但是如果您想要修復它,可以通過更改 __init__() 簽署下列任何一項:

這兩個選項都讓IDE知道參數應該是浮動的。在第二個選項中,您使用類型暗示來實現。

您現在可以刪除此腳本末尾的測試代碼,以便您在 vectors.py 是類的定義。

現在,你可以開始研究Python中的3D太陽系了。您將創建兩個主要類:

你將使用Matplotlib來創建和可視化太陽系。您可以在終端中使用以下內容來安裝Matplotlib:

這個 Axes3D Matplotlib中的物體將「託管」太陽系。如果您使用過Matplotlib,並且主要使用了2D繪圖,那麼您將使用(有意或不知情的) Axes 對象。 Axes3D 的3D等效 Axes ,顧名思義!

現在是開始編寫和測試這些類的時候了。您可以創建兩個新文件:

接下來,您將開始處理 SolarSystem 班級。

您將在整個項目中使用任意單元。這意味著,與其用米作為距離,而用公斤作為質量,你將使用沒有單位的數量。參數 size 用於定義包含太陽系的立方體的大小:

定義 SolarSystem 類的 __init__() 方法,其中包含參數。 size 。您還定義了 bodies 屬性。這個屬性是一個空列表,當你稍後創建它們時,它將包含太陽系內的所有天體。這個 add_body() 方法可以用來將軌道天體添加到太陽系中。

下一步是介紹Matplotlib。屬性創建圖形和一組軸。 subplots() 在 matplotlib.pyplot :

你打電話 plt.subplots() ,它返回一個圖形和一組軸。返回的值分配給屬性。 fig 和 ax 。你打電話 plt.subplots() 有以下論點:

您還可以調用該方法。 tight_layout() 。這是 Figure 類在Matplotlib中。此方法減少了圖形邊緣的邊距。

到目前為止,您可以在控制台/REPL中嘗試代碼:

這給出了一組空的三維軸的圖形:

您將使用 size 參數設置此多維數據集的大小。你會回到 SolarSystem 稍後上課。目前,您可以將您的注意力轉向定義 SolarSystemBody 班級。

您可以開始創建 SolarSystemBody 類及其 __init__() 方法。我正在截斷 SolarSystem 下面代碼中的類定義用於顯示。在此代碼塊和以後的代碼塊中,包含 # ... 指出您之前編寫的未顯示的代碼:

中的參數。 __init__() 方法是:

你也叫 add_body() 方法中定義的 SolarSystem 類將這個天體添加到太陽系中。稍後,您將向 __init__() 方法。

中定義另一個方法。 SolarSystemBody 用其當前的位置和速度移動物體:

這個 move() 方法重新定義 position 屬性的 velocity 屬性。我們已經討論過你是如何用任意單位來計算距離和質量的。你也在使用任意的時間單位。每個『時間單位』將是循環的一個迭代,您將使用它來運行模擬。因此, move() 將身體按一次迭代所需的數量移動,這是一個時間單位。

你們已經創建了Matplotlib結構,它將容納太陽系及其所有天體。現在,您可以添加一個 draw() 方法 SolarSystemBody 若要在Matplotlib圖上顯示主體,請執行以下操作。您可以通過繪制一個標記來完成這一任務。

在這樣做之前,您需要在 SolarSystemBody 若要控制將繪制的標記的顏色和大小以表示身體,請執行以下操作:

類屬性 min_display_size 和 display_log_base 設置參數,以確定您將在3D圖上顯示的標記的大小。您設置了一個最小的大小,以便您顯示的標記不太小,即使對於小的身體也是如此。您將使用對數標度將質量轉換為標記大小,並將此對數的基值設置為另一個類屬性。

這個 display_size 屬性中的實例屬性。 __init__() 方法在計算的標記大小和所設置的最小標記大小之間進行選擇。為了在這個項目中確定身體的顯示大小,你要使用它的質量。

您還可以添加 colour 屬性 __init__() ,暫時默認為黑色。

要測試這些新添加的內容,可以在控制台/REPL中嘗試以下內容:

第一次呼叫 body.draw() 在原點繪制物體,因為你使用的是太陽系天體的默認位置。打電話給 body.move() 用一個「時間單位」所需的數量移動身體。因為身體的速度是 (1, 1, 1) ,身體將沿著三個軸中的每一個移動一個單位。第二次呼叫 body.draw() 在第二個位置畫太陽系天體。請注意,當您這樣做時,軸將自動重新排列。您很快就會在主代碼中處理這個問題。

您可以返回到 SolarSystem 通過給太陽系及其天體添加兩種新的方法,將其分類和連接起來: update_all() 和 draw_all() :

這個 update_all() 方法穿過太陽系中的每一個物體,移動並畫出每一個物體。這個 draw_all() 方法使用太陽系的大小設置三軸的限制,並通過 pause() 功能。此方法還清除軸,為下一個繪圖做好准備。

您可以開始構建一個簡單的太陽系,並通過創建一個名為 simple_solar_system.py :

運行此腳本時,您將看到一個黑體從情節的中心移動:

您可以更改三維圖形的透視圖,這樣您就可以直接沿著其中一個軸查看3D軸。可以通過將視圖的方位和仰角設置為 0 在……裡面 SolarSystem.__init__() :

跑動 simple_solar_system.py 現在給出以下觀點:

這個 x -軸現在垂直於你的屏幕。因為你在2D顯示器上顯示一個3D視圖,所以你總是有一個方向與你用來顯示圖形的2D平面垂直。這一限制使得很難區分物體何時沿該軸運動。你可以通過改變身體的速度 simple_solar_system.py 到 (1, 0, 0) 並再次運行腳本。身體似乎是靜止的,因為它只是沿著軸移動,從你的屏幕出來!

您可以通過根據它的不同更改標記的大小來改進三維可視化。 x -協調。靠近您的對象看起來更大,而更遠的對象看起來更小。您可以對 draw() 方法中的 SolarSystemBody 班級:

self.position[0] 表示身體的位置。 x -軸,即垂直於屏幕的軸。因子 30 除以是一個任意因素,您可以使用它來控制您希望這種效果有多強。

在本教程的後面,您還將添加另一個功能,將有助於可視化的三維運動的恆星和行星。

你有一個太陽系,裡面有可以移動的物體。到目前為止,如果您只有一個身體,那麼代碼可以正常工作。但那不是一個非常有趣的太陽系!如果你有兩個或兩個以上的物體,它們就會通過相互的引力相互作用。

在這篇文章的開頭,我簡要回顧了你需要處理兩個物體之間的引力的物理。由於在這個項目中使用的是任意單位,所以可以忽略引力常數 G 簡單地計算出由於兩個物體之間的重力而產生的力,如:

一旦你知道了兩個物體之間的力,因為F=ma,您可以計算出每個對象必須使用的加速度:

一旦你知道加速度,你就可以改變物體的速度。

您可以添加兩個新方法,一個在 SolarSystemBody 另一個在 SolarSystem ,計算出任何兩個物體之間的力和加速度,並穿過太陽系中的所有物體,並計算它們之間的相互作用。

第一種方法計算出兩個物體之間的引力,計算每個物體的加速度,並改變兩個物體的速度。如果您願意,可以將這些任務分為三種方法,但在本例中,我將將這些任務放在 SolarSystemBody :

accelerate_e_to_gravity() 對類型的對象調用。 SolarSystemBody 需要另一個 SolarSystemBody 身體作為一種爭論。參數 self 和 other 代表兩個身體相互作用。此方法的步驟如下:

現在你可以計算出任何兩個天體之間的相互作用,你可以計算出太陽系中所有天體之間的相互作用。你可以把你的注意力轉移到 SolarSystem 類的類:

這個 calculate_all_body_interactions() 方法貫穿太陽系的所有天體。每個天體與太陽系中的其他天體相互作用:

現在,您已經准備好創建一個簡單的太陽系,並測試您到目前為止編寫的代碼。

在這個項目中,您將關注創建兩種類型的天體之一:太陽和行星。您可以為這些機構創建兩個類。新類繼承自 SolarSystemBody :

這個 Sun 類的默認質量為10,000個單位,並將顏色設置為黃色。使用字元串 'yellow' ,這是Matplotlib中的有效顏色。

在 Planet 類創建一個 itertools.cycle 對象有三種顏色。在這種情況下,這三種顏色是紅色、綠色和藍色。你可以使用你想要的任何RGB顏色,也可以使用任意數量的顏色。在這個類中,使用帶有RGB值的元組來定義顏色,而不是使用顏色名稱的字元串。這也是在Matplotlib中定義顏色的有效方法。使用 next() 每當你創建一個新的行星時。

您還將默認質量設置為10個單元。

現在,你可以創建一個太陽系,其中一個太陽和兩個行星在 simple_solar_system.py :

在這個腳本中,您創建了一個太陽和兩個行星。你把太陽和行星分配給變數 sun 和 planets ,但這並不是嚴格要求的,因為 Sun 和 Planet 對象被創建,它們被添加到 solar_system 你不需要直接引用它們。

你用一個 while 循環來運行模擬。循環在每次迭代中執行三個操作。運行此腳本時,將獲得以下動畫:

它起作用了,算是吧。你可以看到太陽錨定在這個太陽系的中心,行星受到太陽引力的影響。除了行星在包含你電腦屏幕的平面上的運動(這些是 y -和 z --軸),你也可以看到行星越來越大,因為它們也在 x -軸,垂直於屏幕。

然而,你可能已經注意到行星的一些奇怪的行為。當它們被安排在太陽後面時,行星仍然被展示在太陽的前面。這不是數學上的問題--如果你跟蹤行星的位置,你會發現 x -坐標顯示,它們實際上是在太陽後面,正如你所預料的那樣。

這個問題來自Matplotlib在繪圖中繪制對象的方式。Matplotlib按繪制對象的順序將對象按層繪制。因為你在行星之前創造了太陽, Sun 對象放在第一位 solar_system.bodies 並作為底層繪制。您可以通過在行星之後創建太陽來驗證這一事實,在這種情況下,您將看到行星總是出現在太陽後面。

你會希望Matplotlib按照正確的順序繪制太陽系的天體,從最前的那些天體開始。要實現這一點,您可以對 SolarSystem.bodies 的值為基礎的列表。 x -協調每次刷新3D圖形的時間。下面是如何在 update_all() 方法 SolarSystem :

使用List方法 sort 帶著 key 參數來定義要用於排序列表的規則。這個 lambda 函數設置此規則。在本例中,您使用的值是 position[0] 表示 x -協調。因此,每次你打電話 update_all() 在模擬中 while 循環中,根據其沿 x -軸心。

運行 simple_solar_system.py 現在的腳本如下:

現在,你可以想像行星的軌道,就像它們圍繞太陽運行一樣。不斷變化的大小顯示了它們的 x -位置,當行星在太陽後面時,它們被隱藏在視線之外!

最後,你也可以移除軸線和網格,這樣你在模擬中看到的就是太陽和行星。可以通過添加對Matplotlib的調用來做到這一點。 axis() 方法 SolarSystem.draw_all() :

模擬現在看起來是這樣的:

使用Matplotlib對Python中的一個三維太陽系進行的模擬現在已經完成。在下一節中,您將添加一個功能,允許您查看 XY -模擬底部的飛機。這有助於可視化太陽系中物體的三維動力學。

在Python的三維太陽系模擬中,為了幫助可視化身體的運動,您可以在動畫的「地板」上添加一個2D投影。這個2D投影將顯示物體在 XY -飛機。要實現這一點,您需要將另一個繪圖添加到顯示動畫的相同軸上,並且只需在 x -和 y -坐標。你可以錨定 z -與圖形底部協調,使2D投影顯示在動畫的地板上。

您可以首先將一個新參數添加到 __init__() 方法的 SolarSystem 班級:

新參數 projection_2d ,默認為 False ,將允許您在兩個可視化選項之間切換。如果 projection_2d 是 False 動畫將只顯示身體在3D中移動,沒有軸和網格,就像你最後看到的結果一樣。

讓我們開始做一些改變 projection_2d 是 True :

您所做的更改如下:

您還需要在 simple_solar_system.py 打開2D投影:

模擬現在看起來如下:

的二維投影 XY -平面使它更容易跟隨軌道物體的路徑。

我們將用Python完成另一個三維太陽系的模擬。您將使用已經定義的類來模擬雙星系統。創建一個名為 binary_star_system.py 創造兩個太陽和兩個行星:

7. 花了2萬多買的Python70個項目,現在分享給大家,練手進廠靠它了

前言:

不管學習哪門語言都希望能做出實際的東西來,這個實際的東西當然就是項目啦,不用多說大家都知道學編程語言一定要做項目才行。

這里整理了70個Python實戰項目列表,都有完整且詳細的教程,你可以從中選擇自己想做的項目進行參考學習練手,你也可以從中尋找靈感去做自己的項目。

1、【Python 圖片轉字元畫】

2、【200行Python代碼實現2048】

3、【Python3 實現火車票查詢工具】

4、【高德API+Python解決租房問題 】

5、【Python3 色情圖片識別】

6、【Python 破解驗證碼】

7、【Python實現簡單的Web伺服器】

8、【pygame開發打飛機 游戲 】

9、【Django 搭建簡易博客】

10、【Python基於共現提取《釜山行》人物關系】

11、【基於scrapy爬蟲的天氣數據採集(python)】

12、【Flask 開發輕博客】

13、【Python3 圖片隱寫術】

14、【Python 實現簡易 Shell】

15、【使用 Python 解數學方程】

16、【PyQt 實現簡易瀏覽器】

17、【神經網路實現手寫字元識別系統 】

18、【Python 實現簡單畫板】

19、【Python實現3D建模工具】

20、【NBA常規賽結果預測——利用Python進行比賽數據分析】

21、【神經網路實現人臉識別任務】

22、【Python文本解析器】

23、【Python3 & OpenCV 視頻轉字元動畫】

24、【Python3 實現淘女郎照片爬蟲 】

25、【Python3實現簡單的FTP認證伺服器】

26、【基於 Flask 與 MySQL 實現番劇推薦系統】

27、【Python 實現埠掃描器】

28、【使用 Python 3 編寫系列實用腳本】

29、【Python 實現康威生命 游戲 】

30、【川普撞臉希拉里(基於 OpenCV 的面部特徵交換) 】

31、【Python 3 實現 Markdown 解析器】

32、【Python 氣象數據分析 -- 《Python 數據分析實戰》】

33、【Python實現鍵值資料庫】

34、【k-近鄰演算法實現手寫數字識別系統】

35、【ebay在線拍賣數據分析】

36、【Python 實現英文新聞摘要自動提取 】

37、【Python實現簡易區域網視頻聊天工具】

38、【基於 Flask 及爬蟲實現微信 娛樂 機器人】

39、【Python實現Python解釋器】

40、【Python3基於Scapy實現DDos】

41、【Python 實現密碼強度檢測器】

42、【使用 Python 實現深度神經網路】

43、【Python實現從excel讀取數據並繪製成精美圖像】

44、【人機對戰初體驗:Python基於Pygame實現四子棋 游戲 】

45、【Python3 實現可控制肉雞的反向Shell】

46、【Python打造漏洞掃描器 】

47、【Python應用馬爾可夫鏈演算法實現隨機文本生成】

48、【數獨 游戲 的Python實現與破解】

49、【使用Python定製詞雲】

50、【Python開發簡單計算器】

51、【Python 實現 FTP 弱口令掃描器】

52、【Python實現Huffman編碼解壓縮文件】

53、【Python實現Zip文件的暴力破解 】

54、【Python3 智能裁切圖片】

55、【Python實現網站模擬登陸】

56、【給Python3爬蟲做一個界面.妹子圖網實戰】

57、【Python 3 實現圖片轉彩色字元】

58、【自聯想器的 Python 實現】

59、【Python 實現簡單濾鏡】

60、【Flask 實現簡單聊天室】

61、【基於PyQt5 實現地圖中定位相片拍攝位置】

62、【Python實現模板引擎】

63、【Python實現遺傳演算法求解n-queens問題】

64、【Python3 實現命令行動態進度條】

65、【Python 獲取掛號信息並郵件通知】

66、【Python實現java web項目遠端自動化更新部署】

67、【使用 Python3 編寫 Github 自動周報生成器】

68、【使用 Python 生成分形圖片】

69、【Python 實現 Redis 非同步客戶端】

70、【Python 實現中文錯別字高亮系統】

最後:

以上項目列表希望可以給你在Python學習中帶來幫助~

獲取方式:轉發 私信「1」

8. python爬蟲能幹什麼

python爬蟲就是模擬瀏覽器打開網頁,獲取網頁中想要的那部分數據。利用爬蟲我們可以抓取商品信息、評論及銷量數據;可以抓取房產買賣及租售信息;可以抓取各類職位信息等。

爬蟲:

網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在FOAF社區中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。

(推薦教程:Python入門教程)

通俗的講就是通過程序去獲取web頁面上自己想要的數據,也就是自動抓取數據。

python爬蟲能做什麼?

從技術層面來說就是通過程序模擬瀏覽器請求站點的行為,把站點返回的HTML代碼/JSON數據/二進制數據(圖片、視頻) 爬到本地,進而提取自己需要的數據存放起來使用。

利用爬蟲我們可以獲取大量的價值數據,從而獲得感性認識中不能得到的信息,比如:

爬取知乎優質答案,為你篩選出各話題下最優質的內容。

抓取淘寶、京東商品、評論及銷量數據,對各種商品及用戶的消費場景進行分析。

抓取房產買賣及租售信息,分析房價變化趨勢、做不同區域的房價分析。

爬取各類職位信息,分析各行業人才需求情況及薪資水平。

爬蟲的本質:

爬蟲的本質就是模擬瀏覽器打開網頁,獲取網頁中我們想要的那部分數據。

閱讀全文

與python能模擬出地層嗎相關的資料

熱點內容
命令行參考 瀏覽:279
怎麼初步認識編程 瀏覽:208
為什麼程序員都喜歡谷歌 瀏覽:891
壓縮性骨拆能自愈嗎 瀏覽:277
安卓怎麼設置游戲畫面 瀏覽:114
k線上寫字源碼 瀏覽:457
單擊按鈕保存資料源碼 瀏覽:354
華為gt加密卡 瀏覽:213
河北超融合伺服器廠家雲主機 瀏覽:894
芙兒優安全座椅app怎麼連接 瀏覽:294
專業美團騎手app怎麼開通 瀏覽:949
個人音樂分享網站源碼 瀏覽:375
在新電腦上怎麼注冊加密狗 瀏覽:123
最後一戰游戲源碼 瀏覽:5
phpmysql實例下載 瀏覽:751
傳智黑馬安卓非加密 瀏覽:553
伺服器如何配置host 瀏覽:1001
守望執行命令 瀏覽:371
加密狗插上去了怎麼辦 瀏覽:624
錘子m1怎麼把文件夾重置 瀏覽:213