#從Scratch到Python——python turtle
#### 一種比pygame更加簡潔的實現

>現在很多學校都開設了Scratch課程,學生可以利用Scratch創作豐富的作品,然而Scratch之后的圖形化編程語言學習什么內容,是一線老師和Scratch官方共同關注的問題。
轉載請注明出處:http://www.jianshu.com/p/99729c45c839
就目前來看可以選擇的有C語言、Logo、Python和SmallBasic。就我個人而言是傾向于Python的。因為C語言雖然經典,但是學了很久也不能做出可視的成型的作品,極大的降低了孩子們的積極性;Logo語言僅僅是一門玩具型的編程語言;Smallbasic和Logo語言的情況類似;而Python語言已經做為編程入門語言得到了廣泛的任何,相比于c語言,入門簡單,而且Python可以用很少的代碼完成復雜的工作,在以后的工作學習中都會用到,對于一般人來說C語言是屠龍之技,即便是在大學里的C語言通修課也是如此,而且目前部分大學的已經開始慢慢的把通識課的入門編程語言改成Python了。畢竟人生苦短我用Python呢。
但是Python作為一種文本編程語言,對于小學生來說還是有一定難度的,所以從Scratch到Python肯定需要一個過渡,我對于這個問題思考了很長時間,我覺得在學習了Scratch基礎上,結合Scratch來學習Python是合適的。
學習任何一種編程語言,首先要了解諸如變量、循環、分支判斷這些基本的程序結構,經過Scratch的學習,學生對于這些概念基本掌握,在學習Python的時候,用Scratch來描述程序,作為思維可視化的工具,有助于學生快速的掌握Python。
閑言少敘,下面我們就開始Python的學習,話說如果一開始就講Python的變量肯定會被吐槽,全部是文本,黑咕隆咚的窗口,沒什么意思啊,那么們就從窗口開始。
## 安裝Python
(從官網下載Python 3.6如果是xp下載3.5,然后看下基本的Python安裝和使用介紹,啟動IDLE)
## 啟動IDLE
安裝python之后,開始菜單,python,IDLE,就可以啟動了。
## 神奇的小烏龜
在正式學習Python之前我們先來體驗下用Python來繪制圖形,如果你看不懂也沒有關系,先照著教程把代碼查下來就是了,就像是聯系書法開始肯定有個臨摹的階段,我們先體驗,后面詳細講解為什么這么做
下面我們隆重的請我們的Python小烏龜入場。
首先在IDLE的代碼編輯器輸入以下代碼

然后單擊運行

### 解釋
我們來解釋下這段代碼
```
from turtle import *
```
是從Python的庫中導入turtle這個類,當導入的時候,其實小烏龜已經存在了,只是我們看不到而已。當你通過
```
forward(90)
```
命令讓小烏龜前進90個單位的時候憊懶的小烏龜才出現在舞臺上,forward的意思是前進,forward后面括號里的是參數,描述烏龜前進的距離,這是一個固定的寫法。

是不是覺得眼熟呢,在Scratch,是不是有點像Scratch里面讓小貓動起來呢?

在turtle里面,默認畫筆是落下的,所以小箭頭移動的時候就會畫圖,我們記得scratch里面有一個抬筆積木,在turtle也有,不過是
```
penup()
```

```
from turtle import *
# 神龜前進100單位
forward(90)
penup()
# 抬筆
forward(90)
```
首先我通過```penup()```命令抬筆,然后利用```goto(10,90)```命令讓小烏龜移動到(10,90)
其實這個時候,調用前面的向前移動forward命令也不會留下痕跡的

## 繪制正方形
下面我們來繪制一個正方形,首先我們用scratch來實現繪制正方形這個功能,我們用最簡單的順序命令來實現
### Scratch程序繪制正方形

可以看到
+首先拖動綠旗模塊到舞臺
+然后清空舞臺
+落筆
+讓小企鵝前進90步,然后右轉90°,等1s鐘
+重復以上步驟四次
+抬筆,準備下一次繪圖
這是一個典型的繪制正方形的程序,采用了順序結構來編制程序,便于理解。
接下來我們用python中的turtle庫實現這個程序
### Python版本的正方形繪制程序

