Python入門教程(二)


  今天講編程思惟。
python


  可能這對初次接觸編程的人有用——我不是不想切入正題,我只是想強調根本沒什麼正題,我可能在其餘文章裏提過這一點。「編程語言就是語法糖」,可能你不知道什麼是語法糖,可是知道的人也未必認同我。我不保證大家能聽懂……python的教程有不少,可是我對不少都不滿意,因此這算是個人嘗試吧。程序員


  咱們將實現一個【篩選100之內素數】的程序。我不用python語言,而是用僞代碼——僞代碼沒有固定寫法,可是天然不是全部東西都叫僞代碼。成爲僞代碼須要兩個性質:編程

  1.  沒有歧義。可能別人會以爲有歧義,只要你以爲沒有就行。小程序

  2.  可執行。這意味着你必須輸入一個動做,而不是「今每天氣很好」等等。eclipse


  但可執行的不都是機器能夠作的。通常地,你可讓機器作:編程語言

  • 建立一個變量。變量就像空盒子,你能夠往裏放一個東西,但只能放一個。最多見的是裝一個數,0,12345,-233333,等等。ide

  • 向變量裏放東西。函數

  • 對數進行數學運算,並把結果放到某個變量
    spa

  • 打印字符串;打印一個數。(「打印」僅僅表示顯示在屏幕上,這是通常說法)命令行

  • 條件選擇。(之後再說)

  • 循環。(之後再說)


  絕大部分你以爲比較「機械」的工做,機器均可以作。雖然說我不知道大家對機器有何感受……


  如今咱們試圖實現一個篩選100之內素數的程序。你徹底能夠按着本身的意願寫,好比:

若是1是素數,打印1
若是2是素數,打印2
若是3是素數,打印3
若是4是素數,打印4
若是5是素數,打印5
若是6是素數,打印6
若是7是素數,打印7
若是8是素數,打印8
若是9是素數,打印9
若是10是素數,打印10
若是11是素數,打印11
若是12是素數,打印12
若是13是素數,打印13
若是14是素數,打印14
若是15是素數,打印15
若是16是素數,打印16
若是17是素數,打印17
若是18是素數,打印18
若是19是素數,打印19
若是20是素數,打印20
若是21是素數,打印21
若是22是素數,打印22
若是23是素數,打印23
若是24是素數,打印24
若是25是素數,打印25
若是26是素數,打印26
若是27是素數,打印27
若是28是素數,打印28
若是29是素數,打印29
若是30是素數,打印30
若是31是素數,打印31
若是32是素數,打印32
若是33是素數,打印33
若是34是素數,打印34
若是35是素數,打印35
若是36是素數,打印36
若是37是素數,打印37
若是38是素數,打印38
若是39是素數,打印39
若是40是素數,打印40
若是41是素數,打印41
若是42是素數,打印42
若是43是素數,打印43
若是44是素數,打印44
若是45是素數,打印45
若是46是素數,打印46
若是47是素數,打印47
若是48是素數,打印48
若是49是素數,打印49
若是50是素數,打印50
若是51是素數,打印51
若是52是素數,打印52
若是53是素數,打印53
若是54是素數,打印54
若是55是素數,打印55
若是56是素數,打印56
若是57是素數,打印57
若是58是素數,打印58
若是59是素數,打印59
若是60是素數,打印60
若是61是素數,打印61
若是62是素數,打印62
若是63是素數,打印63
若是64是素數,打印64
若是65是素數,打印65
若是66是素數,打印66
若是67是素數,打印67
若是68是素數,打印68
若是69是素數,打印69
若是70是素數,打印70
若是71是素數,打印71
若是72是素數,打印72
若是73是素數,打印73
若是74是素數,打印74
若是75是素數,打印75
若是76是素數,打印76
若是77是素數,打印77
若是78是素數,打印78
若是79是素數,打印79
若是80是素數,打印80
若是81是素數,打印81
若是82是素數,打印82
若是83是素數,打印83
若是84是素數,打印84
若是85是素數,打印85
若是86是素數,打印86
若是87是素數,打印87
若是88是素數,打印88
若是89是素數,打印89
若是90是素數,打印90
若是91是素數,打印91
若是92是素數,打印92
若是93是素數,打印93
若是94是素數,打印94
若是95是素數,打印95
若是96是素數,打印96
若是97是素數,打印97
若是98是素數,打印98
若是99是素數,打印99
若是100是素數,打印100

  這【是】僞代碼,由於既沒有歧義,又能夠執行。但機器無法執行,由於「是素數」咱們理解,機器並不能理解。可是咱們能夠把「是素數」拆成幾個分開的條件,使得機器能夠理解較簡單的條件。不過在此以前,咱們該先考慮一下,這100行是否是太多了?咱們能夠用上一些小技巧:

