電腦科學和Python程式設計導論(二 ) Python簡介

Datawhale發表於2018-07-16

基本概念

1. 程式語言的分類

低階程式設計與高階程式設計:二者之間的區別是,編寫程式時,我們是使用機器層次的指令和資料物件(底層操作),還是使用語言設計者提供的更為抽象的操作(圖形使用者介面,UI)。

通用性與專注於某一應用領域:指程式語言中的基本操作是廣泛適用的還是隻針對某個領域,例如SQL。

解釋執行與編譯執行:指程式設計師編寫的指令序列,即原始碼是直接執行(通過直譯器,使用解釋型語言編寫的程式更易除錯,因為直譯器可以給出與原始碼相關的錯誤資訊。),還是要先轉換成機器層次的基礎操作序列。(通過編譯器,編譯型語言(如,java)編寫的程式速度更快,佔用的空間也更少。)

2. Python 基本元素

python中物件:物件分為標量物件(不可再分)和非標量物件(有內部結構,可再分)。Python有以下4類標量物件:

  1. int:表示整數。
  2. float:表示實數。
  3. bool:表示布林值True和False。
  4. None:這個型別只有一個值。

操作符:物件和操作符可以組成表示式,每個表示式都相當於某種型別的物件,我們稱其為表示式的值。

int型別和float型別支援的操作符

  1. i + j:i和j的和。
  2. i - j:表示i減j。
  3. i * j:i和j的積。
  4. i // j:表示整數除法。只返回商,不返回餘數。
  5. i / j:表示i除以j。
  6. i % j:表示int i除以int j的餘數。通常讀作i mod j,是i modulo j的縮寫。
  7. i ** j:表示i的j次方。如果i和j都是int型別,結果也是int型別。

:如果i和j都是int型別,結果也是int型別。如果其中任意一個是float型別,那麼結果就是float型別。

比較運算子:包括:==(等於)、!=(不等於)、>(大於)、>=(大於等於)、<(小於)和<=(小於等於)。

bool型別上的基本操作符:and、or和not

  1. a and b:當a和b都為True時,值為True,否則為False。
  2. a or b:當a和b至少有一個為True時,值為True,否則為False。
  3. not a:如果a為False,值為True;如果a為True,值為False。

變數:在Python中,變數僅是名稱,沒有其他意義。賦值語句將=左邊的名稱與=右邊的表示式所表示的物件關聯起來,一個物件可以有一個或多個名稱與之關聯,也可以不關聯任何名稱。

多重賦值:Python支援多重賦值。如:x, y = 2, 3

變數名:將程式寫得清晰易懂極其重要,恰當地選擇變數名稱在增強程式可讀性方面扮演了重要角色。

  1. 在Python中,變數名可以包含大寫字母、小寫字母、數字(但不能以數字開頭)和特殊字元_。
  2. Python變數名是大小寫敏感的,如Julie和julie就是不同的變數名。最後,Python中還有少量的保留字(有時稱為關鍵字),它們有專門的意義,不能用作變數名。
  3. Python 3中的保留字包括and、as、assert、break、class、continue、def、del、elif、else、except、False、finally、for、from、global、if、import、in、is、lambda、nonlocal、None、not、or、pass、raise、return、True、try、while、with和 yield。

3. 程式分支

最簡單的分支型程式是條件語句

程式執行時間:

  1. 假定每行程式碼都需要以單位時間執行,那麼有n行程式碼的直線型程式就需要n個單位時間。那麼有n行程式碼的分支型程式呢?它執行的時間可能會少於n個單位時間,但絕不會超過n個單位時間,因為每行程式碼至多執行一次。
  2. 如果一個程式執行的最長時間是由程式長度決定的,那麼可以稱為以常數時間執行。這並不意味著它每次執行都執行相同的步驟,而意味著存在一個常數k,使得這個程式肯定會在k個步驟之內結束執行。其中隱含的意義是,這種程式的執行時間並不隨著程式輸入量的增加而增加。

4. 字串和輸入

str型別的物件:用來表示由字元組成的字串。str型別的字面量可以用單引號或雙引號表示,如’abc’或”abc”。

過載:即根據應用其上的物件型別的不同,它的意義也不同。操作符+存在過載的情形,例如:

  1. 應用於兩個數值物件時,它表示相加;
  2. 應用於兩個字串時,它表示連線。

