---
# System prepended metadata

title: wk12_1123
tags: [Python]

---

## 【wk12_1123】函式模組_期末專題參考

## 【inclass practice】

ch07_函式與模組
	
7.1  自訂函式
- 變數有效範圍

7.2  數值函式
- 數值函式整理
- 指數、商數、餘數及四捨六入
- 最大值、最小值、總和及排序

7.3 字串函式
- 字串函式整理
- 連接及分割字串
- 檢查起始或結束字串
- 字串排版相關函式
- 搜尋即取代字串


```python
# 大樂透中獎號碼

import random as r

list1 = r.sample(range(1, 50), 7)

special = list1.pop()

print(f"特別號 = {special}")
print(f"中獎號碼 = {list1}")
```

    特別號 = 48
    中獎號碼 = [46, 14, 43, 45, 42, 22]
    


```python
# 1A2B
# 函式1 : 數字相同 + 位置相同
# 函式2 : 數字相同 + 位置不同 

secret = "".join(r.sample("123456789", 4))

print(secret)

guess = "1234"

a = 0
b = 0

for i in range (4) : 
    if guess[i] == secret[i] : 
        a = a + 1
    elif guess[i] in secret : 
        b = b + 1

print(f"{a}A{b}B")
```

    4317
    0A3B
    


```python
# 1A2B
# 函式1 : 數字相同 + 位置相同
# 函式2 : 數字相同 + 位置不同 

def evaluate(guess) : 
    a = 0
    b = 0

    for i in range (4) : 
        if guess[i] == secret[i] : 
            a = a + 1
        elif guess[i] in secret : 
            b = b + 1
    return a,  b    
        
secret = "".join(r.sample("123456789", 4))

print(secret)


while True :
    guess = input("guess, enter 4 numbers, enter直接結束遊戲")
    if len(guess) == 0 : 
        print(f"bye")
        break
    
    a, b = evaluate(guess)
    print(f"{a}A{b}B")
    
    if a == 4 :
        break
    
if a == 4 : 
    print("bingo")
```

    2645
    

    guess, enter 4 numbers, enter直接結束遊戲 1234
    

    0A2B
    

    guess, enter 4 numbers, enter直接結束遊戲 
    

    bye
    


```python
! pip install pygame
```

    Requirement already satisfied: pygame in c:\users\selin\anaconda3\lib\site-packages (2.5.2)
    