```
from turtle import *
# 神龜前進100單位
forward(90)
right(90)
forward(90)
right(90)
forward(90)
right(90)
forward(90)
right(90)
```
看,雖然一個是圖形編程,一個是文本編程,但是都成功的繪制出了正方形。下面我繼續完善,我們知道在Scratch中是可以改變畫筆屬性的,比如畫筆粗細,畫筆的顏色等等,在python也是可以的,看下面的表格
|-|-|-|
|-|-|-|
|Scratch代碼塊|Python命令|作用|
||```pencolor()```|設定畫筆顏色,用顏色選擇器選擇顏色|
||```pencolor()```|Scratch通過數值,python通過顏色字符串設定顏色|
||```pensize()```|設定畫筆粗細|
比如我們要畫一個邊框粗為4,顏色為紅色的正方形
#### Scratch版本

#### Python版本的畫正方形

代碼如下
```
from turtle import *
# 神龜前進100單位
pensize(4)
pencolor("red")
forward(90)
right(90)
forward(90)
right(90)
forward(90)
right(90)
forward(90)
right(90)
```
可以看到,我們用python里面的命令完成了與scratch相同的功能,是不是相當有趣呢?
## 變量
前面我們畫了一個邊長為90的正方形,如果我們想讓正方形的邊長是100怎么辦呢?我們先來看最原始的方法,那就是把scratch或者Python中代表邊長的數字90分別改成100:

你會發現這次不是正方形啊,哦,原來是我把最后一個右轉90°,也改成100,導致右轉了100°,你看,這樣一個個的修改不僅麻煩,而且容易出錯,怎么辦呢,我們用一個變量代表邊長。
***變量是一個容器,里面存放著代表邊長的數字。***
#### 在Scratch中新建變量
經過前面多學習,大家已經掌握了在scratch中新建變量,下面我們新建一個代表邊長的變量side,然后把程序中代表邊長的100改成變量side

然后我們改變side值,就可以輕松的繪制不同邊長的正方形了
#### 在Python中新建變量
python是一種解釋語言,無需聲明就可以新建變量,新建變量只需要用下面的語法
```
side = 100
```
這樣就新建了一個side變量,代表100,這里的```=```等號的含義是,把右側100的值放到變量side中,side代表100.
我們看如何用python來實現用變量來代表數值繪制正方形
```
from turtle import *
# 神龜前進100單位
side = 100
pensize(4)
pencolor("red")
forward(side)
right(90)
forward(side)
right(90)
forward(side)
right(90)
forward(side)
right(90)
```

>那么,親愛的朋友,你能夠新建一個angle變量,代替角度嗎?
## 重復循環
在日常生活中,我們經常會遇到一個枯燥而重復的事情,為了從這些勞動擺脫出來,人們發明機器以及機器人,代替人類完成這些枯燥重復的事情。與人類不同的是,計算機特別擅長做簡單重復的事情,效率和準確率比我們人類要高很多。通過合理的使用重復循環,我們可以大大提高程序的效率。
```
from turtle import *
forward(90)
right(90)
forward(90)
right(90)
forward(90)
right(90)
forward(90)
right(90)
```
>仔細觀察以上代表,是不是,是不是感覺有很多地方是重復的呢?一般在計算機中超過三次重復就可以考慮使用循環來簡化代碼
在scratch中,控制積木分類中有重復積木:

下面我們利用scratch中的循環來簡化代碼

仔細觀察以上代碼,想一想在重復4次內部應該放入那些積木塊呢?這樣代碼是不是簡單了很多?
#### Python循環
python中的循環,需要用到```for...each...```語句,在這里會涉及到python一個非常有意思的地方,縮進語法
```
from turtle import *
for each in range(4):
forward(90)
right(90)
```
執行以上代碼,會發現,出現了一個正方形,需要注意的是,```forward(90)```以及```right(90)```語句比for縮進了4個空格,這也是python的特點之一,縮進語法,這是for的固定寫法,大家要知道,而且一定不要漏掉冒號哦。
## 更多類似
有人說,不是python turtle小烏龜嗎,為什么只有箭頭呢?scratch舞臺上有各種各樣的角色,python turtle只有個箭頭是不是太寒酸了呢?turtle也可以多種多樣哦!
需要改變箭頭的形狀要用到```shape()```命令,下面我們來試一下
```
from turtle import *
shape('turtle')
for each in range(4):
forward(90)
right(90)
```

