Try   HackMD

2023-07-15 Python基礎班 筆記

函式

  • 函式定義
  • 參數
  • 預設參數
  • 關鍵字參數
  • 一級函式
  • tuple
# 函式名稱 # 1. 英文/數字/底線的組合 # 2. 名稱第一個字不能是數字 # 3. 不能使用保留字當函式名稱(例: def, if, while, for) # 4. 英文大小寫有區別 def show_me(name = '無名氏'): print(f'Hello I\'m {name}') # 有預設值的參數,其右邊所有的參數都要有預設值 def show_my_info(name = '無名氏', age = 0): print(f'Hello I\' {name}, I\' {age} years old') show_me('aaron') # 函式呼叫 show_me('andy') # 函式呼叫 show_me('apple') # 函式呼叫 show_my_info('aaron', 18) show_my_info('andy', 20) show_me() show_my_info() def test(a, b, c = 0, d = 0, e = 0, f = 0): print(a, b, c, d, e, f) test(1, 2, 3, 4, 5) test(f=1, e=2, d=3, c=4, b=5, a=6) print('*', end='') print('*', end='') print('*', end='') print() # 這個函式沒有回傳值 def noReturn(num): print(num) a = noReturn(999) print('noReturn:', a) def willReturn(num): return num**2 a = willReturn(3) # 回傳值會給呼叫方 print('willReturn:', a) # 寫一個函式plus,傳入兩個數字的參數,加總後回傳給呼叫方並顯示出來 def plus(a, b): return a + b a = plus(1, 2) print(a) # 上面兩行可以寫成 print( plus(1, 2) ) print('-------------------我是分隔線---------------------') # 一級函式 def one(): print('one') one() # 函式呼叫 a = one # one函式本身指派給變數a print('a=', a) print('-------------------我是分隔線2---------------------') a() b = a b() def two(name): print("Hi!", name) a = two a('aaron') c = one() # 函式呼叫 print('c=', c) # Tuple t = (1, 2, 3) # 建立tuple print( type(t) ) print(t[0]) # tuple資料結構無法改變裡面的資料 # del t[0] def math(a, b): return a+b, a-b, a*b, a/b a = math(1, 2) print(a) a = (1, 2, 3) # 建立tuple print(a) print('a type:', type(a)) b = 1, 2, 3 # 建立tuple print(b) print('b type:', type(b)) # 寫一函式demo, 傳入兩個字串,然後回傳,第一個字串在前面以及第二個字串在前面的兩種串接後的結果 def demo(a, b): return a + b, b + a result = demo('first', 'second') print(result) # 建立tuple a = (1, 2, 3) print(a, type(a)) a = 1, 2, 3, print(a, type(a)) a = 1, 2, 3 # 最後一筆資料可以不加逗號 print(a, type(a)) a = 3 print(a, type(a)) a = 3, print(a, type(a)) # 打包, 解包 a = 1, 2, 3, print(a) print(a[0]) print(a[1]) print(a[2]) a, b, c = a # 把tuple a裡面的三筆資料打散存放到a, b, c三個變數當中 print('a=', a) print('b=', b) print('c=', c) b = 1, 2, 3, 4, 5 a, *b, c = b print('a=', a) print('b=', b) print('c=', c) # 寫一函式swap, 可以將兩個變數的內容交換 a = 3 b = 'H' def swap(a, b): return b, a a, b = swap(a, b) print('a=', a) print('b=', b) # callable() def x(): print('I \' x') x() showX = x showX() print('showX callable=', callable(showX) ) # 如果showX式函式,回得到True, 反之False print('a callable=', callable(a)) a = [1, 2, 3] c = sum(a) print('總合為:', c) sum = 5 # 把5指派給內建函式sum, 會把原本的sum功能覆蓋掉 print('sum callable=', callable(sum)) if(callable(sum)): c = sum(a) del sum # 恢復sum原本的函式功能 print('sum callable=', callable(sum)) if(callable(sum)): c = sum(a) print('總合為(part 2):', c)

字典dict

# 字典 c = {'a': 3, 3: 'PP'} print( c['a'] ) a = {} # 建立空dict a = dict() # 建立空dict print(type(a)) a = set() # 建立空set print(type(a)) a = list() # 建立空list a = [] # 建立空list print(type(a)) a = () # 建立空tuple a = tuple() # 建立空tuple print(type(a)) a = {1: 1, '4': 'aa', True: 65, (1, 2): 'tuple', 99: [1, 2, 3], 99: 88} # 常數值才能當key print(a) print(a[True]) print(a[(1, 2)]) print(int(True)) # 新增dict資料 a['ok'] = 999 # 修改資料 a[(1, 2)] = 'xxxx' # 刪除資料 del a['4'] # 刪除不存在資料會發生例外 if '4' in a: del a['4'] else: print('\'4\' 這個key不存在') print(a) print(a.keys()) print(a.values()) for k in a: print(k, a[k])

