練習1 - 顯示跑馬燈文字。
import os
import time
def main():
content = '我要成功挑戰IT鐵人賽'
while True:
os.system('cls') # 清理屏幕上的輸出 (on windows)
#os.system('clear') 清理屏幕上的輸出 (on linux / os x)
print(content)
time.sleep(0.2) # 休眠200毫秒 (使得印出時間變慢)
content = content[1:] + content[0] # 將字串串連起來
if __name__ == '__main__':
main()
想更清楚知道效果,可以複製程式碼自己試試看。
練習2 - 產生指定長度的驗證碼,驗證碼由大小寫字母和數字構成。
import random
def generate_code (code_len = 4): # 可設定驗證碼長度,默認值為 4
all_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
last_pos = len(all_chars) - 1 # 計算全部字元的長度
code = ''
for i in range (code_len):
index = random.randint(0, last_pos) # 隨機產生 0 ~ 61 的數
code += all_chars[index] # 將隨機產生 0 ~ 61 的數代入字元裡
return code
def main() :
print(generate_code())
print(generate_code(5))
print(generate_code(7))
print(generate_code(2))
if __name__ == '__main__':
main()
練習3 - 輸出給定文件名的檔案類型文字。
def get_suffix (filename, has_dot=False):
# filename : 文件名 has_dot : 返回的檔案型態文字是否需要带點
pos = filename.rfind('.') # 找到文件名中'.'的位置
if 0 < pos < len(filename) - 1:
index = pos if has_dot else pos + 1
return filename[index:] # 文件名中點或點 + 1 後的所有文字
else:
return ''
def main() :
print(get_suffix('name.py',True))
print(get_suffix('picture.png',False))
if __name__ == '__main__':
main()
練習4 - 輸出傳入的列表中最大和第二大的元素的值。
def max2(x):
m1, m2 = (x[0], x[1]) if x[0] > x[1] else (x[1], x[0])
for index in range(2, len(x)):
if x[index] > m1: # 判斷最大的元素
m2 = m1
m1 = x[index]
elif x[index] > m2: # 判斷第二大的元素
m2 = x[index]
return m1, m2
def main() :
print(max2('qazwsxedc'))
print(max2('abcdefgh'))
if __name__ == '__main__':
main()
練習5 - 計算指定的年月日是這一年的第幾天。
def is_leap_year (year): # 判斷是否為閏年
return year % 4 == 0 and year % 100 != 0 or year % 400 == 0
def which_day (year, month, date):
# python 的 bool,也就是 True 和 False,實質上是 int,也就是 1 和 0
# True = 1,False = 0
# 函數返回 True 即為返回 list[1],反之 list[0]
days_of_month = [
[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
] [is_leap_year(year)]
total = 0
for index in range (month - 1):
total += days_of_month[index]
return total + date
def main():
print(which_day(1980, 11, 28))
print(which_day(1981, 12, 31))
print(which_day(2018, 1, 1))
print(which_day(2016, 3, 1))
if __name__ == '__main__':
main()
練習6 - 輸出巴斯卡三角形,是二項式係數的一種寫法。
def main():
num = int(input('Number of rows: '))
yh = [[]] * num # 在一個串列中建立指定列數的空串列
for row in range (len(yh)):
yh[row] = [None] * (row + 1) # 將串列中每個空串列所需要的元素設為 None
for col in range (len(yh[row])):
if col == 0 or col == row: # 判斷串列中每個串列的頭和尾並將其設為 1
yh[row][col] = 1
else: # 其餘的值為上一列同一行的值 + 上一列前一行的值
yh[row][col] = yh[row - 1][col] + yh[row - 1][col - 1]
print(yh[row][col], end = '\t')
print()
if __name__ == '__main__':
main()
練習1 - 雙色球選號。
from random import randrange, randint, sample
def display (balls): # 輸出雙色球選號
# enumerate 函數能同時列出串列中的元素的數據和位置
for index, ball in enumerate(balls):
if index == len(balls) - 1: # 在最後一個數據前印出 '|'
print('|', end =' ')
print('%02d' % ball, end =' ')
print()
def random_select(): # 隨機選擇一組號碼
red_balls = [x for x in range(1, 34)]
selected_balls = []
# sample 函數用意為從列表中選擇不重複 n 個元素
selected_balls = sample(red_balls, 6)
selected_balls.sort() # 將產生的 6 個隨機數排序
selected_balls.append(randint(1, 16)) # 加入隨機產生 1 ~ 16 的數
return selected_balls
def main():
n = int(input('輸入選擇下注的數量: '))
for _ in range(n):
display(random_select())
if __name__ == '__main__':
main()
練習2 - 約瑟夫環問題。
《幸運的基督徒》
有 15 個基督徒和 15 個非基督徒在海上遇險,為了能讓一部分人活下來不得不將其中 15 個人扔到海裡面去,有個人想了個辦法就是大家圍成一個圈,由某個人開始從 1 報數,報到 9 的人就扔到海裡面,他後面的人接著從 1 開始報數,報到 9 的人繼續扔到海裡面,直到扔掉 15 個人。
由於上帝的保佑,15 個基督徒都倖免於難,問這些人最開始是怎麼站的,哪些位置是基督徒哪些位置是非基督徒。
def main():
persons = [True] * 30
counter, index, number = 0, 0, 0
while counter < 15:
if persons[index]:
number += 1
if number == 9:
persons[index] = False # 將每一數的第 9 個人數為 False
counter += 1
number = 0
index += 1
index %= 30 # 固定每 30 一數,當 index = 30時,變成 index = 0
for person in persons:
print('基' if person else '非', end =' ')
if __name__ == '__main__':
main()
練習3 - 井字遊戲。
import os,random
def print_board(board): # 輸出井字的樣子
print(board['1'] + ' | ' + board['2'] + ' | ' + board['3'])
print('--+---+--')
print(board['4'] + ' | ' + board['5'] + ' | ' + board['6'])
print('--+---+--')
print(board['7'] + ' | ' + board['8'] + ' | ' + board['9'])
def main():
init_board = {
'1': ' ', '2': ' ', '3': ' ',
'4': ' ', '5': ' ', '6': ' ',
'7': ' ', '8': ' ', '9': ' ' }
begin = True
while begin:
curr_board = init_board.copy() # 複製初始的空字典
begin = False
turn = random.choice(['x','o']) # 隨機讓兩者開始
counter = 0
print_board(curr_board)
while counter < 9:
move = input('輪到 %s ,請輸入位置: ' % turn)
if curr_board[move] == ' ': # 判斷位置是否為' ',空則記錄現在的 turn
counter += 1
curr_board[move] = turn
if turn == 'x':
turn = 'o'
else:
turn = 'x'
print_board(curr_board)
choice = input('再玩一局 ? (yes | no) ')
begin = choice == 'yes'
if __name__ == '__main__':
main()
!