新建一個變量A
把1放進A
若是A中的數是素數,打印A中的數
把A中的數增長1
回到第三行

  本來要100行的代碼,如今只要5行了——這就是循環的一大用處,顯然「回到第三行」致使了一個循環的造成。可是這個代碼並不對,由於它會無限循環下去,根本不會結束,「能不斷地打印素數」。因此要作一些修改:

新建一個變量A
把1放進A
若是A中的數是素數,打印A中的數
把A中的數增長1
若是A大於100,跳出循環
回到第三行

  由於這裏只有一個循環,因此「跳出循環」是僞代碼。python是強大的語言,理應能夠把這些僞代碼改爲python語言,惋惜世界上有一個詭異的規定(絕大多數語言,C是例外):不準用「回到第三行」這種話。爲了彌補,能夠這樣寫:

新建一個變量A
把1放進A
把下面括號裏的話重複100遍
(
若是A中的數是素數,打印A中的數
把A中的數增長1
)

  接下來咱們處理「是素數」。若是一個數大於3,而且除以全部大於一、比自身小1的數都有餘數,那麼它是素數。因此如下兩段代碼功能是同樣的:

1:

若是A中的數是素數,打印A中的數

2:(通常地,咱們用直接用變量名稱呼其中的東西,雖然說用盒子的名字稱呼裏面的東西很奇怪)

新建一個變量B
新建一個變量「這個數還有多是素數嗎」
把2放進B
把字符串「有可能」放進變量「這個數還有多是素數嗎」
把下面括號裏的句子一直重複下去
(
若是A除以B沒有餘數,那麼把字符串「不可能」放進變量「這個數還有多是素數嗎」
把B加上1
若是此時B等於A,那麼跳出循環
)
若是變量「這個數還有多是素數嗎」中是「有可能」,打印A中的數

  加到一塊兒,就是這樣:(同時循環的只有一層,跳出循環仍然沒有歧義)

