當前位置:首頁 » 編程語言 » pythonbfs

pythonbfs

發布時間: 2022-11-12 22:49:38

1. 如何用python解析graphml格式的xml文件並廣度優先遍歷

這個任務的關鍵點有三處:
一個是解析xml,獲取node與edge的信息,python自帶的xml.etree.ElementTree就可以;
二是構造圖的數據結構,可以用鄰接鏈表;
三是做BFS,這個是標準的圖演算法,在二的基礎上不難實現。
建議題主先試著自己做一做。加油。

2. 有沒有中文版的BSF18686

摘要 您好!很高興為您解答問題。(BSF)是一個支持在java應用程序內調用腳本語言 (Script),並且支持腳本語言直接訪問Java對象和方法的一個開源項目。有了它 , 你就能在java application中使用javascript, Python, XSLT, Perl, tcl, ……等一大堆scripting language. 反過來也可以,就是在這些scripting language中調用任何已經注冊過了的JavaBean,java object。它提供了完整的API實現通過Java訪問腳本語言的引擎。

3. 求利用python來科學計算網路邊的(介數)的編程語句

#encoding=utf-8
importtime

fromoperatorimportitemgetter

#DatainBC.txt:
#a b
#a h
#b c
#b h
#h i
#h g
#g i
#g f
#c f
#c i
#c d
#d f
#d e
#f e

classGraph:
def__init__(self):
self.Graph=defaultdict(set)
self.NodesNum=0

defMakeLink(self,filename,separator):
withopen(filename,'r')asgraphfile:
forlineingraphfile:
nodeA,nodeB=line.strip().split(separator)
self.Graph[nodeA].add(nodeB)
self.Graph[nodeB].add(nodeA)
self.NodesNum=len(self.Graph)

defBetweennessCentrality(self):
betweenness=dict.fromkeys(self.Graph,0.0)
forsinself.Graph:
#1.
S=[]
P={}
forvinself.Graph:
P[v]=[]
Sigma=dict.fromkeys(self.Graph,0.0)
Sigma[s]=1.0
D={}
D[s]=0
Q=[s]
#
whileQ:
v=Q.pop(0)
S.append(v)
Dv=D[v]
forwinself.Graph[v]:
#wfoundforthefirsttime?
ifwnotinD:
Q.append(w)
D[w]=D[v]+1
#shortestpathtowviav
ifD[w]==D[v]+1:
Sigma[w]+=Sigma[v]
P[w].append(v)

#2.sumallpair-dependenciesofnodes
delta=dict.fromkeys(self.Graph,0.0)
#Sreturnsverticesinorderofnon-increasingdistancefroms
whileS:
w=S.pop()
coeff=(1.0+delta[w])/Sigma[w]
forvinP[w]:
delta[v]+=Sigma[v]*coeff
ifw!=s:
betweenness[w]+=delta[w]

scale=1.0/((self.NodesNum-1)*(self.NodesNum-2))
forvinbetweenness:
betweenness[v]*=scale

betweenness=[(node,bc)fornode,bcinbetweenness.iteritems()]
betweenness=sorted(betweenness,key=itemgetter(1),reverse=True)
returnbetweenness

if__name__=='__main__':
separator=' '
file='C:\Users\Administrator\Desktop\BC.txt'

begin=time.time()
myGraph=Graph()
myGraph.MakeLink(file,separator)
printmyGraph.BetweennessCentrality()

print'Time:',time.time()-begin,'seconds'

4. python中的數據結構分析

1.Python數據結構篇

數據結構篇主要是閱讀[Problem Solving with Python](Welcome to Problem Solving with Algorithms and Data Structures) [該網址鏈接可能會比較慢]時寫下的閱讀記錄,當然,也結合了部分[演算法導論](Introction to Algorithms)
中的內容,此外還有不少wikipedia上的內容,所以內容比較多,可能有點雜亂。這部分主要是介紹了如何使用Python實現常用的一些數據結構,例
如堆棧、隊列、二叉樹等等,也有Python內置的數據結構性能的分析,同時還包括了搜索和排序(在演算法設計篇中會有更加詳細的介紹)的簡單總結。每篇文
章都有實現代碼,內容比較多,簡單演算法一般是大致介紹下思想及演算法流程,復雜的演算法會給出各種圖示和代碼實現詳細介紹。

**這一部分是下
面演算法設計篇的前篇,如果數據結構還不錯的可以直接看演算法設計篇,遇到問題可以回來看數據結構篇中的某個具體內容充電一下,我個人認為直接讀演算法設計篇比
較好,因為大家時間也都比較寶貴,如果你會來讀這些文章說明你肯定有一定基礎了,後面的演算法設計篇中更多的是思想,這里更多的是代碼而已,嘿嘿。**

(1)[搜索](Python Data Structures)

簡述順序查找和二分查找,詳述Hash查找(hash函數的設計以及如何避免沖突)

(2)[排序](Python Data Structures)

簡述各種排序演算法的思想以及它的圖示和實現

(3)[數據結構](Python Data Structures)

簡述Python內置數據結構的性能分析和實現常用的數據結構:棧、隊列和二叉堆

(4)[樹總結](Python Data Structures)

簡述二叉樹,詳述二叉搜索樹和AVL樹的思想和實現

2.Python演算法設計篇

