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

sicpforpython

發布時間: 2022-12-08 18:14:34

Ⅰ 求推薦一本大學python教材

《Python編程:從入門到實踐》

2016年出版的書,基於 Python3.5 同時也兼顧 Python2.7,書中涵蓋的內容是比較精簡的,沒有艱深晦澀的概念。

每個小結都附帶練習題,它可以幫助你更快的上手編寫程序,解決實際編程問題。

上到有編程基礎的程序員,下到10歲少年,想入門Python並達到可以開發實際項目的水平,這本書都是不錯的選擇。

Ⅱ 如何調式python程序

程序能一次寫完並正常運行的概率很小,基本不超過1%。總會有各種各樣的bug需要修正。有的bug很簡單,看看錯誤信息就知道,有的bug很復雜,我們需要知道出錯時,哪些變數的值是正確的,哪些變數的值是錯誤的,因此,需要一整套調試程序的手段來修復bug。

第一種方法簡單直接粗暴有效,就是用print把可能有問題的變數列印出來看看:

# err.py
def foo(s):
n = int(s)
print '>>> n = %d' % n
return 10 / n

def main():
foo('0')

main()

執行後在輸出中查找列印的變數值:

$ python err.py
>>> n = 0
Traceback (most recent call last):
...
ZeroDivisionError: integer division or molo by zero

用print最大的壞處是將來還得刪掉它,想想程序里到處都是print,運行結果也會包含很多垃圾信息。所以,我們又有第二種方法。
斷言

凡是用print來輔助查看的地方,都可以用斷言(assert)來替代:

# err.py
def foo(s):
n = int(s)
assert n != 0, 'n is zero!'
return 10 / n

def main():
foo('0')

assert的意思是,表達式n != 0應該是True,否則,後面的代碼就會出錯。

如果斷言失敗,assert語句本身就會拋出AssertionError:

$ python err.py
Traceback (most recent call last):
...
AssertionError: n is zero!

程序中如果到處充斥著assert,和print相比也好不到哪去。不過,啟動Python解釋器時可以用-O參數來關閉assert:

$ python -O err.py
Traceback (most recent call last):
...
ZeroDivisionError: integer division or molo by zero

關閉後,你可以把所有的assert語句當成pass來看。
logging

把print替換為logging是第3種方式,和assert比,logging不會拋出錯誤,而且可以輸出到文件:

# err.py
import logging

s = '0'
n = int(s)
logging.info('n = %d' % n)
print 10 / n

logging.info()就可以輸出一段文本。運行,發現除了ZeroDivisionError,沒有任何信息。怎麼回事?

別急,在import logging之後添加一行配置再試試:

import logging
logging.basicConfig(level=logging.INFO)

看到輸出了:

$ python err.py
INFO:root:n = 0
Traceback (most recent call last):
File "err.py", line 8, in <mole>
print 10 / n
ZeroDivisionError: integer division or molo by zero

這就是logging的好處,它允許你指定記錄信息的級別,有debug,info,warning,error等幾個級別,當我們指定
level=INFO時,logging.debug就不起作用了。同理,指定level=WARNING後,debug和info就不起作用了。這樣一
來,你可以放心地輸出不同級別的信息,也不用刪除,最後統一控制輸出哪個級別的信息。

logging的另一個好處是通過簡單的配置,一條語句可以同時輸出到不同的地方,比如console和文件。
pdb

第4種方式是啟動Python的調試器pdb,讓程序以單步方式運行,可以隨時查看運行狀態。我們先准備好程序:

# err.py
s = '0'
n = int(s)
print 10 / n

然後啟動:

$ python -m pdb err.py
> /Users/michael/Github/sicp/err.py(2)<mole>()
-> s = '0'

以參數-m pdb啟動後,pdb定位到下一步要執行的代碼-> s = '0'。輸入命令l來查看代碼:

(Pdb) l
1 # err.py
2 -> s = '0'
3 n = int(s)
4 print 10 / n
[EOF]

輸入命令n可以單步執行代碼:

(Pdb) n
> /Users/michael/Github/sicp/err.py(3)<mole>()
-> n = int(s)
(Pdb) n
> /Users/michael/Github/sicp/err.py(4)<mole>()
-> print 10 / n

任何時候都可以輸入命令p 變數名來查看變數:

(Pdb) p s
'0'
(Pdb) p n
0

輸入命令q結束調試,退出程序:

(Pdb) n
ZeroDivisionError: 'integer division or molo by zero'
> /Users/michael/Github/sicp/err.py(4)<mole>()
-> print 10 / n
(Pdb) q

這種通過pdb在命令行調試的方法理論上是萬能的,但實在是太麻煩了,如果有一千行代碼,要運行到第999行得敲多少命令啊。還好,我們還有另一種調試方法。
pdb.set_trace()