```python
# 貪吃蛇專案導讀

"""
Snake Eater
Made with PyGame
"""

import pygame, sys, time, random


# Difficulty settings
# Easy      ->  10
# Medium    ->  25
# Hard      ->  40
# Harder    ->  60
# Impossible->  120
difficulty = 25

# Window size
frame_size_x = 720
frame_size_y = 480

# Checks for errors encountered
check_errors = pygame.init()
# pygame.init() example output -> (6, 0)
# second number in tuple gives number of errors
if check_errors[1] > 0:
    print(f'[!] Had {check_errors[1]} errors when initialising game, exiting...')
    sys.exit(-1)
else:
    print('[+] Game successfully initialised')


# Initialise game window
pygame.display.set_caption('Snake Eater')
game_window = pygame.display.set_mode((frame_size_x, frame_size_y))


# Colors (R, G, B)
black = pygame.Color(0, 0, 0)
white = pygame.Color(255, 255, 255)
red = pygame.Color(255, 0, 0)
green = pygame.Color(0, 255, 0)
blue = pygame.Color(0, 0, 255)


# FPS (frames per second) controller
fps_controller = pygame.time.Clock()


# Game variables
snake_pos = [100, 50]
snake_body = [[100, 50], [100-10, 50], [100-(2*10), 50]]

food_pos = [random.randrange(1, (frame_size_x//10)) * 10, random.randrange(1, (frame_size_y//10)) * 10]
food_spawn = True

direction = 'RIGHT'
change_to = direction

score = 0


# Game Over
def game_over():
    my_font = pygame.font.SysFont('times new roman', 90)
    game_over_surface = my_font.render('YOU DIED', True, red)
    game_over_rect = game_over_surface.get_rect()
    game_over_rect.midtop = (frame_size_x/2, frame_size_y/4)
    game_window.fill(black)
    game_window.blit(game_over_surface, game_over_rect)
    show_score(0, red, 'times', 20)
    pygame.display.flip()
    time.sleep(3)
    pygame.quit()
    sys.exit()


# Score
def show_score(choice, color, font, size):
    score_font = pygame.font.SysFont(font, size)
    score_surface = score_font.render('Score : ' + str(score), True, color)
    score_rect = score_surface.get_rect()
    if choice == 1:
        score_rect.midtop = (frame_size_x/10, 15)
    else:
        score_rect.midtop = (frame_size_x/2, frame_size_y/1.25)
    game_window.blit(score_surface, score_rect)
    # pygame.display.flip()


# Main logic
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        # Whenever a key is pressed down
        elif event.type == pygame.KEYDOWN:
            # W -> Up; S -> Down; A -> Left; D -> Right
            if event.key == pygame.K_UP or event.key == ord('w'):
                change_to = 'UP'
            if event.key == pygame.K_DOWN or event.key == ord('s'):
                change_to = 'DOWN'
            if event.key == pygame.K_LEFT or event.key == ord('a'):
                change_to = 'LEFT'
            if event.key == pygame.K_RIGHT or event.key == ord('d'):
                change_to = 'RIGHT'
            # Esc -> Create event to quit the game
            if event.key == pygame.K_ESCAPE:
                pygame.event.post(pygame.event.Event(pygame.QUIT))

    # Making sure the snake cannot move in the opposite direction instantaneously
    if change_to == 'UP' and direction != 'DOWN':
        direction = 'UP'
    if change_to == 'DOWN' and direction != 'UP':
        direction = 'DOWN'
    if change_to == 'LEFT' and direction != 'RIGHT':
        direction = 'LEFT'
    if change_to == 'RIGHT' and direction != 'LEFT':
        direction = 'RIGHT'

    # Moving the snake
    if direction == 'UP':
        snake_pos[1] -= 10
    if direction == 'DOWN':
        snake_pos[1] += 10
    if direction == 'LEFT':
        snake_pos[0] -= 10
    if direction == 'RIGHT':
        snake_pos[0] += 10

    # Snake body growing mechanism
    snake_body.insert(0, list(snake_pos))
    if snake_pos[0] == food_pos[0] and snake_pos[1] == food_pos[1]:
        score += 1
        food_spawn = False
    else:
        snake_body.pop()

    # Spawning food on the screen
    if not food_spawn:
        food_pos = [random.randrange(1, (frame_size_x//10)) * 10, random.randrange(1, (frame_size_y//10)) * 10]
    food_spawn = True

    # GFX
    game_window.fill(black)
    for pos in snake_body:
        # Snake body
        # .draw.rect(play_surface, color, xy-coordinate)
        # xy-coordinate -> .Rect(x, y, size_x, size_y)
        pygame.draw.rect(game_window, green, pygame.Rect(pos[0], pos[1], 10, 10))

    # Snake food
    pygame.draw.rect(game_window, white, pygame.Rect(food_pos[0], food_pos[1], 10, 10))

    # Game Over conditions
    # Getting out of bounds
    if snake_pos[0] < 0 or snake_pos[0] > frame_size_x-10:
        game_over()
    if snake_pos[1] < 0 or snake_pos[1] > frame_size_y-10:
        game_over()
    # Touching the snake body
    for block in snake_body[1:]:
        if snake_pos[0] == block[0] and snake_pos[1] == block[1]:
            game_over()

    show_score(1, white, 'consolas', 20)
    # Refresh game screen
    pygame.display.update()
    # Refresh rate
    fps_controller.tick(difficulty)
```


