幾何之美
Python與曼陀羅繪圖

自介
黃語涵
-
景資32th程教
-
容易被⚡
-
催眠大師
-
徒步上學
-
盤子-不是柄圖不行,是我審美和錢包沒跟上
大家可能早上玩得很開心
不想上課
就認真聽一下吧!
但

課程目標
- 認識python基礎語法
- 延伸:用turtle模組畫曼陀羅
Python簡介
Python


應用範圍
- 設計動畫遊戲
- 支援圖形使用者介面開發
- 資料庫開發&設計動態網頁
- 科學計算&大數據分析
- 人工智慧&機器學習重要模組

適合練題目的網站
線上程式碼提交與自動評測
可以直接在網頁上編寫或上傳程式碼,系統會自動編譯並測試程式輸出是否正確。
它無法直接判斷你的程式碼邏輯是否正確,只是透過多組測試資料來檢查輸出結果是否符合預期。

先註冊一個帳號
Text

用這個註冊最快
送出程式碼的不同評分結果

AC (Accept): 即表示通過

NA (Not Accept): 在多測資點的題目中若未通過所有測資點

(Wrong Answer): 表示答案錯誤,並在訊息中指出錯誤行數及正確答案

只要稍微有印象就好,
忘記可以回首頁看
題目卡關怎麼辦
遇到題目卡關,有些人可能會想
欸?真假?我不應該是天才嗎?
為甚麼 為甚麼 題目不會寫!

臙脂(蛋包飯咖哩飯)
題目卡關怎麼辦

點它或往下滑(在題目的最下面)
永遠不會放棄你(Never gonna give you up)
永遠不會讓你失望(Never gonna let you down)
永遠不會拋棄你(Never gonna run around and desert you)
這些由好心人寫的解題思路或提示:

設定環境

下載
IDLE
-
字形請選等寬字體 (Consolas, Courier, Source Code Pro, Monospace…)
- 字體大小請調整成16以上
-
顏色請調成深色模式(highlight -> "IDLE Classic"改成"IDLE Dark")
上方工具列->Option -> Configure IDLE





點它⮕

選第一個⮕
開啟新檔案
互動式直譯器
- 即時執行
- 適合測試短程式、嘗試語法
文字編輯器
- 一次執行整份程式
- 可以寫比較完整的程式,有註解、有函式
- 適合正式寫作業或專案
如何執行程式


點它
點它,或按F5快捷鍵

變數
「設定變數」就是給一個名字,儲存資料或數值,讓你之後可以用這個名字來操作。也就是你給資料取的「暱稱」。
變數
變數名稱 = 資料
基本觀念
- 不能用特殊字
- 開頭不能是數字
- 不能有空格
- 只能用英文字母、數字、底線
_ - 建議使用英文小寫,清楚好懂
不能設為變數的特殊字

今日嘉賓

前
方
的
區
域
吧
!
以
後
再
來
探
索

輸入&輸出
print( )
輸出
print("Hello, world!") # 輸出字串
- 字串(英語:string),是由零個或多個字元組成的有限序列。
- 要用雙引號" " 或 單引號' ' 將字串包起來
print( ) # 輸出數字、變數

輸出
print("Hello, world!") ⇨輸出:Hello,world!
print(520) ⇨ 輸出:520
x=520
print(x) ⇨ 輸出:520
輸出數字、變數
輸出字串
同時輸出多項
不同項在括弧內用逗號隔開
-
字串+字串
print("Hello","World") ⇨Hello World
-
數字+數字
print(520,1314) ⇨520 1314
-
變數+變數
x=520
y=1314
print(x,y) ⇨520 1314
※預設分隔字元是空格
題目練習d483.
程式碼:
print("hello, world")
如何讓中間的空格消失
sep
x=520
y=1314
print(x,y,sep="") ⇨5201314
-
sep= 控制中間的間隔符號。
-
print("A", "B", "C", sep=",") 中間就會被","隔開。
-
如果要控制結尾(不是中間),要用 end=
x=520
y=1314
print(x,y,sep="❤") ⇨520❤1314
輸入
input( )
int(input ( )) #輸入整數
float(input( )) #輸入浮點數
input( ) #輸入
前面要用變數來儲存輸入內容str(input( )) #輸入文字
| int | 整數(沒有小數點) |
-5, 0, 42
|
||
| float | 浮點數(有小數點) |
3.14, -0.5, 2.0
|
||
| string | 字串(文字資料) |
"Hello","123"
|

