幾何之美

Python與曼陀羅繪圖

自介

黃語涵

  • 景資32th程教

  • 容易被⚡

  • 催眠大師

  • 徒步上學

  • 盤子-不是柄圖不行,是我審美和錢包沒跟上

大家可能早上玩得很開心

不想上課

就認真聽一下吧!

課程目標

  • 認識python基礎語法
  • 延伸:用turtle模組畫曼陀羅

Python簡介

Python

Python是強調程式碼的可讀性和簡潔的語法,尤其是使用空格縮排來劃分程式碼塊。

相比於C語言Java,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

預設分隔字元是空格

程式碼:

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

快速理解字典的概念

  1. 建立字典
  2. 取值(用key拿資料)
  3. 修改 value
  4. 新增一筆 key-value
  5.  刪除某筆資料
  6. 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:
        break
for 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)
      │
      ▼
  回傳 8
def 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