1. 程式人生 > 實用技巧 >我要偷偷的學Python,然後驚呆所有人(第一天)

我要偷偷的學Python,然後驚呆所有人(第一天)

前言

本系列文預設各位有一定的C或C++基礎,因為我是學了點C++的皮毛之後入手的Python,這裡也要感謝齊鋒學長送來的支援。
本系列文預設各位會百度,會用線上編譯器,因為我是突擊學Python的,之前的編譯環境都刪了,但是吧,我發現線上編譯是真的爽,浪費那時間去搭那環境幹啥,學好了Python,會差那點請人搭環境的錢嗎?

我要的不多,點個關注就好啦
然後呢,本系列的目錄嘛,說實話我個人比較傾向於那兩本 Primer Plus,所以就跟著它們的目錄結構吧。

本系列也會著重培養各位的自主動手能力,畢竟我不可能把所有知識點都給你講到,所以自己解決需求的能力就尤為重要,所以我在文中埋得坑請不要把它們看成坑,那是我留給你們的鍛鍊機會,請各顯神通,自行解決。


Python語言概覽

Python語言的起源

老生常談了,但是追本溯源有時候會有它意想不到的好處,全在個人悟性了。

Python的作者,Guido von Rossum,確實是荷蘭人。1982年,Guido從阿姆斯特丹大學(University of Amsterdam)獲得了數學和計算機碩士學位。然而,儘管他算得上是一位數學家,但他更加享受計算機帶來的樂趣。用他的話說,儘管擁有數學和計算機雙料資質,他總趨向於做計算機相關的工作,並熱衷於做任何和程式設計相關的活兒。

在那個時候,他接觸並使用過諸如Pascal、C、 Fortran等語言。這些語言的基本設計原則是讓機器能更快執行。所有的編譯器的核心是做優化,以便讓程式能夠執行。為了增進效率,語言也迫使程式設計師像計算機一樣思考,以便能寫出更符合機器口味的程式。在那個時代,程式設計師恨不得用手榨取計算機每一寸的能力。

然而,這種思考方式讓Guido感到苦惱。Guido知道如何用C語言寫出一個功能,但整個編寫過程需要耗費大量的時間 。他的另一個選擇是shell。然而,shell的本質是呼叫命令。它並不是一個真正的語言。比如說,shell沒有數值型的資料型別,加法運算都很複雜。總之,shell不能全面的調動計算機的功能。

Guido希望有一種語言,這種語言能夠像C語言那樣,能夠全面呼叫計算機的功能介面,又可以像shell那樣,可以輕鬆的程式設計。
1989年,為了打發聖誕節假期,Guido開始寫Python語言的編譯/直譯器。Python來自Guido所摯愛的電視劇Monty Python’s Flying Circus 。他希望這個新的叫做Python的語言,能實現他的理念(一種C和shell之間,功能全面,易學易用,可拓展的語言)。Guido作為一個語言設計愛好者,已經有過設計語言的(不很成功)的嘗試。這一次,也不過是一次純粹的hacking行為。

1991年,第一個Python編譯器(同時也是直譯器)誕生。它是用C語言實現的,並能夠呼叫C庫(.so檔案)。從一出生,Python已經具有了:類(class),函式(function),異常處理(exception),包括表(list)和詞典(dictionary)在內的核心資料型別,以及模組(module)為基礎的拓展系統。


資料型別

Number資料型別

int 整型 (正整形 0 負整型)

float 浮點型即小數

bool 布林型 (True 真 False假)

插一個
complex 複數型別(這個我寫程式碼兩年多,也是沒用過了)

#表達方式一:
      complexvar = 5 + 6j
      complexvar = 3 - 2j
      print(type(complexvar))
      print(id(complexvar))