```python
# 貪吃蛇專案導讀

import pygame, sys, time, random

difficulty = 10

black = pygame.Color(0, 0, 0)
white = pygame.Color(255, 255, 255)
red = pygame.Color(255, 0, 0)
green = pygame.Color(0, 255, 0)
blue = pygame.Color(0, 0, 255)

frame_size_x = 720
frame_size_y = 480

food_pos = [random.randrange(1, (frame_size_x//10)) * 10, random.randrange(1, (frame_size_y//10)) * 10]

check_errors = pygame.init()
# pygame.init() example output -> (6, 0)
# second number in tuple gives number of errors
if check_errors[1] > 0:
    print(f'[!] Had {check_errors[1]} errors when initialising game, exiting...')
    sys.exit(-1)
else:
    print('[+] Game successfully initialised')

food_spawn = True
direction = 'RIGHT'
change_to = direction

snake_pos = [100, 50]
snake_body = [[100, 50], [100-10, 50], [100-(2*10), 50]]

pygame.display.set_caption('Snake !')
game_window = pygame.display.set_mode((frame_size_x, frame_size_y))

fps_controller = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            # W -> Up; S -> Down; A -> Left; D -> Right
            if event.key == pygame.K_UP or event.key == ord('w'):
                change_to = 'UP'
            if event.key == pygame.K_DOWN or event.key == ord('s'):
                change_to = 'DOWN'
            if event.key == pygame.K_LEFT or event.key == ord('a'):
                change_to = 'LEFT'
            if event.key == pygame.K_RIGHT or event.key == ord('d'):
                change_to = 'RIGHT'
            # Esc -> Create event to quit the game
            if event.key == pygame.K_ESCAPE:
                pygame.event.post(pygame.event.Event(pygame.QUIT))

    if change_to == 'UP' and direction != 'DOWN':
        direction = 'UP'
    if change_to == 'DOWN' and direction != 'UP':
        direction = 'DOWN'
    if change_to == 'LEFT' and direction != 'RIGHT':
        direction = 'LEFT'
    if change_to == 'RIGHT' and direction != 'LEFT':
        direction = 'RIGHT'

    # Moving the snake
    if direction == 'UP':
        snake_pos[1] -= 10
    if direction == 'DOWN':
        snake_pos[1] += 10
    if direction == 'LEFT':
        snake_pos[0] -= 10
    if direction == 'RIGHT':
        snake_pos[0] += 10

    snake_body.insert(0, list(snake_pos))
    if snake_pos[0] == food_pos[0] and snake_pos[1] == food_pos[1]:
        # score += 1  # 這行被註解掉，因為 score 變量沒有被定義
        food_spawn = False
    else:
        snake_body.pop()

    if not food_spawn:
        food_pos = [random.randrange(1, (frame_size_x//10)) * 10, random.randrange(1, (frame_size_y//10)) * 10]
    food_spawn = True

    game_window.fill(black)
    for pos in snake_body:
        pygame.draw.rect(game_window, green, pygame.Rect(pos[0], pos[1], 10, 10))

    pygame.display.update()
    fps_controller.tick(difficulty)
```

    [+] Game successfully initialised
    

## 【afterclass practice】

1. 尋找期末專題主題
2. {範例}
- 學生分蘋果 
- 總和及排序
- 檢查網址格式 
- 以字串排版函式列印成績單
- 轉換日期格式 
3. {綜合演練}
- 實作3
- 實作4

### 尋找期末專題主題

消消樂

### 範例


```python
#學生分蘋果
# divmod

person = int(input("請輸入學生人數: "))
apple = int(input("請輸入蘋果總數: "))
ret = divmod(apple, person)

print("每個學生可分得蘋果 " + str(ret[0]) + " 個")
print("蘋果剩餘 " + str(ret[1]) + " 個")
```

    請輸入學生人數:  50
    請輸入蘋果總數:  46
    

    每個學生可分得蘋果 0 個
    蘋果剩餘 46 個
    


```python
#總和及排序

innum = 0
list1 = []
while(innum != -1):
    innum = int(input("請輸入電費 (-1：結束)："))
    list1.append(innum)
list1.pop()

print("共輸入 %d 個數" % len(list1))
print("最多電費為：%d" % max(list1))
print("最少電費為：%d" % min(list1))
print("電費總和為：%d" % sum(list1))
print("電費由大到小排序為：{}".format(sorted(list1, reverse=True)))
```

    請輸入電費 (-1：結束)： 200
    請輸入電費 (-1：結束)： 500
    請輸入電費 (-1：結束)： 123
    請輸入電費 (-1：結束)： 555
    請輸入電費 (-1：結束)： -1
    

    共輸入 4 個數
    最多電費為：555
    最少電費為：123
    電費總和為：1378
    電費由大到小排序為：[555, 500, 200, 123]
    