新建一個變量A
把1放進A
把下面括號裏的話重複100遍
(
新建一個變量B
新建一個變量「這個數還有多是素數嗎」
把2放進B
把字符串「有可能」放進變量「這個數還有多是素數嗎」
把下面括號裏的句子一直重複下去
(
若是A除以B沒有餘數,那麼把字符串「不可能」放進變量「這個數還有多是素數嗎」
把B加上1
若是此時B等於A,那麼跳出循環
)
若是變量「這個數還有多是素數嗎」中是「有可能」,打印A中的數
把A中的數增長1
)

  如今咱們第一次正式使用python代碼:(#號到行末是註釋,不會當成語句運行,僅僅爲了方便程序員閱讀)

a = 1                                               #   新建變量A, 並把1放進A
for i in range(100):                                #   把下面括號裏的話重複100遍
                                                    #(
    b = 2                                           #   新建變量B, 並把2放進B
    這個數還有多是素數嗎 = "有可能"                     #   新建變量「這個數還有多是素數嗎」, 並放入字符串「有可能」
    while True:                                     #   把下面括號裏的句子一直重複下去
                                                    #(
        if a % b == 0:這個數還有多是素數嗎 = "不可能"   #   若是A除以B沒有餘數,那麼把字符串「不可能」放進變量「這個數還有多是素數嗎」
        b += 1                                      #   把B加上1
        if a == b:  break                           #   若是此時B等於A,那麼跳出循環
                                                    #)
    if 這個數還有多是素數嗎 == "有可能":print(a)        #   若是變量「這個數還有多是素數嗎」中是「有可能」,打印A中的數
    a += 1                                          #   把A中的數增長1
                                                    #)

  「把數放進變量」——即「賦值操做」,用的符號是等號。其實這並不符合直覺,而且用久了會產生錯覺。代碼中出現的雙等號表示比較操做,等號只能用於賦值。

  這段代碼中,for i in range(100) 意思是新建一個叫 i 的變量,而且使其爲0。python中必須在建立時賦值,其實等於在第一次使用時建立。而後括號——python不用括號,而是在須要括號的時候縮進4格,括號結束的時候向前4格,這樣就能對齊了——括號中的內容執行一遍,i 加上1,就這麼繼續下去。

  然而上面的代碼並不工做。你會看到光標不停地閃——由於1並不能用上述方法檢驗是否爲素數。可是從3開始就沒問題了——大於一、且比自身小1的數得以存在,邏輯也得以運行了。因此咱們把第一行改爲a=3 。

  然而結果中出現了101……因此咱們再改改……可是這些邏輯錯誤——而不是語法錯誤,是這門語言以外的東西了。咱們在寫僞代碼的時候就沒有考慮周全,並非咱們沒有學好這門語言。


  這個小程序很是原始,可是很關乎思惟。咱們至少能看到3個啓示:(而且長久地有效)

  • 用循環取代重複的東西

  • 注意循環如何結束

  • 注意循環可否開始


  而編程思惟之外的東西,也就是傳統書籍的絕大多數,我決定略過。可是學會了去提問,你就會發現,你確實只要學這麼多就夠了,授人以魚不如授人以漁。接下來說解幾個關鍵詞。


函數

  請看代碼:

def f(x):
	return 2*x

a = f(7)	
print(a)

  函數就是函數,能夠簡化數學操做。然而除了數學操做,函數也能夠作其餘操做,可是受一些限制。若是你要反覆計算一個數的2倍(或者2倍+3+2的這個數倍+……這樣的複雜函數),def是很好的選擇。def應該是define(中文:定義)的縮寫。你能夠在函數裏寫print,引用函數以外的變量,以及 不能 修改函數以外的變量,等等。

  想了解更多,百度搜索「python3函數」,一個技巧是,看不懂就先挑看得懂的看。


字符串

  在python中,【半角,也就是英文下的】引號中的內容會被當成字符串。在英文中是沒有前引號和後引號之分的,在從前日後讀的時候,第一個會被當成前引號,第二個則與前一個匹配,被當作後引號。能夠把字符串賦值給一個變量。若是一串英文不在引號裏,那麼它會被當作一個變量名稱。中文引號起不到引號的做用。空格是一個字符,換行符也是一個字符(不妨print("hello\nworld")),可是換行符不能一會兒打出來,人們用「\」後跟一個字母表示這些不可見的符號,\n爲換行,\\爲\自身,\"爲雙引號(顯然引號不能單獨打出來)。犧牲一個符號,得到一堆額外的符號仍是值得的。python中,單雙引號能夠成對混用(匹配同種),但我習慣用單引號處理單個字符(單個字符也是字符串)。

  能放進變量裏的東西——好比「字符串」,能夠百度「python3字符串方法」(又好比「python3複數方法」,但字符串的方法尤爲多)。「方法」就是加個點後跟一個函數,是函數的一種。說「方法」而不說「函數」的人,大可能是強調這種函數能夠用一個「.」來調用之。至因而怎麼回事,下一個教程再說(與「類」有關)


列表

l = [1,2,3,4,5]
print(l [0])
print(l [1])
print(l [2])
print(l [3])
print(l [4])

  五個print打印出12345 。a[ i ]表示a中第 i 個元素,可是起始的一個是「第0個元素」。就像有些樓的底層是「第0層」——這一習慣並不是沒有優勢。

  若是把第一行改爲 l=1 ,到下一行會出錯。由於整數沒有「第n個元素」。

  l後括號前通常不用空格,這裏是爲了看得清楚

  (「python3列表方法」)


元組

t = (1,2,3,4,5)
print(t[0])
print(t[1])
print(t[2])
print(t[3])
print(t[4])

  元組和列表很類似。可是列表能夠在被建立後再次賦值,好比能夠a[2] = 100 。但試圖用於元組時,會報錯。元組不可改變——也並不是沒有優勢

  能夠用a, b = (1,2) 一會兒賦多個值,僅元組能夠。

字典

d = {"name" : "Jack", "age" : "7", "hobby" : "nothing"}
print(d["name"])
print(d["age"])
print(d["hobby"])

  你知道會打印出什麼。"name" "age" "hobby"(注意有引號,是字符串)都是字典的「鍵」,"Jack" 7 "hobby"都是「值」,"Jack"是鍵"name"對應的值,"name" : "Jack"稱爲一個「鍵值對」。值能夠說任何能放進變量的東西,鍵必須是不可修改的東西(好比整數,字符串,元組)


else

  百度「python3條件語句」


異常

  百度「python3條件語句」,「python3 assert」(斷言)


文件操做

  代碼:(自行理解)(r是read,用讀取模式打開;w是write,用寫入模式打開,將清除原有內容;還能夠用a,用追加模式打開,將在最後繼續寫入。總之不能回改)

with open("演示.txt",'w') as tp:
	tp.write("六個演示文字\n")
	tp.write("十三個演示文字")
	tp.write("二十個演示文字")
	
	
with open("演示.txt",'r') as tp:
	print(tp.read())
	

print("="*20)
print("===============")

with open("演示.txt",'r') as tp:
	print(tp.readline())
	print(tp.readline())


鍵盤輸入

  代碼:(回車確認輸入)

s = input("輸入提示符> ")
print("剛纔輸入的是:",s)


模塊(導入)

  from xxx import * ,至關於把同一文件夾下的xxx.py 文件內容所有粘貼在這裏。

  import xxx,相似上一條,可是若是要使用那個文件中的變量a,要寫成xxx.a ;用那個文件中的函數,寫成xxx.f( )


布爾值

  True和False,和普通變量名看起來沒什麼大區別(首字母大寫而已),可是爲python保留字,即不可對其賦值。1 == 1的值爲True,1!= 1爲False(不等於的意思),1=='a' 的值爲False,3 > 2的值爲True,字符串和數字能夠比較是否相等,比較大小會報錯。若是強制對布爾值作加法,True被視爲1,False爲0 。

  可搜索「布爾代數」


標準庫

  庫是模塊。多數放在環境變量下。

  例如 import os 後可使用os.system("echo hello"),你知道那是什麼; import sys 後能夠sys.stdout = open("xxxxxxxxxxxxxxxxxxxxxxx.txt",'w') ,而後接着隨便print點東西看看後果

  搜索「python標準庫」


IDE

  有些教程一開始就配置IDE,我認爲命令行有必要先講。所謂IDE就是一個豪華些的記事本,另外會給你一個按鈕(可是每每不止一個按鈕),點一下,就會給命令行發送消息,好比「python xxx.py」。我用的是Geany,感受還不錯。反正我堅定反對新手用VS和eclipse,我到如今也剛剛能看懂罷了(畢竟不用)。網上搜索「geany python」有教程,可是最後一步我放個圖(環境變量的用處來了)

搜狗截圖18年01月22日1703_1.png

  只有執行一欄有用,由於python幾乎不編譯。並且好像只能一會兒粘貼,不能輸入(我電腦的問題?),在記事本里打完整複製吧。


類、面向對象

  下次的內容。

相關文章
相關標籤/搜索