演算法設計篇主要是閱讀[Python Algorithms: Mastering Basic Algorithms in the Python Language](Python Algorithms: Mastering Basic Algorithms in the Python Language)[**點擊鏈接可進入Springer免費下載原書電子版**]之後寫下的讀書總結,原書大部分內容結合了經典書籍[演算法導論](Introction to Algorithms),
內容更加細致深入,主要是介紹了各種常用的演算法設計思想,以及如何使用Python高效巧妙地實現這些演算法,這里有別於前面的數據結構篇,部分演算法例如排
序就不會詳細介紹它的實現細節,而是側重於它內在的演算法思想。這部分使用了一些與數據結構有關的第三方模塊,因為這篇的重點是演算法的思想以及實現,所以並
沒有去重新實現每個數據結構,但是在介紹演算法的同時會分析Python內置數據結構以及第三方數據結構模塊的優缺點,也就意味著該篇比前面都要難不少,但
是我想我的介紹應該還算簡單明了,因為我用的都是比較朴實的語言,並沒有像演算法導論一樣列出一堆性質和定理,主要是對著某個問題一步步思考然後演算法就出來
了,嘿嘿,除此之外,裡面還有很多關於python開發的內容,精彩真的不容錯過!

這里每篇文章都有實現代碼,但是代碼我一般都不會分
析,更多地是分析演算法思想,所以內容都比較多,即便如此也沒有包括原書對應章節的所有內容,因為內容實在太豐富了,所以我只是選擇經典的演算法實例來介紹算
法核心思想,除此之外,還有不少內容是原書沒有的,部分是來自演算法導論,部分是來自我自己的感悟,嘻嘻。該篇對於大神們來說是小菜,請一笑而過,對於菜鳥
們來說可能有點難啃,所以最適合的是和我水平差不多的,對各個演算法都有所了解但是理解還不算深刻的半桶水的程序猿,嘿嘿。

本篇的順序按照原書[Python Algorithms: Mastering Basic Algorithms in the Python Language](Python Algorithms: Mastering Basic Algorithms in the Python Language)的章節來安排的(章節標題部分相同部分不同喲),為了節省時間以及保持原著的原滋原味,部分內容(一般是比較難以翻譯和理解的內容)直接摘自原著英文內容。

**1.
你也許覺得很多內容你都知道嘛,沒有看的必要,其實如果是我的話我也會這么想,但是如果只是歸納一個演算法有哪些步驟,那這個總結也就沒有意義了,我覺得這
個總結的亮點在於想辦法說清楚一個演算法是怎麼想出來的,有哪些需要注意的,如何進行優化的等等,採用問答式的方式讓讀者和我一起來想出某個問題的解,每篇
文章之後都還有一兩道小題練手喲**

**2.你也許還會說演算法導論不是既權威又全面么,基本上每個演算法都還有詳細的證明呢,讀演算法導論豈
不更好些,當然,你如果想讀演算法導論的話我不攔著你,讀完了感覺自己整個人都不好了別怪小弟沒有提醒你喲,嘻嘻嘻,左一個性質右一個定理實在不適合演算法科
普的啦,沒有多少人能夠堅持讀完的。但是碼農與蛇的故事內容不多喲,呵呵呵**

**3.如果你細讀本系列的話我保證你會有不少收獲的,需要看演算法導論哪個部分的地方我會給出提示的,嘿嘿。溫馨提示,前面三節內容都是介紹基礎知識,所以精彩內容從第4節開始喲,么么噠 O(∩_∩)O~**

(1)[Python Algorithms - C1 Introction](Python Algorithms)

本節主要是對原書中的內容做些簡單介紹,說明演算法的重要性以及各章節的內容概要。

(2)[Python Algorithms - C2 The basics](Python Algorithms)

**本節主要介紹了三個內容:演算法漸近運行時間的表示方法、六條演算法性能評估的經驗以及Python中樹和圖的實現方式。**

(3)[Python Algorithms - C3 Counting 101](Python Algorithms)

原書主要介紹了一些基礎數學,例如排列組合以及遞歸循環等,但是本節只重點介紹計算演算法的運行時間的三種方法

(4)[Python Algorithms - C4 Inction and Recursion and Rection](Python Algorithms)

**本節主要介紹演算法設計的三個核心知識:Inction(推導)、Recursion(遞歸)和Rection(規約),這是原書的重點和難點部分**

(5)[Python Algorithms - C5 Traversal](Python Algorithms)

**本節主要介紹圖的遍歷演算法BFS和DFS,以及對拓撲排序的另一種解法和尋找圖的(強)連通分量的演算法**

(6)[Python Algorithms - C6 Divide and Combine and Conquer](Python Algorithms)

**本節主要介紹分治法策略,提到了樹形問題的平衡性以及基於分治策略的排序演算法**

(7)[Python Algorithms - C7 Greedy](Python Algorithms)

**本節主要通過幾個例子來介紹貪心策略,主要包括背包問題、哈夫曼編碼和最小生成樹等等**

(8)[Python Algorithms - C8 Dynamic Programming](Python Algorithms)

**本節主要結合一些經典的動規問題介紹動態規劃的備忘錄法和迭代法這兩種實現方式,並對這兩種方式進行對比**

(9)[Python Algorithms - C9 Graphs](Python Algorithms)

**本節主要介紹圖演算法中的各種最短路徑演算法,從不同的角度揭示它們的內核以及它們的異同**

5. 請問如何使用python的正則表達式提取url鏈接

importre
m=re.search(r'//[0-9A-Za-z./]+',url)

具體要考慮連接里的字元,以及其他地方的正文字元

6. 如何系統地自學 Python

是否非常想學好 Python,一方面被瑣事糾纏,一直沒能動手,另一方面,擔心學習成本太高,心裡默默敲著退堂鼓?

幸運的是,Python 是一門初學者友好的編程語言,想要完全掌握它,你不必花上太多的時間和精力。

