1. 程式人生 > >聰哥哥教你學Python之基礎

聰哥哥教你學Python之基礎

本章學習建議:

問:請問聰哥哥有什麼好的建議?

答:建議初學者最好還是一個例子一個例子的練習,當然了,最好的話,相關的理論也看看,還有就是有相關的程式設計經驗人士,在學習過程中最好聯絡自己常用的程式語言,對比學習中你會學的更快更順。

本章主要圍繞這麼幾個方面來講Python:

1.資料型別與變數

2.字串和編碼

3.使用list與tuple

4.條件判斷

5.迴圈

6.使用dict與set

 

一、資料型別與變數

Python的資料型別主要有:

1.整數

age=18
print(age)

2.浮點

height=1.8
weight=0.5
print(height)
print(weight)

3.字串

name="聰哥哥520"
print(name)

4.布林值

isGoodBoy=1
isBadBoy=2
print(isGoodBoy==isBadBoy)

5.空值

空值是Python裡一個特殊的值,用None表示。None不能理解為0,因為0是有意義的,而None是一個特殊的空值。

 

常見錯誤:

圖一

圖二

圖三

用中文該說,通常是型別錯誤比較多,當然了,還包括有些時候賦值問題等。

 

至於變數我不想說太多,因為覺得凡是懂JS,拿它和Python對比就一目瞭然了。

比如JS的變數除了每次在對應的變數前面加上var之外 實際上與Python這個變數機制並沒有什麼很大的區別。

另外再補充說一點,一個面試常見考題:

name='zhangsan'

Python直譯器在此期間幹了兩件事:

     (1)在記憶體中建立了一個'zhangsan'的字串;

     (2)在記憶體中建立了一個名為name的變數,並把它指向'zhangsan'

 

還有一個常量,常量一般都是大寫表示,同Java一樣。

 

二、字串與編碼

字元編碼問題在任何一門程式語言都是一件挺頭疼的事情。

一般情況為了避免亂碼

我們會在對應的python檔案最上面宣告如下:

# -*- coding: utf-8 -*-

再聯絡到html,絕大多數情況基本上都要在<head></head>之間宣告如下:

<meta charset="utf-8">

還有在jsp檔案最上面都會宣告一個這樣的:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

它們共同的目的就是為了統一編碼為UTF-8。UTF-8是國際通用編碼,不管是中文還是英文,還是其他國家語言,同樣適用。當然了,國內也不乏有沒有用UTF-8,直接編碼為gbk,也就是中文的方式。

對字串常見的操作:

print() 一般就是輸出

ord() 將字元轉化為數字形式

chr() 將數字轉化為字元形式

encode() 指定對應的字元編碼格式

len() 獲取對應的字串長度

常見的佔位符:

 

三、使用list與tuple

1.list

Python內建的一種資料型別是列表:list。list是一種有序的集合,可以隨時新增和刪除其中的元素

(1)對集合遍歷和單個獲取操作,示例程式碼如下:

classmate=['A','B','C']
print(classmate)
print(classmate[2])

注意:一般集合索引是從0開始,超過集合對應的索引數是,會報相關的錯誤,如圖所示:

(2)新增集合

list.append('D')
list.insert('4','E')

append()方法,預設追加尾部

insert()方法,需要指定對應的索引值,而且該索引值必須是唯一的

另外你再聯絡下JS,發現也是一樣的。

(3)刪除集合

list.pop()
list.pop(1)

前者和後者的區別是,前者預設會直接刪除尾部,後者指定刪除。

(4)獲取集合長度

len()方法就可以

 

2.tuple

有序列表叫元組:tuple。tuple和list非常類似,但是tuple一旦初始化就不能修改。

不可變的tuple有什麼意義?因為tuple不可變,所以程式碼更安全。如果可能,能用tuple代替list就儘量用tuple。

tuple所謂的“不變”是說,tuple的每個元素,指向永遠不變。即指向'a',就不能改成指向'b',指向一個list,就不能改成指向其他物件,但指向的這個list本身是可變的。

示例程式碼:

# -*- coding: utf-8 -*-

classmates = ('A', 'B', 'C')
print('classmates =', classmates)
print('len(classmates) =', len(classmates))
print('classmates[0] =', classmates[0])
print('classmates[1] =', classmates[1])
print('classmates[2] =', classmates[2])
print('classmates[-1] =', classmates[-1])

# cannot modify tuple:
classmates[0] = 'N'

結果如圖:

list和tuple是Python內建的有序集合,一個可變,一個不可變。根據需要來選擇使用它們。

 

四、條件判斷

計算機之所以能做很多自動化的任務,因為它可以自己做條件判斷。

條件判斷倒沒有什麼好說的,這裡需要注意的地方是,手動編寫時,如果沒有用對應的IDE工具的話,有些時候會因為排版導致的錯誤

示意程式碼:

# -*- coding: utf-8 -*-

age = 20
if age >= 6:
    print('teenager')
elif age >= 18:
    print('adult')
else:
    print('kid')

五、迴圈

記得曾經有位計算機老人對我說過,很多年前沒有這麼多的高階語言應運而生時,記得那個時候大學畢業,處於一個連一臺像樣的電腦都沒有時,他學的是計算機專業,然後畢業了,他去面試,面試官問他會什麼,他說他就會for迴圈。