函式: 不定長度參數

# 寫一個函式count_plus,可以傳入任意個參數,加總後回傳 def count_plus(*num): # 不定長度參數, 參數會以tuple的型態傳入 return sum(num) print( count_plus(1) ) print( count_plus(1, 2) ) print( count_plus(1, 2, 3) ) print( count_plus() ) def my_data(**data): # 不定長度參數,參數會以dict型態傳入 total = 0 for k in data: total = total + data[k] return total print( my_data(a=1) ) print( my_data(a=1, xx=2) )

類別與物件

class MyClass: # 定義類別 def showMe(self, name): # 方法 method print(f'Hello! {name}, self.x={self.x}') def showInfo(self, age): print(f'I\'m {age} years old, self.x={self.x}, self.y={self.y}') # 建構式通常用來作事前準備工作 def __init__(self): self.x = 5 # 建立屬性 self.y = 99 # 建立屬性 print('我是建構式') def __str__(self): return f'我裡面有屬性x={self.x}和y={self.y}' # 建立物件 a = MyClass() # 建立物件 <--- 這裡會呼叫建構式 a.showMe('aaron') a.showInfo(19) print(a)

學生成績管理系統

# 學生成績管理系統 # 主功能: # 1. 管理學生成績 # - 新增學生成績 # - 刪除學生成績 # 2. 查詢學生成績 # - 依學號查詢 # - 查詢全部 # # (資料存檔,資料讀取) import csv # 字典dict grades = {} # 存放全部資料的字典 def student_system(): while True: print('-----------------') print('學生成績管理系統') print('-----------------') print('1. 管理學生成績') print('2. 查詢學生成績') print('3. 離開') user_input = input('=> ') # 等待使用者輸入 if user_input == '1': management() elif user_input == '2': query() else: break # 離開系統 def management(): while True: print('-----------------') print('管理學生成績') print('-----------------') print('1. 新增學生成績') print('2. 刪除學生成績') print('3. 回主功能表') user_input = input('=> ') # 等待使用者輸入 if user_input == '1': add_grade() elif user_input == '2': del_grade() else: break # 離開管理學生成績 def query(): while True: print('-----------------') print('查詢學生成績') print('-----------------') print('1. 依姓名查詢') print('2. 查詢全部') print('3. 回主功能表') user_input = input('=> ') # 等待使用者輸入 if user_input == '1': query_by_no() elif user_input == '2': query_all() else: break # 離開查詢學生成績 # 新增一筆資料 def add_grade(): name = input('請輸入學生姓名:') no = input('請輸入學號:') mandrain = int(input('請輸入國文成績:')) english = int(input('請輸入英文成績:')) math = int(input('請輸入數學成績:')) # 將資料新增到字典 grades[name] = [no, mandrain, english, math] # 存檔 save() print('新增完成') print(grades) # 開發中, 測試用 # 刪除一筆資料(以字典的key來刪除資料) def del_grade(): name = input('請輸入要刪除的姓名:') if name in grades: del grades[name] # 存檔 save() print('刪除完成') else: print('查無此人') print(grades) # 開發中, 測試用 # 將全部資料寫入csv檔 def save(): with open('student_system.csv', 'w', encoding='utf-8', newline='') as file: writer = csv.writer(file) # 寫入標題 writer.writerow(['姓名', '學號', '國文', '英文', '數學']) # 寫入資料 for key in grades: a = [key] a.extend(grades[key]) # 將dict資料轉成list writer.writerow(a) # 寫入csv # 讀取資料 def load(): with open('student_system.csv', 'r', encoding='utf-8') as file: reader = csv.reader(file) next(reader) # 跳過第一列不要讀取 for row in reader: grades[row[0]] = row[1:] print(grades) def query_by_no(): name = input('請輸入姓名:') if name in grades: print(f'姓名: {name}, 學號: {grades[name][0]}, 國文: {grades[name][1]}, 英文: {grades[name][2]}, 數學: {grades[name][3]}') else: print('查無此人') def query_all(): for name in grades: print(f'姓名: {name}, 學號: {grades[name][0]}, 國文: {grades[name][1]}, 英文: {grades[name][2]}, 數學: {grades[name][3]}') # 第一次啟動會沒有存檔可以load, 會產生例外 try: load() except FileNotFoundError: print('全新系統') student_system()