Python 的設計哲學之一就是簡單易學,體現在兩個方面:

  • 語法簡潔明了:相對 Ruby 和 Perl,它的語法特性不多不少,大多數都很簡單直接,不玩兒玄學。

  • 切入點很多:Python 可以讓你可以做很多事情,科學計算和數據分析、爬蟲、Web 網站、游戲、命令行實用工具等等等等,總有一個是你感興趣並且願意投入時間的。


  • 廢話不多說,學會一門語言的捷徑只有一個: Getting Started

    ¶ 起步階段
    任何一種編程語言都包含兩個部分:硬知識和軟知識,起步階段的主要任務是掌握硬知識。

    硬知識
    「硬知識」指的是編程語言的語法、演算法和數據結構、編程範式等,例如:變數和類型、循環語句、分支、函數、類。這部分知識也是具有普適性的,看上去是掌握了一種語法,實際是建立了一種思維。例如:讓一個 Java 程序員去學習 Python,他可以很快的將 Java 中的學到的面向對象的知識 map 到 Python 中來,因此能夠快速掌握 Python 中面向對象的特性。

    如果你是剛開始學習編程的新手,一本可靠的語法書是非常重要的。它看上去可能非常枯燥乏味,但對於建立穩固的編程思維是必不可少。

    下面列出了一些適合初學者入門的教學材料:

    廖雪峰的 Python 教程 Python 中文教程的翹楚,專為剛剛步入程序世界的小白打造。

    笨方法學 Python 這本書在講解 Python 的語法成分時,還附帶大量可實踐的例子,非常適合快速起步。

    The Hitchhiker』s Guide to Python! 這本指南著重於 Python 的最佳實踐,不管你是 Python 專家還是新手,都能獲得極大的幫助。

    Python 的哲學:

  • 用一種方法,最好是只有一種方法來做一件事。
  • 學習也是一樣,雖然推薦了多種學習資料,但實際學習的時候,最好只選擇其中的一個,堅持看完。

    必要的時候,可能需要閱讀講解數據結構和演算法的書,這些知識對於理解和使用 Python 中的對象模型有著很大的幫助。

    軟知識
    「軟知識」則是特定語言環境下的語法技巧、類庫的使用、IDE的選擇等等。這一部分,即使完全不了解不會使用,也不會妨礙你去編程,只不過寫出的程序,看上去顯得「傻」了些。

    對這些知識的學習,取決於你嘗試解決的問題的領域和深度。對初學者而言,起步階段極易走火,或者在選擇 Python 版本時徘徊不決,一會兒看 2.7 一會兒又轉到 3.0,或者徜徉在類庫的大海中無法自拔,Scrapy,Numpy,Django 什麼都要試試,或者參與編輯器聖戰、大括弧縮進探究、操作系統辯論賽等無意義活動,或者整天跪舔語法糖,老想著怎麼一行代碼把所有的事情做完,或者去構想聖潔的性能安全通用性健壯性全部滿分的解決方案。

    很多「大牛」都會告誡初學者,用這個用那個,少走彎路,這樣反而把初學者推向了真正的彎路。
    還不如告訴初學者,學習本來就是個需要你去走彎路出 Bug,只能腳踏實地,沒有奇跡只有狗屎的過程。

    選擇一個方向先走下去,哪怕臟丑差,走不動了再看看有沒有更好的解決途徑。

    自己走了彎路,你才知道這么做的好處,才能理解為什麼人們可以手寫狀態機去匹配卻偏要發明正則表達式,為什麼面向過程可以解決卻偏要面向對象,為什麼我可以操縱每一根指針卻偏要自動管理內存,為什麼我可以嵌套回調卻偏要用 Promise...

    更重要的是,你會明白,高層次的解決方法都是對低層次的封裝,並不是任何情況下都是最有效最合適的。

    技術涌進就像波浪一樣,那些陳舊的封存已久的技術,消退了遲早還會涌回的。就像現在移動端應用、手游和 HTML5 的火熱,某些方面不正在重演過去 PC 的那些歷史么?

    因此,不要擔心自己走錯路誤了終身,堅持並保持進步才是正道。

    起步階段的核心任務是掌握硬知識,軟知識做適當了解,有了穩固的根,粗壯的枝幹,才能長出濃密的葉子,結出甜美的果實。

    ¶ 發展階段
    完成了基礎知識的學習,必定會感到一陣空虛,懷疑這些語法知識是不是真的有用。

    沒錯,你的懷疑是非常正確的。要讓 Python 發揮出它的價值,當然不能停留在語法層面。
    發展階段的核心任務,就是「跳出 Python,擁抱世界」。

    在你面前會有多個分支:科學計算和數據分析、爬蟲、Web 網站、游戲、命令行實用工具等等等等,這些都不是僅僅知道 Python 語法就能解決的問題。

    拿爬蟲舉例,如果你對計算機網路,HTTP 協議,HTML,文本編碼,JSON 一無所知,你能做好這部分的工作么?而你在起步階段的基礎知識也同樣重要,如果你連循環遞歸怎麼寫都還要查文檔,連 BFS 都不知道怎麼實現,這就像工匠做石凳每次起錘都要思考錘子怎麼使用一樣,非常低效。

    在這個階段,不可避免要接觸大量類庫,閱讀大量書籍的。

    類庫方面
    「Awesome Python 項目」:vinta/awesome-python · GitHub
    這里列出了你在嘗試解決各種實際問題時,Python 社區已有的工具型類庫,如下圖所示:

    vinta/awesome-python

    你可以按照實際需求,尋找你需要的類庫。

    至於相關類庫如何使用,必須掌握的技能便是閱讀文檔。由於開源社區大多數文檔都是英文寫成的,所以,英語不好的同學,需要惡補下。

    書籍方面
    這里我只列出一些我覺得比較有一些幫助的書籍,詳細的請看豆瓣的書評:

    科學和數據分析:
    ❖「集體智慧編程」:集體智慧編程 (豆瓣)
    ❖「數學之美」:數學之美 (豆瓣)
    ❖「統計學習方法」:統計學習方法 (豆瓣)
    ❖「Pattern Recognition And Machine Learning」:Pattern Recognition And Machine Learning (豆瓣)
    ❖「數據科學實戰」:數據科學實戰 (豆瓣)
    ❖「數據檢索導論」:信息檢索導論 (豆瓣)

    爬蟲:
    ❖「HTTP 權威指南」:HTTP權威指南 (豆瓣)

    Web 網站:
    ❖「HTML & CSS 設計與構建網站」:HTML & CSS設計與構建網站 (豆瓣)

    ...

    列到這里已經不需要繼續了。

    聰明的你一定會發現上面的大部分書籍,並不是講 Python 的書,而更多的是專業知識。

    事實上,這里所謂「跳出 Python,擁抱世界」,其實是發現 Python 和專業知識相結合,能夠解決很多實際問題。這個階段能走到什麼程度,更多的取決於自己的專業知識。

    ¶ 深入階段
    這個階段的你,對 Python 幾乎了如指掌,那麼你一定知道 Python 是用 C 語言實現的。

    可是 Python 對象的「動態特徵」是怎麼用相對底層,連自動內存管理都沒有的C語言實現的呢?這時候就不能停留在表面了,勇敢的拆開 Python 的黑盒子,深入到語言的內部,去看它的歷史,讀它的源碼,才能真正理解它的設計思路。

    這里推薦一本書:
    「Python 源碼剖析」:Python源碼剖析 (豆瓣)
    這本書把 Python 源碼中最核心的部分,給出了詳細的闡釋,不過閱讀此書需要對 C 語言內存模型和指針有著很好的理解。

    另外,Python 本身是一門雜糅多種範式的動態語言,也就是說,相對於 C 的過程式、 Haskell 等的函數式、Java 基於類的面向對象而言,它都不夠純粹。換而言之,編程語言的「道學」,在 Python 中只能有限的體悟。學習某種編程範式時,從那些面向這種範式更加純粹的語言出發,才能有更深刻的理解,也能了解到 Python 語言的根源。

    這里推薦一門公開課
    「編程範式」:斯坦福大學公開課:編程範式
    講師高屋建瓴,從各種編程範式的代表語言出發,給出了每種編程範式最核心的思想。

    值得一提的是,這門課程對C語言有非常深入的講解,例如C語言的范型和內存管理。這些知識,對閱讀 Python 源碼也有大有幫助。

    Python 的許多最佳實踐都隱藏在那些眾所周知的框架和類庫中,例如 Django、Tornado 等等。在它們的源代碼中淘金,也是個不錯的選擇。

    ¶ 最後的話
    每個人學編程的道路都是不一樣的,其實大都殊途同歸,沒有迷路的人只有不能堅持的人!

    希望想學 Python 想學編程的同學,不要猶豫了,看完這篇文章,

    Just Getting Started !!!