有沒有覺得小烏龜太小了?我們來改變小烏龜的大小
```
from turtle import *
shape('turtle')
shapesize(5,5,5)
for each in range(4):
forward(90)
right(90)
```
運行以上代碼,是不是發現小烏龜變大了呢?

當然python turtle中小烏龜的形象不僅可以是小烏龜,箭頭,還是是圓和正方形。
>小結:python urtle某種程度上跟logo小烏龜是比較類似的,肯定有人會疑問為什么不直接學習logo呢?因為logo基本上已經被淘汰了,我們最主要的目的還是學習python,python turtle以及結合scratch只是防止單純的學習python過于枯燥的弱點,當然真正的掌握了python以后就不會有這樣的感覺,基本上scratch大部分功能都可以用python turtle來實現,這樣就可以順利的幫助小孩子從scratch過渡到python。
## 先來看最經典的例子
在scratch教程中,一般開始都是先做一個小貓來回跑動的例子,來吸引小盆友,python turtle做這樣的例子其實很簡單的,我們先來看用scratch怎么做:

下面我們用python來實現,現在看不懂不要緊,看完后面的就能看懂了。
```
from turtle import *
shapesize(4,4,4)
penup()
x = 0
v = 5
while 1:
goto(x, 0)
x += v
if x < -200:
v = -v # 當箭頭到了左側邊界,讓x增加
if x > 200:
v = -v # 黨建頭到了右側邊界,讓x減少
```
以上代碼實現了箭頭來回走動,其實原理很簡單的```v = 5```跟

的作用類似,是用來設定角色移動的速度,而與

對應的則是以下代碼:
```
if x < -200:
v = -v
if x > 200:
v = -v
```
我來解釋下這段程序,首先導入必要的庫,然后利用```shapesize()```命令設置箭頭的大小,然后```while```循環的作用于scratch的重復類似,不停的執行以下代碼,首先讓箭頭移動到(0, 0)坐標,然后把x坐標增加步數v,然后判斷改變后的x坐標是否大于200,大于200則意味著箭頭超過了右側的邊界,那么x就應該向相反方向移動,這也就是scratch中的

含義,本來向右移動是讓x坐標不斷的增加步數v,如果要向左移動,就要減去步數,所以當箭頭的橫坐標大于x的時候就讓x減去步數;同樣的當x的坐標比-200小時,意味著箭頭到了左側邊界,那么不再讓x坐標減去步數v,而是讓x坐標增加。
## 關于事件
在scratch中事件是很常用的功能,比如當鼠標被單擊的時候,角色說話:

其實小烏龜也是可以的,不過呢這里要用到函數的功能,不知道各位看官在Scratch里有沒有學習函數的功能呢,這里要介紹python里面函數的語法
```
def function_name():
pass
```
可以看到,首先要有def關鍵字,然后空一格,然后是函數名,括號以及冒號,冒號是必不可少的內容!
```
from turtle import *
shape('turtle')
def sayhello(x, y):
write('2007-2017高考十年')
onclick(sayhello)
```

運行上述代碼,會發現當你單擊小烏龜的時候,小烏龜會說出我們指定的話語,'2007-2017高考十年',有沒有很唏噓。
這里需要注意但是函數sayhello有兩個參數x,y分別代表小烏龜當前的橫縱坐標。同時onclick函數的參數,是一個函數名,這里面涉及到了回調,當然我們知道怎么一回事就可以了,當你希望被單擊的時候執行那個函數對應的功能呢,你就在onclick的參數里面寫上這個函數就可以了。
## 關于動作積木塊的類比
|-|-|-|
|-|-|-|
|Scratch代碼塊|Python命令|作用|
||```setx()```|設定x坐標|
||```sety()```|設定y坐標|
||```xcor();ycor()```|獲取xy坐標|