這個方法也是用pdb,但是不需要單步執行,我們只需要import pdb,然後,在可能出錯的地方放一個pdb.set_trace(),就可以設置一個斷點:

# err.py
import pdb

s = '0'
n = int(s)
pdb.set_trace() # 運行到這里會自動暫停
print 10 / n

運行代碼,程序會自動在pdb.set_trace()暫停並進入pdb調試環境,可以用命令p查看變數,或者用命令c繼續運行:

$ python err.py
> /Users/michael/Github/sicp/err.py(7)<mole>()
-> print 10 / n
(Pdb) p n
0
(Pdb) c
Traceback (most recent call last):
File "err.py", line 7, in <mole>
print 10 / n
ZeroDivisionError: integer division or molo by zero

這個方式比直接啟動pdb單步調試效率要高很多,但也高不到哪去。
IDE

如果要比較爽地設置斷點、單步執行,就需要一個支持調試功能的IDE。目前比較好的Python IDE有PyCharm:

Ⅲ 為什麼開發出了這么多的編程語言

C#與JAVA的相同之處:由於C#與JAVA都是基於C++發展起來的,因此二者之間具有很多相似之處,具體如下:

1、C#和JAVA語言的編譯結果是獨立於計算機和編程語言的,可執行文件可以在受管理的執行

環境中執行;

2、C#和JAVA語言都是採用了自動的垃圾回收機制;

3、C#和JAVA語言都取消了指針操作;

4、C#和JAVA語言都沒有頭文件;

5、C#和JAVA語言都只支持單重繼承,要實現與多重繼承類似的功能,必須通過介面來實現;

6、類都是從Object類派生而來,類的對象通過關鍵字new生成;

7、C#和JAVA語言都支持線程;

8、C#和JAVA語言都沒有全局變數和全局函數,所有的變數和函數都屬於某個類所有;

9、C#和JAVA語言都支持對數組和字元串邊界的嚴格檢查,不會出現邊界溢出的情況;

10、C#和JAVA語言都使用「.」操作符,不再使用「->」和「::」操作符;

11、C#和JAVA語言都將null和bool作為關鍵字;

12、C#和JAVA語言中所有的值都必須先初始化後才能使用;

13、C#和JAVA語言中的if語句都不允許採用整數作為判斷條件;

14、C#和JAVA語言中的try語句塊都可以後接finally語句塊。

C#與JAVA的不同之處:

盡管C#和JAVA有很多相同之處,但是由於二者是兩家不同公司開發的高級程序設計語言,它們又相互獨立,

自成體系,各自具有一些自己特有的特點,下面將C#與JAVA之間的不同之處如下:

1、屬性

對於那些經常使用快速開發工具,如Delphi或者Visual Basic的開發人員來說,屬性是一個非常熟悉的概念。

一般來說,通過getXXX可以讀取屬性的值,而通過setXXX可以設置屬性的值。

JAVA中比較常見的屬性操作語句: foo.setSize(foo.getSize()+1); label.getFont().setBold(true);

c#中比較常見的屬性操作語句: foo.size++; label.font.bold=true;

很明顯,上述的屬性設置方式較JAVA來說更為簡潔,可主讀性也更強。這充分體現了C#簡單的特點。

JAVA對於屬性的定義:public int getSize(){ return size; } public void setSize(int value){ size=value; }

c#對於屬性的定義進行了簡化:public int Size{ get{ return size; } set{size=value; }}

2、index

C#提供index來給對象加上索引的功能,從而用與處理數組類似的方式來處理對象,JAVA語言則不支持index

C#中定義index的典型方式如下:

public Story this[int index]