7. 誰有孤立森林python代碼

你好,下面是一個孤立森林的源代碼, 他是根據周志華老師團隊提出的孤立森林演算法,用於進行異常點檢測。

fromrandomimportsample,random,choice,randint
frommathimportceil,log
#fromutilsimportrun_time

classNode(object):
def__init__(self,size):
"""Nodeclasstobuildtreeleaves
KeywordArguments:
size{int}--Nodesize(default:{None})
"""
#Nodesize
self.size=size
#Featuretosplit
self.split_feature=None
#Splitpoint
self.split_point=None
#Leftchildnode
self.left=None
#Rightchildnode
self.right=None

classIsolationTree(object):
def__init__(self,X,n_samples,max_depth):
"""IsolationTreeclass
Arguments:
X{list}--2dlistwithintorfloat
n_samples{int}--Subsamplesize
max_depth{int}--Maximumheightofisolationtree
"""
self.height=0
#Incaseofn_samplesisgreaterthann
n=len(X)
ifn_samples>n:
n_samples=n
#Rootnode
self.root=Node(n_samples)
#Buildisolationtree
self._build_tree(X,n_samples,max_depth)
def_get_split(self,X,idx,split_feature):
"""Randomlychooseasplitpoint
Arguments:
X{list}--2dlistobjectwithintorfloat
idx{list}--1dlistobjectwithint
split_feature{int}--ColumnindexofX
Returns:
int--splitpoint
"""
#(X[feature])
unique=set(map(lambdai:X[i][split_feature],idx))
#Cannotsplit
iflen(unique)==1:
returnNone
unique.remove(min(unique))
x_min,x_max=min(unique),max(unique)
#Caution:random()->xintheinterval[0,1).
returnrandom()*(x_max-x_min)+x_min
def_build_tree(self,X,n_samples,max_depth):
""":lessthanthe
,
'srightchild.

_depth.
Arguments:
X{list}--2dlistobjectwithintorfloat
n_samples{int}--Subsamplesize
max_depth{int}--MaximumdepthofIsolationTree
"""
#Datasetshape
m=len(X[0])
n=len(X)
#
idx=sample(range(n),n_samples)
#Depth,Nodeandidx
que=[[0,self.root,idx]]
#BFS
whilequeandque[0][0]<=max_depth:
depth,nd,idx=que.pop(0)
#StopsplitifXcannotbesplitted
nd.split_feature=choice(range(m))
nd.split_point=self._get_split(X,idx,nd.split_feature)
ifnd.split_pointisNone:
continue
#Split
idx_left=[]
idx_right=[]
whileidx:
i=idx.pop()
xi=X[i][nd.split_feature]
ifxi<nd.split_point:
idx_left.append(i)
else:
idx_right.append(i)
#Generateleftandrightchild
nd.left=Node(len(idx_left))
nd.right=Node(len(idx_right))
#
que.append([depth+1,nd.left,idx_left])
que.append([depth+1,nd.right,idx_right])
#
self.height=depth
def_predict(self,xi):
"""Auxiliaryfunctionofpredict.
Arguments:
xi{list}--1Dlistwithintorfloat
Returns:
int--
"""
#
nd=self.root
depth=0
whilend.leftandnd.right:
ifxi[nd.split_feature]<nd.split_point:
nd=nd.left
else:
nd=nd.right
depth+=1
returndepth,nd.size