字串:是Python中的序列型別之一。所有序列型別都可以執行以下操作:

  1. 可以使用len函式求出字串的長度。例如,len(‘abc’)的值是3。
  2. 可以使用索引從字串提取單個字元。例如,在直譯器中輸入’abc’[0]會顯示字串’a’。
  3. 可以使用切片操作從字串提取任意長度的子串。如果s是個字串,那麼表示式s[start:end]就表示s中從索引start開始至索引end-1結束的子串。例如,’abc’[1:3] =’bc’ 。
    :為什麼在索引end-1 處而不是在end 處結束呢? 這樣做是為了讓’abc’[0:len(‘abc’)]這樣的表示式具有我們希望的值。如果冒號前面的索引值省略,那麼預設值為0;如果冒號後面的索引值省略,那麼預設值就是字串的長度。於是,表示式’abc’[:]在語義上就等同於更加冗長的’abc’[0:len(‘abc’)]。

input函式:可以直接接受使用者輸入。它可以使用一個字串作為引數,顯示在shell中作為提示資訊,然後等待使用者輸入,使用者輸入以Enter鍵結束。使用者輸入的行資訊被看作一個字串,併成為這個函式的返回值。

name = input('Enter your name: ')

字串進行型別轉換:只要字串中的值是某種型別的有效字面量,就可以對字串進行型別轉換。

  1. 例如,int(‘3’) * 4的值是12。

  2. 當一個float值被轉換成int值時,數值是被截斷的(不是四捨五入)。
    例如,int(3.9)的值是int 3。

Unicode編碼的由來

字串存在編碼問題。

  1. 計算機只能處理數字,如果要處理文字,就必須先把文字轉換為數字才能處理。最早的計算機在設計時採用8個位元(bit)作為一個位元組(byte),所以,一個位元組能表示的最大的整數就是255(二進位制11111111=十進位制255)(2的8次冪等於256,即8個位置每個位置可以選擇0或者1,總共有256種可能,從0開始就到了255),0 - 255被用來表示大小寫英文字母、數字和一些符號,這個編碼表被稱為ASCII編碼,比如大寫字母 A 的編碼是65,小寫字母 z 的編碼是122。
  2. 如果要表示中文,顯然一個位元組是不夠的,至少需要兩個位元組,而且還不能和ASCII編碼衝突,所以,中國製定了GB2312編碼,用來把中文編進去。
  3. 類似的,日文和韓文等其他語言也有這個問題。為了統一所有文字的編碼,Unicode應運而生。Unicode把所有語言都統一到一套編碼裡,這樣就不會再有亂碼問題了。
  4. Unicode通常用兩個位元組表示一個字元(這時候就有2的16次冪種可能),原有的英文編碼從單位元組變成雙位元組,只需要把高位元組全部填為0就可以。

UnicodeDecodeError處理:
如果中文字串在Python環境下遇到 UnicodeDecodeError,這是因為.py檔案儲存的格式有問題。 可以在第一行新增註釋:

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

目的是告訴Python直譯器,用UTF-8編碼讀取原始碼。

5. 迭代

需要程式多次做同一件事情的時候,可以使用迭代語句,最簡單的迭代語句就是for迴圈

程式設計練習

1.實際練習:編寫一個程式,檢查3個變數x、y和z,輸出其中最大的奇數。如果其中沒有奇數,就輸出一個訊息進行說明。

# 解法1
def odd_max_input(x, y, z):
    list = []
    for i in [x, y, z]:
        if i % 2 == 1:
            list.append(i)
    if len(list) == 0:
        print('沒有奇數')
    else:
        print(max(list))
# 解法2
def odd_max_input(x,y,z):
    a=sorted([x,y,z],reverse=True)
    for i in a:
        if i%2==1:
            return i
    print('沒有奇數')
# 解法3
def odd_max_input2(x,y,z):    
    a=[x,y,z]
    max =0
    for i in a:
        if i%2==1:
            if i > max:
                max = i
    if max==0:  
        print('沒有奇數')
    else:
        print(max)

2.實際練習:將以下程式碼中的註釋替換為while迴圈語句。
numXs = int(input(‘How many times should I print the letter X? ‘))
toPrint = ”
numXss=abs(numXs)
concatenate X to toPrint numXs times

numXs = int(input('How many times should I print the letter X? '))
toPrint = ''
while numXss!=0:
    toPrint = toPrint+'X'
    numXss=numXss-1
print(toPrint)

3.實際練習:編寫一個程式,要求使用者輸入10個整數,然後輸出其中最大的奇數。如果使用者沒 有輸入奇數,則輸出一個訊息進行說明。

# 解法1
a=0
numXs =[]
while a!=10:
    b=int(input('please input 10 int '))
    numXs.append(b)
    a+=1
numXss=sorted(numXs,reverse=True)
c=0
for i in numXss:
    c+=1
    if i%2==1:
        print('最大的奇數是{}'.format(i))
        break
    elif c==10:
# 解法2
r = input('輸入10個數字,用,[英文格式]間隔:')
list = [i for i in map(lambda i: int(i), r.split(',')) if i % 2 == 1]
print(list)
if len(list) == 0:
    print('no odd')
else:
    print(max(list))

相關文章