- int 整數
- float 浮點數
- str 字串
程式碼:
name=input()
print("hello,",name)y=int(input())
print(y-1911) 程式碼:
____________
print(__-1911) 怎麼實現一行輸入
x,y=map(int,input().split())預設用空格隔開輸入
split( ).........控制要用甚麼隔開輸入
a,b=map(int,input().split())
print(a+b)程式碼:
運算子
邏輯同c++
算術運算子
+ |
加法 | 3 + 2 |
5 |
- |
減法 | 5 - 3 |
2 |
* |
乘法 | 4 * 2 |
8 |
/ |
除法(浮點) | 7 / 2 |
3.5 |
// |
整除(取整) | 7 // 2 |
3 |
% |
取餘數 | 7 % 2 |
1 |
** |
次方(冪次) | 2 ** 3 |
8 |

X
比較運算子
== |
是否相等 | 5 == 5 |
|
!= |
是否不相等 | 5 != 3 |
|
> |
是否大於 | 7 > 5 |
|
< |
是否小於 | 3 < 5 |
|
>= |
是否大於等於 | 5 >= 5 |
|
<= |
是否小於等於 | 3 <= 5 |
簡化
- x=x+1 ➭ x+=1
- x=x-1 ➭ x-=1
- x=x*1 ➭ x*=1
- x=x/1 ➭ x/=1
- x=x%1 ➭ x%=1

程式碼:
h=int(input())
print((h+24-15)%24)h=int(input())
print((h+24-15)___)程式碼:
m=int(input())
print((85-m)%60)if/else判斷式
邏輯同c++
if
if 條件:
#要執行的程式碼

elif
elif 條件:
#要執行的程式碼
如果不符合if的條件但符合這裡的條件,就會執行
else
else:
#要執行的程式碼

其他(不符合上面所有if和elif的條件)


你可以有很多選擇
you="盤子" #假設都符合條件
if True: //流麻
print("買!")
if True: //徽章
print("買!")
if True //拍立得
print("買!")
if True //金屬胸章
print("買!")結果:

if
只能選一個
if you: #假設都符合條件
print("you")
elif 薄巧:
print("薄巧")結果:you

比起薄巧我更喜歡你
elif
if
elif
VS.
x=5
y=10
if y==10:
print("a")
if x==5:
print("b")x=5
y=10
if y==10:
print("a")
elif x==5:
print("b")a
b
a
i=int(input())
if i%2==0:
print("Even")
else:
print("Odd")程式碼:
and/or
and
Vs.
or
x=5
y=10
if x==5 and y!=10:
print("a")x=5
y=10
if x==5 or y!=10:
print("a")a

a,b,c=map(int,input().split())
if a>b and a>c:
print(a)
elif b>a and b>c:
print(b)
else:
print(c)程式碼:

字典
dictionary

快速理解字典的概念
- 建立字典
- 取值(用key拿資料)
- 修改 value
- 新增一筆 key-value
- 刪除某筆資料
- 用
in檢查某個 key 有沒有存在
- Key(鍵):就像字的「詞條」
- Value(值):就是詞條的「解釋」
字典名 = {
key:value,
key:value
}建立字典
person={
"name":"黃語涵",
"age":"16",
"class":"Ren"
}取得值(用key查字典)
print(person["age"]) #輸出:16
修改字典
person["age"]=17 #原有的key會修改
person["school"]="JingMei" #沒有的會新增
print(person)
刪除某筆資料
del person["school"] # 刪除 key=school
person.pop("age") # 也能刪除 key=age
檢查key是否存在
if "name" in person:
print("有 name 這個key")
得所有 key 或 value
print(person.keys())
print(person.values()) loop
迴圈
邏輯同c++
for迴圈
用途
- 執行相同的程式碼多次
- 處理大量資料(如總和、最大值、找資料)
- 根據條件持續執行,直到滿足條件才停止
- 輸入大量資料,使用迴圈接收一堆數字,而不是寫很多次 input


for i in range(起始值,終點,變化):
#要重複執行的程式碼3
4
要將想用for迴圈重複執行的程式碼縮排:空4個空格或用Tab
for i in range(4):
print(i)0
1
2
3
for i in range(0,5,2):
print(i)0
2
4
for i in range(4,0,-1):
print(i)4
3
2
1
範例
n=int(input())
for i in range(n):
print("I don't say swear words!")________________
for i in range(__):
print("I don't say swear words!")程式碼:
迴圈中的迴圈

就是在一個迴圈裡面,再寫一個迴圈。
外層迴圈:負責控制「大方向」的次數,
內層迴圈:負責在每一次外層迴圈執行時,做完整的重複動作。
範例
for i in range(2):
for j in range(3):
print(i,"+",j,"=",i+j)0 + 0 = 0
0 + 1 = 1
0 + 2 = 2
1 + 0 = 1
1 + 1 = 2
1 + 2 = 3
輸出:

題目練習
x=int(input())
y=int(input())
for i in range(y):
for k in range(x):
print("*",end="")
print("")程式碼:
while迴圈
while 條件:
#要執行的程式碼-
條件:每次迴圈執行前,都會檢查這個條件。如果符合,則繼續執行迴圈;如果不符合,則跳出迴圈。