classIsolationForest(object):
def__init__(self):
"""IsolationForest,,


Attributes:
trees{list}--
ajustment{float}
"""
self.trees=None
self.adjustment=None#TBC
deffit(self,X,n_samples=100,max_depth=10,n_trees=256):
"""
Arguments:
X{list}--2dlistwithintorfloat
KeywordArguments:
n_samples{int}--Accordingtopaper,setnumberofsamplesto256(default:{256})
max_depth{int}--Treeheightlimit(default:{10})
n_trees{int}--Accordingtopaper,setnumberoftreesto100(default:{100})
"""
self.adjustment=self._get_adjustment(n_samples)
self.trees=[IsolationTree(X,n_samples,max_depth)
for_inrange(n_trees)]
def_get_adjustment(self,node_size):
""".
Arguments:
node_size{int}--Numberofleafnodes
Returns:
float--ajustment
"""
ifnode_size>2:
i=node_size-1
ret=2*(log(i)+0.5772156649)-2*i/node_size
elifnode_size==2:
ret=1
else:
ret=0
returnret
def_predict(self,xi):
"""Auxiliaryfunctionofpredict.
Arguments:
xi{list}--1dlistobjectwithintorfloat
Returns:
list--1dlistobjectwithfloat
"""
#
score=0
n_trees=len(self.trees)
fortreeinself.trees:
depth,node_size=tree._predict(xi)
score+=(depth+self._get_adjustment(node_size))
score=score/n_trees
#Scale
return2**-(score/self.adjustment)
defpredict(self,X):
"""Getthepredictionofy.
Arguments:
X{list}--2dlistobjectwithintorfloat
Returns:
list--1dlistobjectwithfloat
"""
return[self._predict(xi)forxiinX]

#@run_time
defmain():
print("'sscore...")
#Generateadatasetrandomly
n=100
X=[[random()for_inrange(5)]for_inrange(n)]
#Addoutliers
X.append([10]*5)
#Trainmodel
clf=IsolationForest()
clf.fit(X,n_samples=500)
#Showresult
print("Averagescoreis%.2f"%(sum(clf.predict(X))/len(X)))
print("Outlier'sscoreis%.2f"%clf._predict(X[-1]))

if__name__=="__main__":
main()

8. 如何系統地自學 Python

是否非常想學好 Python,一方面被瑣事糾纏,一直沒能動手,另一方面,擔心學習成本太高,心裡默默敲著退堂鼓?

幸運的是,Python 是一門初學者友好的編程語言,想要完全掌握它,你不必花上太多的時間和精力。

Python 的設計哲學之一就是簡單易學,體現在兩個方面:

語法簡潔明了:相對 Ruby 和 Perl,它的語法特性不多不少,大多數都很簡單直接,不玩兒玄學。

切入點很多:Python 可以讓你可以做很多事情,科學計算和數據分析、爬蟲、Web 網站、游戲、命令行實用工具等等等等,總有一個是你感興趣並且願意投入時間的。

廢話不多說,學會一門語言的捷徑只有一個: Getting Started

¶ 起步階段
任何一種編程語言都包含兩個部分:硬知識和軟知識,起步階段的主要任務是掌握硬知識。

°1 硬知識
「硬
知識」指的是編程語言的語法、演算法和數據結構、編程範式等,例如:變數和類型、循環語句、分支、函數、類。這部分知識也是具有普適性的,看上去是掌握了一
種語法,實際是建立了一種思維。例如:讓一個 Java 程序員去學習 Python,他可以很快的將 Java 中的學到的面向對象的知識 map 到
Python 中來,因此能夠快速掌握 Python 中面向對象的特性。

如果你是剛開始學習編程的新手,一本可靠的語法書是非常重要的。它看上去可能非常枯燥乏味,但對於建立穩固的編程思維是必不可少。

下面列出了一些適合初學者入門的教學材料:

❖「笨方法學 Python」:http://learnpythonthehardway.org/book/
這本書在講解 Python 的語法成分時,還附帶大量可實踐的例子,非常適合快速起步。

❖「廖雪峰的 Python 2.7 教程」:Home - 廖雪峰的官方網站
Python 中文教程的翹楚,專為剛剛步入程序世界的小白打造。

❖「The Hitchhiker』s Guide to Python!」:The Hitchhiker』s Guide to Python!
這本指南著重於 Python 的最佳實踐,不管你是 Python 專家還是新手,都能獲得極大的幫助。

❖「Python 官方文檔」:Our Documentation
實踐中大部分問題,都可以在官方文檔中找到答案。

❖ 輔助工具:Python Tutor
一個 Python 對象可視化的項目,用圖形輔助你理解 Python 中的各種概念。

Python 的哲學:
用一種方法,最好是只有一種方法來做一件事。
學習也是一樣,雖然推薦了多種學習資料,但實際學習的時候,最好只選擇其中的一個,堅持看完。

必要的時候,可能需要閱讀講解數據結構和演算法的書,這些知識對於理解和使用 Python 中的對象模型有著很大的幫助。

°2 軟知識
「軟知識」則是特定語言環境下的語法技巧、類庫的使用、IDE的選擇等等。這一部分,即使完全不了解不會使用,也不會妨礙你去編程,只不過寫出的程序,看上去顯得「傻」了些。