#表達方式二:  
		  complex(實數,虛數)
      res = complex(14,2)
      print(res)   => (14,2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

容器資料型別

str 字串型

'''用引號引起來的就是字串,三種引號:單引號  雙引號  三引號'''

轉義字元:\  (1)把有意義的字元轉變為無意義的字元
        (2)把無意義的字元轉變的有意義

     \n  或者 \r\n :   代表"換行"意思
     \t      	 :   代表"一個縮排"意思
     \r      	 :   代表將\r後面得所有字元拉到該行首  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

至於其他轉義字元,這裡不多贅述

特徵:可以獲取,但不可以修改,有序排列
獲取字串中的資料:跟列表list 元組tuple的取值一模一樣(正向下標,反向下標)
  • 1
  • 2

元字串

‘’‘元字串可以讓轉義字元失效’’’

字串的格式化

“%d %f %s”  語法 : “字串” % (實際值)
%d 佔位符 d代表整型資料,%nd表示佔n個位置

結果:XXX買了3個充氣娃娃

%f 佔位符 f代表浮點型資料 預設保留6位小數點,f前面有數值,則根據數值是多少保留對應小數點

結果:今天大白菜2.35元一斤


結果:今天大白菜2.3元一斤

%s 佔位符 代表字串

list 列表型([])

‘’‘特徵:可以獲取和修改資料,排列有序’’’

列表的修改

tuple 元組型 ( () )

‘’‘特徵:可以獲取但不能修改資料,排列有序’’’


獲取元組中的資料 : 跟列表list的取值一模一樣 (正向下標,反向下標)

set 集合型 ({})

setvar = {}     資料型別顯示是一個dict 字典

特徵:不可獲取,也不可以修改,無序排列,自動去掉重複資料

dict 字典 ( {“aaa”:“bbb”,})

冒號左邊是鍵,右邊是值,鍵值對之間用逗號隔開

 特徵 : 可以獲取,可以修改,無序排列
		   底層使用了雜湊演算法,儲存的資料是雜湊,鍵值對儲存的資料
		   獲取字典當中的資料:可以獲取,直接輸入冒號左邊的鍵即可取值的資料
		   修改字典當中的資料:可以修改,直接將要改的值替換掉 鍵 就可實現修改
		   一般在命名字典的鍵時,推薦使用字串,按照變數命名的字串.
  • 1
  • 2
  • 3
  • 4
  • 5

補充

獲取資料型別的函式:type()
獲取變數地址的函式:id()


四則運算

不過,對於這麼多的算術運算子,我建議你先看一遍,有個大致的印象就行。你可以先把這張圖儲存上,等用的時候再找出來,對應著查閱就可以。

咱們再說說一樣的——運算優先順序:Python世界的運算優先順序,和我們平時的計算優先順序是一樣的。


字串拼接

Python有一個很優秀的點我很喜歡,那就是它的字串拼接。
曾經有人說,程式設計,說到底就是對字串的操作,我覺得他說的很有道理,別看那些花裡胡哨的,說到底都是操作字串。

反正C/C++裡的字串操作已經讓我喝好幾壺了,還沒喝夠。

Python裡面字串拼接的方法可簡單了,就是利用字串拼接符號【+】,將需要拼接的變數連在一起就行了。

但是,既然是字串拼接,那它的限制其實就很明顯了,你得拿字串來拼接。

那如果我要拿去拼的東西參差不齊呢?怎麼辦?別急


強制型別轉換

負責轉換資料型別的函式一共有3種:str()、 int()和float()。

str()

str()函式能將資料轉換成其字串型別,不管這個資料是int型別還是float型別,只要放到括號裡。這個資料就能搖身一變,成為字串型別。
是不是挺簡單的?我們只需通過str(number)一個步驟,便可以將整數型別的【153】轉化為字串型別的【153】,成功完成資料拼接。

int()

將資料轉換為整數型別的方法也很簡單,就是int()函式。其使用方法同str()一樣,將你需要轉換的內容放在括號裡就行,像這樣:int(轉換的內容)。
不過對於int()函式的使用,大家要注意一點:只有符合整數規範的字串類資料,才能被int()強制轉換。
別看它雖然只有一句話,但它其實帶有三層含義:

首先,整數形式的字串比如'6'和'1',可以被int()函式強制轉換。
其次,文字形式,比如中文、火星文或者標點符號,不可以被int()函式強制轉換。
最後,小數形式的字串,由於Python的語法規則,也不能使用int()函式強制轉換。
  • 1
  • 2
  • 3

雖然浮點形式的字串,不能使用int()函式。但浮點數是可以被int()函式強制轉換的(去尾法)

float()

首先float()函式的使用,也是將需要轉換的資料放在括號裡,像這樣:float(資料)。
其次,float()函式也可以將整數和字串轉換為浮點型別。但同時,如果括號裡面的資料是字串型別,那這個資料一定得是數字形式。
  • 1
  • 2

那麼,經過之前str()和int()操練,float()函式是不是好懂了一些?

總結一下


標準輸入輸出

好滴吧,可能有的人會犯嘀咕,為什麼不講輸入輸出。莫急嘛

print()函式

括號內是數字的情況
print(520)

括號內是單引號的情況。
print('一起玩吧')

括號內是雙引號的情況。
print("一起玩吧")

括號內單雙引號同時存在的情況。
print("Let's play")

當然,括號內也可以是三引號,參考上面單雙同時出現的情況就知道了。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

之所以現在才說輸入輸出,是因為這裡面實在可以包含太多東西了,不要被上面的這幾個例子所迷惑,print可以列印各種資料型別,參考本文前面出現的print()以及後面將會出現的print()

input()函式

首先,讓我們通過一段程式碼,來看一看input()函式是如何使用的:

input('請在以下四個選項【格蘭芬多;斯萊特林;拉文克勞;赫奇帕奇】中,輸入你想去的學院名字:')
  • 1

input()函式是輸入函式。就上面例子來講,它需要你輸入針對括號內’請在以下四個選項【格蘭芬多;斯萊特林;拉文克勞;赫奇帕奇】中,輸入你想去的學院名字:'的答案。
所以,當你在函式的括號內寫出問題時,input()函式會將此問題原樣顯示在螢幕上,並在終端區域等待你針對此問題的回答。

可是,我們為什麼要在終端處輸入回答呢?不輸入行不行?
事實上,我們可以把input()函式當作一扇連結現實世界與程式碼世界的門。
當問題從程式碼世界傳遞給我們,可我們卻沒有回答時,這扇等待輸入的input()大門,就會一直處於敞開狀態,一直等著你往裡送回答。

注意點

對於input()函式來說,不管我們輸入的回答是什麼,不管你輸入的是整數1234,還是字串『隱形斗篷是我最想擁有的魔法』,input()函式的輸入值(蒐集到的回答),永遠會被【強制性】地轉換為【字串】型別。

這時候就要對輸入的資料進行強制型別轉換了:choice = int(input('請輸入您的選擇:'))


控制語句

條件控制語句

if判斷

在這裡,你可能注意到了一個細節:在條件判斷程式碼中的冒號:後、下一行內容的前面,會空幾個格,但這是為什麼呢?
首先,在計算機的溝通語言中,空格的學名叫縮排,比如我們寫文章都要空兩個格,這就叫首行縮排。
icon

對於Python而言,冒號和縮排是一種語法。它會幫助Python區分程式碼之間的層次,理解條件執行的邏輯及先後順序。【注:縮排是四個空格】這裡建議不要用tab,就四個空格的事情嘛,年輕人那麼懶幹嘛,養成習慣之後很多地方受限制。

if···else···

很多時候,我們不能把雞蛋放在一個籃子裡,要做好兩手準備:如果不滿足條件時,我們要怎麼辦。
Python則很貼心地,讓我們借用if…else…語句,讓碼農們有了另一種選擇——【如果…不滿足,就…】

在if…else條件語句中,if和else各自抱團,形成兩個不同的程式碼塊。表示的是條件和其他條件的互斥關係——如果不滿足if條件,就執行else其他條件。

if···elif···else

在判斷3個或3個以上的條件時,我們就需要藉助Python中的多向判斷命令:if…elif…else…。

當判斷的條件超過3個時,中間的多個條件都可以使用elif。

elif後可不接else

if巢狀

像這種如果底下還有如果(即條件裡還套條件)的情況,我們如何用Python把上面的規則寫出來,並得出評價呢?

答案就是——巢狀條件。


for···in···迴圈

Python for迴圈可以遍歷任何序列的專案,如一個列表或者一個字串。

for迴圈的語法格式如下:

for iterating_var in sequence:
   statements(s)
  • 1
  • 2

for letter in 'Python':     # 第一個例項
   print '當前字母 :', letter
 
fruits = ['banana', 'apple',  'mango']
for fruit in fruits:        # 第二個例項
   print '當前水果 :', fruit
 
print "Good bye!"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

可以看出,模板中的iterating_var是不用提前賦值的。

range()函式

使用range(a,b) 函式,你可以生成了一個【取頭不取尾】的整數序列。
例如:

for i in range(13,17):
    print(i)
  • 1
  • 2

結果:13、14、15、16


range()函式還有一種用法,我們來直接體驗一下:

for i in range(0,10,3):
    print(i)
  • 1
  • 2

這是一種切片方式,第三個引數被稱作“步長”,即間隔多少取一個數。
那麼這個程式碼執行的結果就是:0、3、6、9

迴圈使用 else 語句

在 python 中,for … else 表示這樣的意思,for 中的語句和普通的沒有區別,else 中的語句會在迴圈正常執行完(即 for 不是通過 break 跳出而中斷的)的情況下執行,while … else 也是一樣。

for num in range(10,20):  # 迭代 10 到 20 之間的數字
   for i in range(2,num): # 根據因子迭代
      if num%i == 0:      # 確定第一個因子
         j=num/i          # 計算第二個因子
         print '%d 等於 %d * %d' % (num,i,j)
         break            # 跳出當前迴圈
   else:                  # 迴圈的 else 部分
      print num, '是一個質數'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

while迴圈

while迴圈和for迴圈差不多,不過這裡的計數變數要初始化:
慄:

a = 0                #先定義變數a,並賦值
while a < 5:         #設定一個放行條件:a要小於5,才能辦事
    a = a + 1  # 滿足條件時,就辦事:將a+1
    print(a)   # 繼續辦事:將a+1的結果打印出來
  • 1
  • 2
  • 3
  • 4

很明顯,while迴圈有2個要點:1.放行條件;2.辦事流程。

和for迴圈一樣,冒號和內部程式碼的縮排都是必不可少的。

其他

break

我們先來看看break語句。break的意思是“打破”,是用來結束迴圈的,一般寫作if…break。它的寫法長這樣:

# break語句搭配for迴圈
for...in...:
    ...
    if ...:
        break

# break語句搭配while迴圈
while...(條件):
    ...
    if ...:
        break
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在這裡,if…break的意思是如果滿足了某一個條件,就提前結束迴圈。記住,這個只能在迴圈內部使用。

continue

continue的意思是“繼續”。這個子句也是在迴圈內部使用的。當某個條件被滿足的時候,觸發continue語句,將跳過之後的程式碼,直接回到迴圈的開始。

# continue語句搭配for迴圈
for...in...:
    ...
    if ...:
        continue
    ...

# continue語句搭配while迴圈
while...(條件):
    ...
    if ...:
        continue
    ...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

pass

pass語句就非常簡單了,它的英文意思是“跳過”。

對比兩種迴圈

for迴圈和while迴圈最大的區別在於【迴圈的工作量是否確定】,for迴圈就像空房間依次辦理業務,直到把【所有工作做完】才下班。但while迴圈就像哨卡放行,【滿足條件就一直工作】,直到不滿足條件就關閉哨卡


練手小專案

接下來,我想先和你談談一個專案一般是怎麼完成的。更具體的說,程式設計師是如何思考和解決問題的呢?
icon

我認為其中一個很重要的能力是【問題拆解】。問題拆解,指的是在做一件事或面對一個問題的時候,將其拆解成多個步驟或多個層次,逐步執行和解決問題,直至達到最終效果。

寫個什麼小專案呢?

這樣吧,猜數字遊戲都玩過吧,就寫一個猜數字遊戲:

功能需求:
實現一個猜數字小遊戲,隨機生成一個0~100以內的資料,由玩家來猜,每次猜完之後計算機告訴玩家是猜大了還是猜小了,共5次機會,5次猜不出來宣佈遊戲失敗。

很簡單吧。

寫好的也可以發在評論區哦


長尾流量優化

建議收藏,不然划著划著就找不到了嘞。

本文首發於python黑洞網,部落格園同步更新