流程圖
while 條件:
#要執行的程式碼1
2
n=1
while n!=0:
n=int(input())
if n%2==0:
print("Even")
else:
print("Odd")
break/continue


Break
Continue
for i in range(5):
if i==3:
breakfor i in range(5):
if i==3:
continue

while True:
n=int(input())
if n==0:
break
if n%4==0 and (n%100!=0 or n%400==0):
print("E leap year")
else:
print("a normal year")程式碼:

對比
自訂義函式
funtion
函式
-
有名字 – 方便呼叫(像叫某人名字一樣)。
-
有輸入(參數) – 你可以把資料交給函式處理。
-
有回傳值 – 處理完的結果可以交回給主程式(也可以不回傳)。
-
能重複使用 – 寫一次,可以呼叫多次。
可重複使用的程式區塊,它能執行特定的任務,並且可以把結果回傳給呼叫它的地方。
函式
程式碼可以重複使用
- 不用一段程式碼一直「複製貼上」。
讓程式更簡潔、可讀性更高
-
把複雜問題拆成多個小任務,每個小任務用一個函式處理。
-
看程式時,不需要深入看每行細節,只要看「這個函式叫什麼名字」就知道功能。
方便維護和修改
-
如果程式需要修改,只要改 函式內部的程式碼。
提高程式的結構化與模組化
-
函式讓你的程式像拼積木一樣,一塊一塊組成,容易管理。

# def [函式名稱](參數列表):
# 程式碼
# return 結果#沒有回傳值就不用寫結構
沒有回傳值、沒有參數
╭────────────╮
│ sayHello │ ← 名稱
├────────────┤
│ ( ) │ ← 沒有參數
├────────────┤
│ print(...) │ ← 只做事,不回傳
╰────────────╯
def say_hello():
print("Hello!")
say_hello() #輸出:Hello!不用運算,不需要資料進來,也不用資料出去
有參數、沒有回傳值
join(name)
↓
[ 參數 name = "IZCC暑訓" ]
↓
(印出 IZCC暑訓,一定要來!)
↓
(沒有回傳值)
def join(name):
print(name,",一定要來喔!",sep="")
name="IZCC暑訓"
join(name) # 輸出:IZCC暑訓,一定要來喔!只需要執行某件事,而不需要結果
有參數、有回傳值
add(3,5)
│
▼
[接收參數 a=3,b=5]
│
▼
(計算 3+5 = 8)
│
▼
回傳 8def add(a,b):
return a+b # 回傳相加結果
result=add(3,5) # result = 8
print("3 + 5 =",result)輸入一些資料並得到一個結果
global
n=3
def add():
global n #告訴程式用外部的n
n+=1 #修改外面的n
add()
print(n)函式內的變數與外界共用


延伸:turtle模組
畫筆屬性
pen.speed(0) # 繪畫速度,0~1: 0最快,1最慢
pen.size() # 線條粗細
pen.forward(x) # 畫出長x的線條
pen.right(90) # 右轉90度
pen.left(120) # 左轉120度
pen.penup() # 把筆拿起來
pen.goto(x,-10) # 把筆移到畫布上指定位置
pen.pendown() # 把筆放下先將下一頁codes複製到python
import turtle #匯入繪圖模組
turtle.setup(600,600) #圖片大小
turtle.bgcolor("#000000") #圖片底色
pen=turtle.Turtle()
pen.pensize(2) #畫筆粗細
pen.color("#4DFFFF") #畫筆顏色
pen.speed(1) #畫筆速度,0最快,1最慢
括號內的參數都可以修改,例如圖片底色、筆的顏色與粗細等

rgb色碼表
選喜歡的顏色,
將色碼貼到程式裡面即可,
記得要加引號“” 和井號 #
(不是rpg!)
畫一個□
先做到第四關,然後用以上邏輯試試看怎麼畫出□
step.1
step.2
pen.forward(200) #向右畫出一條直線pen.right(90) #畫筆向右轉90度step.2
step.3
for i in range(4): #用for迴圈將它們包起來重複執行四次import turtle #匯入繪圖模組
turtle.setup(600,600) #圖片大小
turtle.bgcolor("#000000") #圖片底色
pen=turtle.Turtle()
pen.pensize(2) #畫筆粗細
pen.color("#4DFFFF") #畫筆顏色
pen.speed(1) #畫筆速度,0最快,1最慢
def draw():
for i in range(4):
pen.forward(200) #向右畫出一條直線
pen.right(90)
draw()寫一個能畫正方形的funtion
沒有回傳值、沒有參數