```python
#檢查網址格式
# startswith

web = input("請輸入網址：")
if web.startswith("http://") or web.startswith("https://"):
    print("輸入的網址格式正確！")
else:
    print("輸入的網址格式錯誤！")
```

    請輸入網址： https://changgunguniversity-my.sharepoint.com/personal/d000000225_cgu_edu_tw/_layouts/15/onedrive.aspx?ga=1&id=%2Fpersonal%2Fd000000225%5Fcgu%5Fedu%5Ftw%2FDocuments%2F%5F00%E3%80%90%E8%AA%B2%E7%A8%8B%E8%B3%87%E6%BA%90%E3%80%91%2F00%5FPython%E9%9B%B6%E5%9F%BA%E7%A4%8E%E5%85%A5%E9%96%80%E7%8F%AD%2F%E5%90%84%E7%AB%A0%E7%AF%84%E4%BE%8B%5Fpy%2Fch07%2Fstartswith%2Epy&parent=%2Fpersonal%2Fd000000225%5Fcgu%5Fedu%5Ftw%2FDocuments%2F%5F00%E3%80%90%E8%AA%B2%E7%A8%8B%E8%B3%87%E6%BA%90%E3%80%91%2F00%5FPython%E9%9B%B6%E5%9F%BA%E7%A4%8E%E5%85%A5%E9%96%80%E7%8F%AD%2F%E5%90%84%E7%AB%A0%E7%AF%84%E4%BE%8B%5Fpy%2Fch07
    

    輸入的網址格式正確！
    


```python
#以字串排版函式列印成績單
# just

listname = ["Alice", "Amy", "Alex"]
listchinese = [100, 74, 82]
listmath = [87, 88, 65]
listenglish = [79, 100, 8]

print("姓名     座號  國文  數學  英文")
for i in range(0,3):
    print(listname[i].ljust(5), str(i+1).rjust(3), str(listchinese[i]).rjust(5), str(listmath[i]).rjust(5), str(listenglish[i]).rjust(5))
```

    姓名     座號  國文  數學  英文
    Alice   1   100    87    79
    Amy     2    74    88   100
    Alex    3    82    65     8
    


```python
#轉換日期格式
# replace

date1 = input("YYYY-MM-DD = ")
date1 = "西元 " + date1
date1 = date1.replace("-", " 年 ", 1)
date1 = date1.replace("-", " 月 ", 1)
date1 += " 日"

print(date1)
```

    YYYY-MM-DD =  2023-11-16
    

    西元 2023 年 11 月 16 日
    

### 綜合演練

#### 實作3
以十二小時(上午、下午)顯示現在時刻。


```python
import time as t

time1 = t.localtime()
show = "現在時刻："
if time1.tm_hour < 12: 
    show += "上午 "
    hour = time1.tm_hour
else:
    show += "下午 "
    hour = time1.tm_hour - 12
show += str(hour) + " 點 " + str(time1.tm_min) + " 分 "
show += str(time1.tm_sec) + " 秒"

print(show)
```

    現在時刻：上午 6 點 43 分 58 秒
    

#### 實作4:
小華媽媽上菜市場買菜，找錢時她希望在1元、5元、10元、50元硬幣中找回最少的硬幣。小華就利用自訂函式幫媽媽寫了一個程式。


```python
def change(n,coin): # 換硬幣
    m = n // coin   # 硬幣數
    return m    

money=[50,10,5,1]
n=int(input("請輸入換幣金額："))
while (n>0):
    for i in range(len(money)):
        coin = money[i]
        if (n >= coin):
            m = change(n,coin) # 換硬幣
            print("{}元 * {}個" .format(coin,m))
            n= n % coin
```

    請輸入換幣金額： 100
    

    50元 * 2個
    

## 【self practice】


```python
# str.ljust(width[, fillchar])
# 將字符串向左對齊，使其寬度達到指定的 width。可選參數 fillchar 用於填充不足的空格，預設為空格

text = "Hello"
result = text.ljust(10, '*')

print(result)
```

    Hello*****
    


```python
# str.rjust(width[, fillchar])
# 將字符串向右對齊，使其寬度達到指定的 width。可選參數 fillchar 用於填充不足的空格，預設為空格

text = "Hello"
result = text.rjust(10, '*')

print(result)
```

    *****Hello
    


```python
# str.center(width[, fillchar])
# 將字符串居中，使其寬度達到指定的 width。可選參數 fillchar 用於填充不足的空格，預設為空格

text = "Hello"
result = text.center(10, '*')

print(result)
```

    **Hello***
    