可見,學習迴圈還是很重要的。‘

來段for迴圈程式碼(啪啪啪):

# -*- coding: utf-8 -*-

names = ['A', 'B', 'C']
for name in names:
    print(name)

 

再來段while迴圈程式碼(計算100以內所有奇數之和):

sum = 0
n = 99
while n > 0:
    sum = sum + n
    n = n - 2
print(sum)

 

如果要提前結束迴圈,可以使用break終結:

n = 1
while n <= 100:
    if n > 10: # 當n = 11時,條件滿足,執行break語句
        break # break語句會結束當前迴圈
    print(n)
    n = n + 1
print('END')

如果只想列印奇數,可以用continue方式跳過:

n = 0
while n < 10:
    n = n + 1
    if n % 2 == 0: # 如果n是偶數,執行continue語句
        continue # continue語句會直接繼續下一輪迴圈,後續的print()語句不會執行
    print(n)

迴圈是讓計算機做重複任務的有效的方法。

break語句可以在迴圈過程中直接退出迴圈,而continue語句可以提前結束本輪迴圈,並直接開始下一輪迴圈。這兩個語句通常都必須配合if語句使用。

要特別注意,不要濫用breakcontinue語句。breakcontinue會造成程式碼執行邏輯分叉過多,容易出錯。大多數迴圈並不需要用到breakcontinue語句,上面的兩個例子,都可以通過改寫迴圈條件或者修改迴圈邏輯,去掉breakcontinue語句。

有些時候,如果程式碼寫得有問題,會讓程式陷入“死迴圈”,也就是永遠迴圈下去。這時可以用Ctrl+C退出程式,或者強制結束Python程序。

 

六、使用dict和set

1.dict

Python內建了字典:dict的支援,dict全稱dictionary,在其他語言中也稱為map,使用鍵-值(key-value)儲存,具有極快的查詢速度(從這個角度,你可以聯絡到非關係資料庫,非關係資料庫又稱鍵值對資料庫,從中你就可以明白了為什麼非關係型資料庫比關係型資料庫要快的原因)

以我曾經在學校學習時寫的一個部落格系統為例:

那個部落格系統對應的資料庫我是用MySQL,設計了五張表,使用者表,文章表,文章型別表,標籤表,評論表等。

使用者表和文章表關聯,文章型別表與使用者表也關聯,使用者表與評論表關聯,文章也又與標籤關聯。說到這,你也許覺得懷疑人生了。

簡單的歸納如下:

使用者和文章,一對多關係

使用者和文章,多對多關係

文章和標籤,多對多關係

文章和文章型別,一對多關係

用關係型資料庫實現這個雖然不難,但是後續擴充套件起來還是一件比較麻煩的事情。

但是如果用非關係型資料庫,那就一切解決了。

舉個例子,Y總和Z總、L總一起考試,考試完後查成績,程式碼示例如下:

# -*- coding: utf-8 -*-
d = {'Y總': 95, 'Z總': 90, 'L總': 90.5}
print(d['Y總'])或print(d.get('Z總'))

為什麼dict查詢速度這麼快?

因為dict的實現原理和查字典是一樣的。假設字典包含了1萬個漢字,我們要查某一個字,一個辦法是把字典從第一頁往後翻,直到找到我們想要的字為止,這種方法就是在list中查詢元素的方法,list越大,查詢越慢。

 

請務必注意,dict內部存放的順序和key放入的順序是沒有關係的。

和list比較,dict有以下幾個特點:

  1. 查詢和插入的速度極快,不會隨著key的增加而變慢;
  2. 需要佔用大量的記憶體,記憶體浪費多。

而list相反:

  1. 查詢和插入的時間隨著元素的增加而增加;
  2. 佔用空間小,浪費記憶體很少。

所以,dict是用空間來換取時間的一種方法。

dict可以用在需要高速查詢的很多地方,在Python程式碼中幾乎無處不在,正確使用dict非常重要,需要牢記的第一條就是dict的key必須是不可變物件

這是因為dict根據key來計算value的儲存位置,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了。這個通過key計算位置的演算法稱為雜湊演算法(Hash)。

要保證hash的正確性,作為key的物件就不能變。在Python中,字串、整數等都是不可變的,因此,可以放心地作為key。而list是可變的,就不能作為key

 

2.set

set和dict類似,也是一組key的集合,但不儲存value。由於key不能重複,所以,在set中,沒有重複的key。

要建立一個set,需要提供一個list作為輸入集合(注意,Set是不可重複的)

示例程式碼如下:

# -*- coding: utf-8 -*-
s = set([1, 1, 2, 2, 3, 3])
print(s)

輸出程式碼結果如圖:

set如何新增?

s.add() 即可新增 (注意,如果是新增重複的元素,無效,也不會報錯)

s.remove() 可指定索引刪除

set和dict的唯一區別僅在於沒有儲存對應的value,但是,set的原理和dict一樣,所以,同樣不可以放入可變物件,因為無法判斷兩個可變物件是否相等,也就無法保證set內部“不會有重複元素”。試試把list放入set,看看是否會報錯。

使用key-value儲存結構的dict在Python中非常有用,選擇不可變物件作為key很重要,最常用的key是字串。