import turtle #匯入繪圖模組
turtle.setup(600,600) #圖片大小
turtle.bgcolor("#000000") #圖片底色
pen=turtle.Turtle()
pen.pensize(2) #畫筆粗細
pen.color("#4DFFFF") #畫筆顏色
pen.speed(1) #畫筆速度,0最快,1最慢
def draw():
for i in range(4):
pen.forward(200) #向右畫出一條直線
pen.right(90)
draw()畫一個⬠
step.1
step.2
pen.forward(200) #向右畫出一條直線pen.left(360/5) step.2
step.3
for i in range(5): #用for迴圈將它們包起來重複執行五次。
寫一個能畫五邊形的funtion
沒有回傳值、沒有參數
pen.left(360/7) 。
pen.left(360/6) 。
pen.left(360/8) 。
六邊形
七邊形
八邊形
以
此
類
推
優化-funtion
讓funtion可以依據參數畫出對應的幾何
def draw(x):
for i in range(x):
pen.forward(200) #向右畫出一條直線
pen.right(360/x)
x=__
draw(x)飯粒

曼陀羅1

讓幾何轉起來
step1:先畫出一個多邊形
體驗:做到第6關
參考遊戲中的邏輯
step2:
for j in range(10):
for i in range(4):
pen.forward(200) #向右畫出一條直線
pen.left(360/4)
pen.left(36) #想畫越密度數就設越小

疊加



import turtle #匯入繪圖模組
turtle.setup(750,750) #圖片大小
turtle.bgcolor("#000000") #圖片底色
pen=turtle.Turtle()
pen.pensize(2) #畫筆粗細
pen.color("#4DFFFF") #畫筆顏色
pen.speed(0) #畫筆速度,0最快,1最慢
x=3 #從x邊形開始
for k in range(要畫幾個多邊形):
for i in range(x):
pen.forward(100)
pen.left(_____)
x=x+1 #看要遞增多少角讓它們轉起來

x=3 #從x邊形開始
for k in range(4):
for j in range(10):
for i in range(x):
pen.forward(100)
pen.left(360/x)
pen.left(36)
x=x+1 #看要遞增多少角換顏色


import turtle #匯入繪圖模組
turtle.colormode(255)
turtle.setup(750,750) #圖片大小
turtle.bgcolor("#000000") #圖片底色
pen=turtle.Turtle()
pen.pensize(2) #畫筆粗細
pen.speed(0) #畫筆速度,0最快,1最慢
x=3
a=255
b=0
for k in range(3):
for j in range(40):
for i in range(x):
a=(a-5)%225 #減少紅色的量
b=(b+5)%225 #增加藍色的量
pen.color(a,155,b) #紅,綠,藍
pen.forward(150)
pen.left(360/x)
pen.left(9)
x+=2

import turtle #匯入繪圖模組
turtle.colormode(255)
turtle.setup(750,750) #圖片大小
turtle.bgcolor("#000000") #圖片底色
pen=turtle.Turtle()
pen.pensize(2) #畫筆粗細
pen.speed(0) #畫筆速度,0最快,1最慢
x=6
r=225
g=0
for k in range(3):
for j in range(40):
for i in range(x):
pen.forward(100)
pen.left(360/x)
pen.color(r,g,155) #紅,綠,藍
r=(r-10)%225 #減少紅色的量
g=(g+10)%225 #增加綠色的量
pen.left(9)
x+=1曼陀羅2



死別(手風琴版)

for i in range(很多次):
pen.forward(i)
pen.right(i*45) #調整角度會有奇妙的發現import turtle #匯入繪圖模組
def draw():
for i in range(150):
pen.forward(i)
pen.right(i*45)
def move():
pen.penup() # 把筆拿起來
pen.goto(0,0) #回到原點
pen.pendown() # 把筆放下
turtle.setup(750,750) #圖片大小
turtle.bgcolor("#000000") #圖片底色
pen=turtle.Turtle()
pen.pensize(1) #畫筆粗細
pen.speed(0) #畫筆速度,0最快,1最慢
for j in range(2):
pen.color("#4DFFFF")
draw() #畫風車頁片
pen.color("#FFFFFF")
move()#移動筆的位子
draw()
move()
曼陀羅3



=
+


for i in range(100): #要迴圈很多次
pen.forward(i*4)
pen.right(96) #調整角度會有奇妙的發現(度數要>90)
pen.penup() #避免筆在移動時留下筆跡
pen.goto(0,0) #定位回原點
pen.color("#FFFFFF")
pen.pendown()
pen.pensize(1)
for i in range(150):
pen.forward(i*3)
pen.left(110) #調整角度會有奇妙的發現小延伸

可以透過分段寫、更改一些細節ex:線條長度、顏色等來組合出不同的效果
剩下的時間自由練習
Python
By gg dd
Python
- 214