[3] 語法觀念 & 基本資料型別


Posted by bessyhuang on 2023-05-02

縮排和註解

縮排 (Indentation)

  • 相當於四個 Spaces,或是一個 Tab。
  • 利用 縮排 而非 大括號 { } 來辨識程式的執行區塊。
  • 注意:「同一個段落裡,只能使用一種縮排方式」,因此不論是使用幾個空白或是 tab,只要「不要混用」,程式就不會發生錯誤。
x = 1
if x == 1:
    print("x is 1.")

註解 (Comments)

  • 方便理解程式碼在寫啥。
  • 註解內不會被執行。
# 我是單行註解

"""
我是
多行註解
"""

'''
我是
多行註解
'''

Variable (變數)

💡 Python 不需要在使用前先宣告變數,也不需要幫變數宣告資料型別。
   因為 Python 能自動辨別資料型別 (Types)。【 動態型別 】
  • 變數,表示的是「某個物件」的「名稱」,當給予某個變數內容時,其實是將內容放入一個物件「容器」中儲存,然後「給予這個物件一個變數名稱」。

    • 簡單來說,是指「內容會改變」的數,舉凡文字、數字、布林值 (邏輯)、陣列 ...等內容格式,都可以是變數所包含的內容。

        a = 1
        print(a)      # 得到結果 1
      
        a = b = 3.14
        print(a, b)   # 得到結果 3.14  3.14
      
        a, b, c = 1, 2, 3
        print(a)   # 1
        print(b)   # 2
        print(c)   # 3
      
  • 變數命名
    • 開頭不能為數字
    • 使用 A-z, 0-9 命名
    • 請勿使用 保留字 來做為變數的命名!
# Python 的保留字 (Reserved Word)
import keyword
print(keyword.kwlist)