這些知識的學習,取決於你嘗試解決的問題的領域和深度。對初學者而言,起步階段極易走火,或者在選擇 Python 版本時徘徊不決,一會兒看 2.7
一會兒又轉到 3.0,或者徜徉在類庫的大海中無法自拔,Scrapy,Numpy,Django
什麼都要試試,或者參與編輯器聖戰、大括弧縮進探究、操作系統辯論賽等無意義活動,或者整天跪舔語法糖,老想著怎麼一行代碼把所有的事情做完,或者去構想
聖潔的性能安全通用性健壯性全部滿分的解決方案。

很多「大牛」都會告誡初學者,用這個用那個,少走彎路,這樣反而把初學者推向了真正的彎路。
還不如告訴初學者,學習本來就是個需要你去走彎路出 Bug,只能腳踏實地,沒有奇跡只有狗屎的過程。

選擇一個方向先走下去,哪怕臟丑差,走不動了再看看有沒有更好的解決途徑。

自己走了彎路,你才知道這么做的好處,才能理解為什麼人們可以手寫狀態機去匹配卻偏要發明正則表達式,為什麼面向過程可以解決卻偏要面向對象,為什麼我可以操縱每一根指針卻偏要自動管理內存,為什麼我可以嵌套回調卻偏要用 Promise...

更重要的時,你會明白,高層次的解決方法都是對低層次的封裝,並不是任何情況下都是最有效最合適的。

技術涌進就像波浪一樣,那些陳舊的封存已久的技術,消退了遲早還會涌回的。就像現在移動端應用、手游和 HTML5 的火熱,某些方面不正在重演過去 PC 的那些歷史么?

因此,不要擔心自己走錯路誤了終身,堅持並保持進步才是正道。

起步階段的核心任務是掌握硬知識,軟知識做適當了解,有了穩固的根,粗壯的枝幹,才能長出濃密的葉子,結出甜美的果實。

¶ 發展階段
完成了基礎知識的學習,必定會感到一陣空虛,懷疑這些語法知識是不是真的有用。

沒錯,你的懷疑是非常正確的。要讓 Python 發揮出它的價值,當然不能停留在語法層面。
發展階段的核心任務,就是「跳出 Python,擁抱世界」。

在你面前會有多個分支:科學計算和數據分析、爬蟲、Web 網站、游戲、命令行實用工具等等等等,這些都不是僅僅知道 Python 語法就能解決的問題。


爬蟲舉例,如果你對計算機網路,HTTP協議,HTML,文本編碼,JSON一無所知,你能做好這部分的工作么?而你在起步階段的基礎知識也同樣重要,如
果你連循環遞歸怎麼寫都還要查文檔,連 BFS 都不知道怎麼實現,這就像工匠做石凳每次起錘都要思考錘子怎麼使用一樣,非常低效。

在這個階段,不可避免要接觸大量類庫,閱讀大量書籍的。

°1 類庫方面
「Awesome Python 項目」:vinta/awesome-python · GitHub
這里列出了你在嘗試解決各種實際問題時,Python 社區已有的工具型類庫,如下圖所示:

你可以按照實際需求,尋找你需要的類庫。

至於相關類庫如何使用,必須掌握的技能便是閱讀文檔。由於開源社區大多數文檔都是英文寫成的,所以,英語不好的同學,需要惡補下。

°2 書籍方面:
這里我只列出一些我覺得比較有一些幫助的書籍,詳細的請看豆瓣的書評:

科學和數據分析:
❖「集體智慧編程」:集體智慧編程 (豆瓣)
❖「數學之美」:數學之美 (豆瓣)
❖「統計學習方法」:統計學習方法 (豆瓣)
❖「Pattern Recognition And Machine Learning」:Pattern Recognition And Machine Learning (豆瓣)
❖「數據科學實戰」:數據科學實戰 (豆瓣)
❖「數據檢索導論」:信息檢索導論 (豆瓣)

爬蟲:
❖「HTTP 權威指南」:HTTP權威指南 (豆瓣)

Web 網站:
❖「HTML & CSS 設計與構建網站」:HTML & CSS設計與構建網站 (豆瓣)

...

列到這里已經不需要繼續了。

聰明的你一定會發現上面的大部分書籍,並不是講 Python 的書,而更多的是專業知識。

事實上,這里所謂「跳出 Python,擁抱世界」,其實是發現 Python 和專業知識相結合,能夠解決很多實際問題。這個階段能走到什麼程度,更多的取決於自己的專業知識。

¶ 深入階段
這個階段的你,對 Python 幾乎了如指掌,那麼你一定知道 Python 是用 C 語言實現的。

可是 Python 對象的「動態特徵」是怎麼用相對底層,連自動內存管理都沒有的C語言實現的呢?這時候就不能停留在表面了,勇敢的拆開 Python 的黑盒子,深入到語言的內部,去看它的歷史,讀它的源碼,才能真正理解它的設計思路。

這里推薦一本書:
「Python 源碼剖析」:Python源碼剖析 (豆瓣)
這本書把 Python 源碼中最核心的部分,給出了詳細的闡釋,不過閱讀此書需要對 C 語言內存模型和指針有著很好的理解。


外,Python 本身是一門雜糅多種範式的動態語言,也就是說,相對於 C 的過程式、 Haskell 等的函數式、Java
基於類的面向對象而言,它都不夠純粹。換而言之,編程語言的「道學」,在 Python
中只能有限的體悟。學習某種編程範式時,從那些面向這種範式更加純粹的語言出發,才能有更深刻的理解,也能了解到 Python 語言的根源。

這里推薦一門公開課
「編程範式」:斯坦福大學公開課:編程範式
講師高屋建瓴,從各種編程範式的代表語言出發,給出了每種編程範式最核心的思想。