{

get{return stories[index]; }

set{

if(value!=null){

stories[index]=value

}

}

3、delegate :可以認為是一種類型安全、面向對象的函數指針。

C#使有delegate可以通過一個名字訪問不同的函數,它實現和JAVA中的interface類似的功能,但是它比interface更為好用。

4、event

C#提供對event的直接支持,它通過delegate和event關鍵字實現對事件的處理。event關鍵字隱藏所有delegate方法,運算符「+=」和「-+」允許程序員自由加入或者刪除時間處理程序。

5、enum:枚舉用於指定一系列的對象。

C#通過如下語句來定義和使用枚舉:

定義:public enum Direction{North,East,West,South};

使用:Direction wall=Direction.North;

JAVA不直接支持枚舉,如果要實現和C#相類似的功能,必須先定義一個類

public class Direction{

public final static int NORTH=1;

public final static int EAST=2;

public final static int WEST=3;

public final static int SOUTH=4; }

在定義了Direction類後,JAVA可以通過引用類中的值來使用枚舉:

int wall= Direction.NOTRH;

6、foreach語句

C#提供了標準的for循環,同時還提供了foreach語句(從VB中引入)來循環處理集合中的元素。

JAVA遍歷集合中的所有元素的典型處理方式如下:

while(!collection.isEmpty())

{

Object o=collection.get();

connection.next();



}

C#遍歷集合中的所有元素:foreach(object o in collection){…}

7、統一數據類型:

大多數的高級程序設計語言都有基本數據類型,如整型、浮點類型等。同時,為了更好地滿足實際的需要,對不同的數據類型有不同的處理方式,顯然,如果能夠對簡單數據類型的處理和對復雜數據類型的處理結合在一起,並用一致的方式加以處理的話,無疑會大大提升應用程序設計的效率,增強程序設計的靈活性。

JAVA語言在處理基本數據類型的時候也採取分別處理的策略,但是在基本數據類型的基礎上提供了一系列封裝這些基本數據類型的類,例如:整型(int)被類Integer所封裝,雙精度浮點(double)被類Double封裝。

C#提供了一種和JAVA不同的方式來實現數據類型的統一。事實上,在c#中,即使是int這樣的簡單數據類型在C#內部也是通過一個結構體Int32來實現的,在C#中,可以這樣認為,int只是結構體Int32的一個別名。由於C#中的結構體也繼承自類Object,這樣,Object類中定義的方法,各個結構體也擁有,於是,在C#中可以通過如下的方式來操作整數:int I=5; System.Console.WriteLine(i.ToString());

8、操作符重載

通過操作符重載可以用一種比較自然的方式來操縱各種數據類型,從而大大提升程序的可讀性和靈活性。C#中的「==」操作符在Object類中進行了定義,在Object中定義的==操作符通過比較兩個值的引用來獲得最後的結果。如果使有和集合相關的類,則必須在這樣的類中實現ICompar介面,這個介面中定義了一個方法CompareTo,該方法返回兩個對象的比較結果,在此基礎上,可以進一步定義各個實現比較的操作符,如

「>」、「<」、「>=」、「<=」等。事實上,數字類型(int、long等)可以直接使用這些比較操作符,它們的內部都實現了ICompare介面。

9、多態性

虛似方法提供了多態性的技持。多態意味著派生類可以定義一個和基類中同名的方法。盡管JAVA和C#都支持多態性,但是它們的具體實現方式還是有一定的差別。

在JAVA語言中,默認情況下,基類的對象可以直接調用派生類中的虛似方法,在C#語言中,基類要調用派生類中的虛似方法必須通過virtual關鍵字來實現。同時,在C#語言中,一個方法要重載基類中的同名方法,還必須通過關鍵字override來實現。在C#中實現多態的典型程序如下:

Class B{ public virtual void foo{}}

Class D:B{ public overried void foo(){}}

以上只是簡單地比較了C#和JAVA之間的異同,事實上,這二者之間的比較遠不止上面所介紹的內容,要學好這兩種語言,需要經過大量的實踐工作,在實踐中區分開兩種語言

Ⅳ 怎樣才能算是熟悉python會什麼具體。招聘網頁上寫著熟悉python.高手,指導,謝謝。

熟知主流硬體體系(x86, x64)
熟知 CPython 的具體實現,如若可能至少通讀源碼三遍以上

熟知每條 Python bytecode 如何被解釋執行

熟知每條 Python 語句如何 compile 成 bytecode

熟知 Python 主要數據結構所採用的優化手段
熟知 JIT 以及哪些場合下 PyPy 會比 CPython 有較大性能提高、以及有什麼代價

所以我一直只敢稱自己為 「中級 Pythonista」。對於那些僅僅知道怎麼用 Python 就敢自稱「精通」的人:專家不是那麼好當的,沒有金剛鑽別攬瓷器活。不懂那麼多底層細節就不要隨便說自己「精通」,說自己「擅長」不會被人看不起。

@米嘉 引用的 StackOverflow 上列的那幾項條件是作為將 Python 用於主要工作語言所需要的基本條件,敢於因此而稱自己「精通 Python」要讓不少人笑掉大牙。況且那幾項還有幾個嚴重問題:

第3點:如若可能,盡量避免 map/rece/fitler,而用 list/generator/set comprehension,代碼要清晰得多,GvR 如此說。xrange 和 range 的區別在 Python 3 中馬上就要滾蛋了,所以如非必要,不要大量使用 xrange。
第5點:敢於在 CPython 中大量使用遞歸是對 CPython 實現的公然侮辱。Python 的多個穩定實現都沒有 TCO,遞歸會讓性能迅速下降。記住一點:Python 中函數調用非常昂貴,可讀性、可維護性影響不大的情況下,能展開函數調用的時候盡量展開、遞歸能轉化成循環的盡量轉化。遞歸也不是人類自然的思考方式。
第7點:看書是對的,但不要把 Python 當作一門經典函數式語言對待,因為它不是。你當它是,它會很痛苦(「為毛要這樣濫用我!?」),你也會很痛苦(「為毛你不這樣實現 blah blah!?」)。SICP 是本好書,但不要因此而教條。要清楚的知道什麼時候用函數式,什麼時候用面向對象,什麼時候用面向過程,什麼時候用面向任務,什麼時候用面向結果。在一棵樹上弔死是大多數非理性死忠的表現。

Ⅳ 編程零基礎學習如何入手

長大不會做這行但希望精通,無意冒犯,這說明你必須是個天才。
一般推薦都會推薦直接上手跑 Python、R、JS 之類的高級語言,但是對於你,我建議你去買一本 SICP 和 CSAPP 來看,這正是計算機的三大神書之二。
然後在 SICP 中你會學習到 lisp 編程語言和程序設計的思想。
在 CSAPP 中你會學習到 C 語言,並理解計算機是如何運行的,計算機操作系統是怎樣運作的。
讀完這兩本書後,你就完美的打下了根基,這時候其他的什麼網站啊,游戲啊,你都能輕易的在幾周之內掌握並做出來。
這個時候,計算機水平算是登堂入室。
之後你可以去創作或者是去對那些開源的軟體、語言、系統做出你自己的貢獻,在那個時候你就算是精通啦~

Ⅵ 精通Python需要多長時間

我認為「精通」要滿足如下條件:

熟知主流硬體體系(x86, x64)
熟知 CPython 的具體實現,如若可能至少通讀源碼三遍以上

熟知每條 Python bytecode 如何被解釋執行

熟知每條 Python 語句如何 compile 成 bytecode

熟知 Python 主要數據結構所採用的優化手段
熟知 JIT 以及哪些場合下 PyPy 會比 CPython 有較大性能提高、以及有什麼代價

所以我一直只敢稱自己為 「中級 Pythonista」。對於那些僅僅知道怎麼用 Python 就敢自稱「精通」的人:專家不是那麼好當的,沒有金剛鑽別攬瓷器活。不懂那麼多底層細節就不要隨便說自己「精通」,說自己「擅長」不會被人看不起。

@米嘉 引用的 StackOverflow 上列的那幾項條件是作為將 Python 用於主要工作語言所需要的基本條件,敢於因此而稱自己「精通 Python」要讓不少人笑掉大牙。況且那幾項還有幾個嚴重問題:

第3點:如若可能,盡量避免 map/rece/fitler,而用 list/generator/set comprehension,代碼要清晰得多,GvR 如此說。xrange 和 range 的區別在 Python 3 中馬上就要滾蛋了,所以如非必要,不要大量使用 xrange。
第5點:敢於在 CPython 中大量使用遞歸是對 CPython 實現的公然侮辱。Python 的多個穩定實現都沒有 TCO,遞歸會讓性能迅速下降。記住一點:Python 中函數調用非常昂貴,可讀性、可維護性影響不大的情況下,能展開函數調用的時候盡量展開、遞歸能轉化成循環的盡量轉化。遞歸也不是人類自然的思考方式。
第7點:看書是對的,但不要把 Python 當作一門經典函數式語言對待,因為它不是。你當它是,它會很痛苦(「為毛要這樣濫用我!?」),你也會很痛苦(「為毛你不這樣實現 blah blah!?」)。SICP 是本好書,但不要因此而教條。要清楚的知道什麼時候用函數式,什麼時候用面向對象,什麼時候用面向過程,什麼時候用面向任務,什麼時候用面向結果。在一棵樹上弔死是大多數非理性死忠的表現。

熱點內容
美團商家新增的技術伺服器是什麼 發布:2024-04-27 12:12:35 瀏覽:343
得到腳本 發布:2024-04-27 12:06:25 瀏覽:936
三星手機鎖屏忘記密碼了怎麼辦 發布:2024-04-27 12:05:41 瀏覽:519
python基礎語言 發布:2024-04-27 11:54:40 瀏覽:84
ioshttp伺服器搭建 發布:2024-04-27 11:40:26 瀏覽:913
忘記密碼如何強制刷機vivo 發布:2024-04-27 11:28:40 瀏覽:385
c語言讀取指定行 發布:2024-04-27 11:28:30 瀏覽:52
c語言中a10什麼意思 發布:2024-04-27 10:45:43 瀏覽:58
物聯網中ftp是什麼意思 發布:2024-04-27 10:41:17 瀏覽:986
銀行密碼保護在哪裡 發布:2024-04-27 10:25:23 瀏覽:189