['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 
'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 
'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
  • 好的變數名稱
    • 把握一個重點:「看到變數的名稱,就知道是儲存什麼資料」
      • 「常數」,即變數的內容不會被改變的數
        • 變數名稱建議「全部用大寫英文字母」,例如 LOG_PATH。
      • 「變數名稱包含專有名詞」,例如 HTTP、APP,
        • 變數名稱使用原來的大小寫格式,例如 HTTP_port、APP_port。
      • 命名方式二擇一
        • 駝峰式命名(Camel Case)
          • e.g. EnglishScore = 100
        • _ 底線隔開來命名
          • e.g. english_score = 100

全域變數 vs. 區域變數

一個變數的名稱,除了可以代表不同的東西,也表示「哪裡可以使用」這個變數。
  • Python 裡的主程式與每個函式,都有各自的名稱空間 (namespace):
    • 主程式:「全域變數」的作用範圍,定義「全域」的名稱空間
      • 全域變數 = 主程式裡定義的變數
    • 個別函式:「區域變數」的作用範圍,定義「區域」的名稱空間
      • 區域變數 = 個別函式裡定義的變數
    • 每個名稱空間裡的變數名稱都是「唯一的」
    • 不同名稱空間內的變數,其名稱可以相同
      • 如:函式 f1() 可以定義 a 變數,函式 f2() 亦同,但兩個 a 變數的值是完全不同的。

def f1():
    a = 1       # 定義區域變數 a 等於 1
    print(a)

def f2():
    a = 2       # 定義區域變數 a 等於 1
    print(a)

b = 3           # 定義全域變數 b 等於 3

print(f1())         # 1
print(f2())         # 2

數值

💡 Python 3 整數就是整數,不再區分整數與長整數。
   整數的長度不受限制(除了硬體上的限制之外)。
  • Python 裡,數字又分成「整數」、「浮點數」(小數) 和「底數」,數字可以進行各種數學式的運算,也可以進行各種邏輯比較、時間表達等以數字為主的運算。

Integer 整數

  • 整數,表示沒有分數或小數點的十進位數字。

    # 查看「型別」
    type(5)      # <class 'int'>
    
  • 依循「先乘除後加減」的規則。

    • 運算子
      • +, -, *, /
      • // 除法取整數 ( 無條件捨去 )
      • % 餘數
      • ** 次方
  • int 函式也可以進行二進制、八進制、十六進制的轉換。
     int('101', 2)  # 5   二進制
     int('101', 8)  # 65  八進制
     int('101', 16) # 257 十六進制
    

Float 浮點數

  • 浮點數,表示包含小數點的十進位數字
    • 注意,由於計算機有位元數限制,有小數點的數字最多只有 15 位有效數字。
# 查看「型別」
type(3.14)      # <class 'float'>

Complex 複數

a = 1 + 2j
print(type(a))
# <class 'complex'>

底數

  • 底數是在數字的前方,加入 0b、0o 或 0x 的底數,來表示二進制、八進制或十六進制的數字,在「位元級」的模式下,往往是使用二進制、八進制或十六進制進行操作。
    • 底數
      • 0b 或 0B: 二進制
      • 0o 或 0O: 八進制
      • 0x 或 0X: 十六進制
0b1111 # 15 ( 二進制 )
0o1111 # 585 ( 八進制 )
0x1111 # 4369 ( 十六進制 )

Bool 布林

  • 布林值可設定為兩種值 : True 或 False
    • True = 1
    • Fasle = 0
  • 透過特殊函示 bool() 可以將任何資料型態轉換成布林,布林主要運用在邏輯判斷中,可以根據得到的布林值,作出對應的動作。
    • 布林值通常是一個運算的結果。
bool(True)  # True
bool(1)     # True
bool('ok')  # True
bool(-1)    # True

bool(False)  # False
bool(0)      # False
bool(0.0)    # False

a = 1
b = 2
print(a != b) # True
print(a == b) # False

字串

💡 Python 的強項之一,支援字串的運算。
  • 字串是 Python 裡最常使用的序列,可以包含字母、數字、符號、標點甚至空格、換行。
  • 建立字串

    • 單行字串
      • 將字元 (字母、符號或數字) 放在一對「單引號」或「雙引號」裡。
          print("'oxxo' is my name")
          # 'oxxo' is my name
        
    • 多行字串 (文字很多且會換行)

      • 將多行字串放在「連續三個」單引號或雙引號裡,就會原封不動的印出結果。

          a = """123
          456
          789"""
          print(a)     # '123\n456\n789'
        
          b = '''aaa  \
          bbb \
          ccc'''
          print(b)     # 'aaa  bbb ccc'
        
          💡 字串內寫的所有格式(空白、換行...),皆會直接反映在輸出上。
        
          sent4 = """別害怕別人怎麼看你,
          因為
          根本沒人會看你 ^ ^"""
        
          sent5 = '''
          感情這條路上挺順暢,
             因為
                這一路上都沒人 0.0
          '''
        
    • 轉義字元 = 跳脫字元

      • 「轉義」表示「轉換字串內一些字元的含義」,亦即可以顯示那些無法在螢幕上顯示的符號。
      • 只要在需要轉換的字元前方,加上「反斜線 \」,就能賦予其特殊意義。

        • \ (放在一行結尾):接續下一行
        • \\:顯示反斜線
        • \'\":顯示單引號 和 雙引號
        • \n\t:換行 和 tab 鍵

            print('hello "World", my name is \'oxxo\', \\_\\')
            # hello "World", my name is 'oxxo', \_\
          
            # 方法一:使用 反斜線 (跳脫字元) 來處理。
            sent1 = "憂国の\"モリアーティ\""
            sent2 = 'I\'m Bessy.'
          
            # 方法二:若是字串本身包含單引號,可以使用雙引號以利區別。反之亦然。
            sent1 = '憂国の"モリアーティ"'
            sent2 = "I'm Bessy."
          
            print(sent1)       # 憂国の"モリアーティ"
            print(type(sent1)) # <class 'str'>
          
    • 前方加上 r

      • 字串的前方加上「r」,表示這個字串為「raw string」,不要進行轉義。

          a = r'123\n456'
          b = '123\n456'
        
          print(a)
          # 123\n456
        
          print(b)
          # 123
          # 456
        
    • 結合字串
      • 串接多個字串 (字串相加)
        • 使用 + 可以針對「變數」與「字串」進行結合。
        • e.g. a = '在哪裡跌倒,' + '就在那躺下。'
    • 重複字串
      • 重複印出相同字串
        • 字串後方使用 * 加上數字,可以指定該字串要重複幾次。
        • e.g. a = 'ok' * 10

強制型別轉換

  • 強制轉換為字串:str()
  • 強制轉換為整數:int()
    • int("3.4") 產生錯誤
    • int("003") 將會回傳 3
  • 強制轉換為可計算的數值 (可處理較複雜的轉換):eval()
    • eval("3+4") 將會回傳 7
    • eval("003") 產生錯誤
  • 強制轉換為浮點數:float()

輸入與輸出

輸入 (Input)

input(prompt=None)
  • prompt:提示信息
  • input() 默認使用者輸入的是一個「字串 (str)」型別。

      💡 經常與 input() 函式一起使用。
    
      number = eval(input("請輸入任意數值:"))
      # 此時,number 為字串,其需要轉換成數值,才能進行數值運算。
    

輸出 (Output)

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
  • sep:預設使用 space 空格 來間隔。
  • end:預設使用 \n 換行 來結尾。

      print("I", "am", "xxx", sep="/", end="@")
      # I/am/xxx@
    
      print('哈囉' + str(123))
      # 哈囉123
    

補充:pprint()

  • 一種 Python 標準化輸出的輸出模式。
  • [經典用法] 將 Dictionary 的資料型態按照 Key-Value 由上到下印出,屬於人類較容易閱讀的版面。
from pprint import pprint

animals = {'dog': 1, 'cat': 2, 'elephant': 3, 'alligator': 4, 'ape': 5, 'baboon': 6, 'bear': 7}
pprint(animals)

{'alligator': 4,
 'ape': 5,
 'baboon': 6,
 'bear': 7,
 'cat': 2,
 'dog': 1,
 'elephant': 3}

格式化輸出

format() 格式化

  • 「{}」和「foramt()」是 Python 3 所使用的「新式」格式化,操作方式為「格式化字串.format(資料)」,輸出結果會將資料插入格式化字串的位置。

    • {} 裡可以填入數字,數字表示「填入資料的順序」
    • {} 裡可以填入具名引數,放入指定名稱的內容。
    • {} 裡可以填入字典的引數,放入指定的字典內容。

        # 填入數字
        a = 'hello {1}, I am {0}'
        b = a.format('world', 'oxxo')
        print(b)   # hello oxxo, I am world ( world 和 oxxo 互換了 )
      
        # 填入具名引數
        a = 'hello {m}, I am {n}'
        b = a.format(m='world', n='oxxo')
        print(b)   # hello world, I am oxxo
      
        # 填入字典的引數
        a = 'hello {0[x][m]}, I am {0[y][m]}'
        b = {'x': {'m':'world', 'n':'oxxo'}, 'y':{'m':'QQ', 'n':'YY'}}
        c = a.format(b)
        print(c)    # hello world, I am QQ
      
  • 數值 (整數)、字串

      sent1 = "世界上只有騙子肯定是真心,因為他是真心想騙你。"
      sent2 = "我最擅長的戀愛就是自戀,因為愛自己沒情敵。"
      sent3 = "以前我以為錢可以買到一切,後來才發現沒有辦法,因為我錢不夠。"
    
      print("# 幹話語錄\n\n  {}. {}\n\n  {}. {}\n\n  {}. {}".format(1, sent1, 2, sent2, 3, sent3))
      print("# 幹話語錄\n\n  {no1}. {first}\n\n  {no2}. {second}\n\n  {no3}. {third}".format(no1=1, no2=2, no3=3, first=sent1, second=sent2, third=sent3))
    
  • 浮點數
      # 精確度為 3 位,四捨五入
      print(format(1234.5678, ".3f"))            # 1234.568
    

% 格式化

  • % 的字串格式化是「舊式」的格式化方法,適用於 Python 2.x 和 Python 3.x,操作方式為「格式化字串 % 資料」,輸出結果會將資料插入格式化字串的位置。

    • %s:字串

        # 字串
        print('My name is %s.' % 'Bessy')          # My name is Bessy.
      
        print('%s world' % 'hello')      # hello world
        print('%12s world' % 'hello')    #        hello world
        print('%+12s world' % 'hello')   #        hello world
        print('%-12s world' % 'hello')   # hello        world
      
        a = '%s world, ther are %f dollars!'
        b = a % ('hello', 2.5)
        print(b)   # hello world, ther are 2.500000 dollars!
      
    • %d:十進制整數 (會將浮點數的小數點無條件捨去)
    • %f:十進制浮點數 (會將整數轉換成浮點數)

        # 數值
        print('%.3f world' % 123.456789)           # 123.457 world
      

References

  1. STEAM 教育學習網 - Python 教學

#Python #語法觀念 #基本資料型別







Related Posts

Express template engine - Handlebars 功能

Express template engine - Handlebars 功能

The prototype chain in JavaScript

The prototype chain in JavaScript

跨領域自學程式設計常見問題解析 FAQ

跨領域自學程式設計常見問題解析 FAQ


Comments