值得一提的是,這門課程對C語言有非常深入的講解,例如C語言的范型和內存管理。這些知識,對閱讀 Python 源碼也有大有幫助。

Python 的許多最佳實踐都隱藏在那些眾所周知的框架和類庫中,例如 Django、Tornado 等等。在它們的源代碼中淘金,也是個不錯的選擇。

¶ 最後的話
每個人學編程的道路都是不一樣的,其實大都殊途同歸,沒有迷路的人只有不能堅持的人。雖然聽上去有點雞湯,但是這是事實。

希望想學 Python 想學編程的同學,不要猶豫了,看完這篇文章,Just getting started~

9. 如何系統地自學 Python

按照這個大綱按部就班的學習,就能系統的學習Python了!
階段一:Python開發基礎
Python全棧開發與人工智慧之Python開發基礎知識學習內容包括:Python基礎語法、數據類型、字元編碼、文件操作、函數、裝飾器、迭代器、內置方法、常用模塊等。
階段二:Python高級編程和資料庫開發
Python全棧開發與人工智慧之Python高級編程和資料庫開發知識學習內容包括:面向對象開發、Socket網路編程、線程、進程、隊列、IO多路模型、Mysql資料庫開發等。
階段三:前端開發
Python全棧開發與人工智慧之前端開發知識學習內容包括:Html、CSS、JavaScript開發、Jquery&bootstrap開發、前端框架VUE開發等。
階段四:WEB框架開發
Python全棧開發與人工智慧之WEB框架開發學習內容包括:Django框架基礎、Django框架進階、BBS+Blog實戰項目開發、緩存和隊列中間件、Flask框架學習、Tornado框架學習、Restful API等。
階段五:爬蟲開發
Python全棧開發與人工智慧之爬蟲開發學習內容包括:爬蟲開發實戰。
階段六:全棧項目實戰
Python全棧開發與人工智慧之全棧項目實戰學習內容包括:企業應用工具學習、CRM客戶關系管理系統開發、路飛學城在線教育平台開發等。
階段七:演算法&設計模式
階段八:數據分析
Python全棧開發與人工智慧之數據分析學習內容包括:金融量化分析。
階段九:機器學習、圖像識別、NLP自然語言處理
Python全棧開發與人工智慧之人工智慧學習內容包括:機器學習、圖形識別、人工智慧玩具開發等。
階段十:Linux系統&百萬級並發架構解決方案
階段十一:高並發語言GO開發
Python全棧開發與人工智慧之高並發語言GO開發學習內容包括:GO語言基礎、數據類型與文件IO操作、函數和面向對象、並發編程等。

10. python版本五子棋

機器博弈是人工智慧領域的重要分支,它的研究對象多以復雜的棋牌類智力游戲為主,已經得到解決的棋類游戲,幾乎全部都應歸功於機器博弈近半個世紀的發展。計算機解決問題的優勢在於能把不易解析的問題,藉助於現代計算機的運算速度優勢枚舉出所有的合理情形而得解;然而,博弈問題的復雜程度決定了它不能過度依賴機器的計算能力。許多待解決的或已經解決的棋類,其狀態空間復雜度或博弈樹復雜度量級都太過龐大,所以我們需要添加約束,並且採用合理的演算法進行優化。

五子棋問題是人工智慧中的一個經典問題。當今世界,AlphaGo已經執圍棋之牛耳,五子棋領域卻鮮少有人問津。本文根據課堂所學知識結合文獻、博客,基於兩種開發語言實現了一個智能對戰的AI五子棋游戲平台。

本文所做工作如下:

(1) 五子棋界面實現;

(2) 智能判定棋盤走勢;

(3) 改進了棋盤掃描方式;

(4) 改良了系統評分表評估方式;

(5) 實現了基於點評分表估值找出最佳落子方式。

五子棋AI問題的最大問題是如何實現智能對弈,即當人落子之後,演算法如何解讀當前的棋盤並且對其進行分析解讀,得到電腦方的最佳落子點。其次還有一個問題是如何判斷勝利,這可以作為前面棋盤局勢判定的一個子問題,也可以看做是一個單獨的問題,不過這個問題總體來說較為簡單,所以不做詳細說明。

五子棋的整體知識構建包含以下部分:

(1) 棋盤局面表示法

(2) 棋局勝利判定

(3) 棋型知識庫

(4) 智能博弈流程

對於問題(1),採用數組表示法。棋盤中的各交叉點有三種狀態,不妨令 0表示空(未放置棋子) ,-1 表示有黑子 ,1 表示有白子,數組表示法的基本思想是:以交叉點對應的數組索引值來表達物理位置 ,以交叉點對應的元素值表達狀態(空、 黑子、 白子)。令 V = {0 ,1 ,-1} ,棋盤 的第 i 個交叉點的狀態 Si ∈V ,任何棋局都可以表示成一個 n ×n 的二元組。

對於問題(2), 採用數組表示法時,想知道任意兩個元素 Si 和Sj 是否共線,要通過 i 和 j 之間的數值規律來判斷。從這方面看,數組表示法是一種原始、低效的表示方法,但是對於評分表演算法來說其性能損失是可以接受的。要判斷是否有一方已經勝利,只需要對整個棋盤判定當前落子點的縱、橫、正斜、反斜四個方向的最長延伸出四個位置看是否能連成一條同色直線即可。具體的操作可以視為:從落子點出發,向兩個方向延伸,如果遇到同色,那麼計數器加一,遇到非同色(空白或者異色)則停止在該方向的延伸,一個計數器記下該方向上的兩頭的連續同色棋子數。等到四個方向都探索完畢,如果四個計數器中有一個計數器達到了5,那麼即可判斷出已經有五子連珠了,此局結束。

問題(3)棋型知識庫主要包括各種既定的棋盤形式,有如下幾種:

² 活四 :有兩個連五點(即有兩個點可以形成五),圖中白點即為連五點。當活四齣現的時候,整個局勢已經無法阻止連五了,活四的歸屬方一定能取得勝利;

² 沖四 :有一個連五點,如下面三圖,均為沖四棋型。圖中白點為連五點。 相對比活四來說,沖四的威脅性就小了很多,因為這個時候,只要跟著防守在那個唯一的連五點上,沖四就沒法形成連五。

² 活三 :可以形成活四的三,如下圖,代表兩種最基本的活三棋型。圖中白點為活四點。活三棋型是進攻中最常見的一種,因為活三之後,如果對方不以理會,將可以下一手將活三變成活四,而活四是無法防守的。所以,面對活三的時候,需要非常謹慎對待。在沒有更好的進攻手段的情況下,必須對其進行防守,以防止其形成可怕的活四棋型。

² 眠三: 只能夠形成沖四的三,如下各圖,分別代表最基礎的六種眠三形狀。圖中白點代表沖四點。眠三的棋型與活三的棋型相比,危險系數下降不少,因為眠三棋型即使不去防守,下一手它也只能形成沖四,而對於單純的沖四棋型,是可以很簡單的防守住的。

² 活二 :能夠形成活三的二,如下圖,是三種基本的活二棋型。圖中白點為活三點。

² 眠二 :能夠形成眠三的二。圖中四個為最基本的眠二棋型,細心且喜歡思考的同學會根據眠三介紹中的圖2-13找到與下列四個基本眠二棋型都不一樣的眠二。圖中白點為眠三點。

對於上述的棋型,我們主要考慮的是活四、沖四、活三、眠三這幾種主要的進攻棋型的防守與構成,整體棋型遵從以下原則:優先考慮數目,同等數目的情況下考慮是活是眠。評分表演算法的設計整體偏向於防守。

對於問題(4),當下棋型的評估分析,演算法嚴格遵從以下流程:

當人類方落下一子,演算法啟動,掃描全局,得到人類棋子的集合和電腦棋子的集合。全局掃描之後,對當前局勢進行排序、計算。對每個集合的每個空白點位置打分,打分依據是根據這個點周圍四個方向上的同色連續棋子的數量。按照這些最後得到的評分,得出最大值。得到人類方和電腦方的兩個最大值之後,進行比較,如果人類方局勢較好(分數較高),則演算法將下一次落子位置設置為人類方得分最高的點,盡力降低人類方的下一步得分;如果電腦方的分數較高,那麼則直接在使得分數最高的點落子即可。

本次課程設計,一共設計了兩個版本,一個Java版本,為19X19的棋盤,配備簡單的消息提示,基於AWT實現GUI,開發工具IntelliJ IDEA 2018.1

另一個版本是使用Python設計,核心演算法相同,但是受限於圖片源文件,為15X15棋盤,基於pygame實現GUI,開發工具是:JetBrains PyCharm 2018.2.4 x64

因為近期時間較為緊迫,所以《人工智慧》這門課我選擇了較為簡單的五子棋問題進行課程設計。在本次課程設計中,我的編碼能力、調試能力、演算法解讀實現能力、函數優化能力等各方面有了長足的進步。在本次的設計過程中也出現了幾個問題,下面對這些問題進行一個簡單的描述:

(1) 對棋盤局勢的判斷力不夠,因為只是簡單的對當前的棋盤局勢進行判斷,基本等同於一個粗通規則而且天賦不高的五子棋選手。如果對手很細心,而且熟練經營各種布局策略,那麼基本這個演算法就會被鑽研出習慣,從而被輕易針對,而且針對方案百試不爽;

(2) 判斷棋局形式的時候對邊界的評分演算法跟中心區域的評分演算法一致,無法有效提前識別邊界,降低邊界空白點的權重;

(3) 用戶圖形界面需要改進,另外可以增設PK模式以及選色、選擇棋盤大小功能等;

後續可以嘗試用博弈樹演算法嘗試與當前演算法進行比較。評分表演算法犧牲了更高的精度,以求迅速的得出最佳落子點;而博弈樹可以通過提前落子進行全局預判進行更全方位的對人類方的圍追堵截。

另外,可以通過在課堂上學到的知識,比如BFS、DFS、A*演算法、決策樹演算法 等應用於五子棋的智能決策中。

《人工智慧》這門課讓我對於圖、知識表示、智能決策等各個方面有了更好地認識與體驗,課堂設計內容充實有趣,讓我受益匪淺,希望今後可以更加深入這個方面,並且將課堂上學到的知識應用於實踐之中。

熱點內容
網路登錄伺服器需要獲取什麼信息 發布:2025-01-12 12:17:32 瀏覽:890
mac終端打開文件夾 發布:2025-01-12 12:17:31 瀏覽:295
第一次安裝如何設置mysql密碼 發布:2025-01-12 12:09:02 瀏覽:280
如何刪除微信伺服器上收藏 發布:2025-01-12 12:08:20 瀏覽:102
吃雞游戲安卓區轉蘋果區怎麼轉 發布:2025-01-12 11:34:00 瀏覽:880
網頁版c語言 發布:2025-01-12 11:21:01 瀏覽:864
安卓怎麼更改排位常用英雄 發布:2025-01-12 11:10:33 瀏覽:561
拆遷的100萬如何配置 發布:2025-01-12 11:08:52 瀏覽:575
如何配置ph值為次氯酸鈉的ph值 發布:2025-01-12 11:08:52 瀏覽:437
pythonarraynumpy 發布:2025-01-12 11:01:47 瀏覽:293