## 寫在前面的一些廢話
如果不感興趣,可以調到下一小節.
### Flash與Actionscript3.0
我最初接觸編程是在大學,那時候有一門專業課是c語言;后來學習flash,接觸到了Actionscript腳本,經歷了從2.0到3.0的轉變,作為當時呼聲最高的富媒體實現工具,深入研究了很長一段時間,后來計算機二學歷的畢業論文就是用flash實現的高中數學函數繪制工具,只不過當時對于Github一無所知,如果是現在我可能先要在github上搜一下了.
最初flash 8的腳本是直接寫在時間軸上的,元件的腳本寫在元件腳本內部,你會發現很多flash的作品,腳本到處都是,相對有些混亂;后來到了as3,有了文檔類,感覺方便了好多;再后來經過深入的學習,對于flash有了更加深入理解,開始用flex builder 4.6開發,也用過一段時間的flash developer,意識到我們在flash軟件中新建元件的操作,不過是new一個有時間軸的sprite也就是movieclip對象,逐漸體會到,有的適合用代碼實現,有的適合在flash實現,雖然后來編程仍然是渣渣,對于基礎的東東還是很感興趣的.
工作以后,接觸到了Python和Scratch,感覺就像是在flash操作,而Python是直接做as3腳本,當然這種類比是不十分準確的,但是可以幫助大家有個基本的了解.所以我現在對于用Python來實現Scratch的一些程序很感興趣,實際上Scratch也是基于as3開發的,國內除了mblock的二次開發版本,個人的就張曉勝老師開發的桌面實驗箱配套的軟件定制的最深入.
### 來自學習口琴的啟示
現在教育部門也好,市場輿論也好,都是在推廣編程教育,無論初衷如何,學習編程對于領悟編程思維,培養邏輯思維是很有幫助的.引用知乎一個關于為少兒為何學習編程的答復說.
>編程其實還有一個名字叫做思考,不過被人遺忘很久了.
你看編程說到底,跟數學一樣,重要的是你思考,按照某種模式進行思考,最后解決問題,你看魔方看上也沒啥用啊,但是我們知道對思維很好的訓練作用.我們知道,編程是與計算機世界溝通的語言,而且掌握了編程能夠讓我們更加方便的利用編程語言提高日常工作效率.
我最開始學習口琴的時候,因為小時候學過橫笛--當然半途而廢了--所以認識1234567,但是口琴的技法很多的,而且開始的時候每個音的位置也不好記,所以我就找了一手我熟悉的曲子,只練習這一首曲子,練得很熟悉了,我現在拿起口琴還下意識的靠這首曲子來定位.這種方式用來入門是沒有問題的.
前端時間陪朋友去咨詢學習古箏,古箏老師說學習古箏其實有兩種人,一種是真的喜歡古箏,考完業余考專業,最后要從事專業的古箏表演的人,這樣的訓練非常重視基本功,要經過非常嚴格的訓練,而且最好要勤練不輟;當然也有一部分,比如退休了,不喜歡到籃球場跟少年打架,又不喜歡打太極,還不喜歡爬山,那么也許就會考慮學習古箏,對于他們來說,教會他們彈奏一兩首曲子,能夠自娛自樂就好了,比如談個小蘋果啊最炫民族風啊啥的.
學習編程,經常有一種感覺,吾生也有涯,而知無涯;___________,殆矣.所以我們學習編程的時候,首先要明確任務,一個個的來,逐步的解決每一個小問題,最后就能夠解決整個問題--這種思維方式就是編程思維的體現--不要試圖一蹴而就,而且這樣有利于發現程序編寫過程中存在的問題.
最開始的時候,我們寫的代碼能用就行,不要擔心實現是否優雅,只要好用,后面慢慢的去完善,畢竟真的是完成比完美更重要,如果你追求完美冥思苦想而不動手,問題永遠得不到真正的解決.
有的時候囫圇吞棗,不求甚解是可以接受的,因為我們想吃漢堡不一定自己去養雞啊,先學會怎么用,避開太多的細節,后面慢慢完善,講真,我們從小學到大學到畢業,知識不都是這么螺旋上升的么,都是在現有知識范圍內去解決問題,或者說盡可能的用現有知識去解決問題.
好了廢話說完言歸正傳.
## Python turtle的舞臺
之前有幾篇文章對于Python turtle有了一定的介紹,這里在多說兩句,Python turtle其實是早期logo語言的一種實現,不過做了更多的優化,而且Python語言相對于logo語言就是巨龍與嬰兒的差別,Python語言你了解的越深入,你的背景知識廣博,發揮的作用就越大,Python畢竟有強大的第三方庫,很多需要用到編程語言而又懶得學習c的,都會從Python入手來處理科學數據,畢竟Python處理科學計算的問題不要太方便,從ipython到jupyter的流行就可見一斑,jupyter notebook是國外相當流行的一個非常有生產力的工具,當然windows系統下anaconda可能會更適合.
Scratch的成功,良好的社區氛圍是很重要的,實際上Python的社區氛圍也很好,現在隨著人工智能,數據挖掘等的流行,python也越來越被重視.
突然覺得自己寫這些還是在自己的舒適區之內的,有待改進.
### Scratch舞臺
我們介紹Scratch的時候一定會先介紹舞臺和代碼編輯區,那么我們用Python turtle的時候也是如此,首先我們得啟動Python的編輯器,我這里用安裝Python自帶的IDLE.


### 使用小烏龜
要用Scratch編程我們要啟動軟件,經典的小貓默認就在舞臺上,而python turtle則需要用另外的方式
>其實我們是用鼠標點擊還是用代碼,都是給計算機下命令,所以你要知道那一部分代碼實現什么目的和功能,只要你理解了,代碼看起來也不是那么難.我的文章更多的是在梳理自己的思路,如果有不當之處,還請大家指正.
```Python
from turtle import *
```
這是之前的教程里我打開的方式,這個時候因為烏龜比較懶,只有當你讓他動一動才會出現到舞臺上
```
from turtle import *
forward(100)
```

跟Scratch一樣我們這里并沒有添加舞臺角色,舞臺默認有個角色小烏龜,當然形狀是箭頭

我們知道Scratch的角色是有名字的,那么我們能否給turtle中的小烏龜命名呢?
是可以的,我們單擊添加角色,選擇添加角色的過程用命令來代替就是
```
Turtle()
```
調用這個命令就可以生成一個turtle對象,也就是類似于Scratch中的角色,同時我要起名字比如
```
cat = Turtle()
```
這里的cat就是角色的名字.
```
from turtle import *
cat = Turtle()
panda = Turtle()
```
以上我們新建了兩個角色,

接下來,我們讓小貓向右移動,小狗向左移動
```
from turtle import *
cat = Turtle()
panda = Turtle()
cat.forward(100)
panda.forward(-100)
```
注意```cat.forward(100)```這個語法,含義是讓cat角色,向前移動100個單位,因為默認cat是朝向右側,這個跟Scratch是相同的,通過```.```來給cat下命令,前進后退,左轉,右轉等等.而括號里面的數字就是叫做*參數*,意思是前進多少,后退多少,左轉多少度,右轉多少度等等.跟
這里10的含義是一樣的.

## 改變舞臺角色的外觀
在Scratch里面有多種多樣角色,而turtle中的就要少很多,我們接下來就學習如何改變
### 自帶外觀
turtle是自帶外觀的,通過```shape()```函數來進行改變

```
shape(name=None)
設置或者返回烏龜形狀的名字.
可選參數:
name -- a string,字符串類型烏龜的名字.
名字在TurtleScreen's shape 字典中預設.
默認有以下形狀.
'arrow', 'turtle', 'circle', 'square', 'triangle', 'classic'.
而處理形狀的函數是register_shape.
Example:
>>> shape()
'arrow'
>>> shape("turtle")
>>> shape()
'turtle'
```
所以我們可以嘗試下不同的形狀
```Python
from turtle import *
cat = Turtle()
panda = Turtle()
cat.forward(100)
panda.forward(-100)
cat.shape('turtle')
panda.shape("circle")
```

是不是很好玩的?
### 處理舞臺相關的形狀
從上面```shape()```函數中我們知道要想跟形狀打交道,我們需要使用```register_shape()```函數,這個函數的功能是向舞臺添加默認形狀之外的形狀,就相當于我們在Scratch中新建角色,用繪制或者上傳圖形的辦法來做.

這個函數最簡單的用法呢,其實就是,用文件名做參數,比如我在桌面保存一個叫a.gif的文件
```
from turtle import *
cat = Turtle()
panda = Turtle()
cat.forward(100)
panda.forward(-100)
cat.shape('turtle')
panda.shape("circle")
register_shape("a.gif")
cat.shape("a.gif")
```

>我是從Scratch軟件截圖保存成gif放到桌面的,不過這樣呢有些問題,有個***細節可以優化,你能找出來是哪里嗎***?
### 調皮的小猴子
接下來我讓小猴子畫一個圓,在turtle里面默認是以猴子所在的位置為圓心畫圓的,所以用```circle()```函數繪圖只需要指定半徑就好了.
```
from turtle import *
cat = Turtle()
panda = Turtle()
cat.forward(100)
panda.forward(-100)
cat.shape('turtle')
panda.shape("circle")
# 注冊a.gif形狀
register_shape("a.gif")
# 把cat的形狀改為導入的a.gif
# 也就是小猴子
cat.shape("a.gif")
# 讓小猴以所在位置為半徑
# 畫一個直徑為100的圓
cat.circle(100)
```

在Scratch畫圓要麻煩的多,在Python 中畫圓只需要```circle(100)```就可以了,很強大有沒有啊
而且```circle()```方法還有個參數叫做steps,也就是步數,相當于分段畫圓,我們來示范:
```
from turtle import *
cat = Turtle()
panda = Turtle()
cat.forward(100)
panda.forward(-100)
cat.shape('turtle')
panda.shape("circle")
# 注冊a.gif形狀
register_shape("a.gif")
# 把cat的形狀改為導入的a.gif
# 也就是小猴子
cat.shape("a.gif")
# 讓小猴以所在位置為半徑
# 畫一個直徑為100的圓
cat.circle(100,steps = 10)
cat.circle(100,steps = 3)
cat.circle(100,steps = 4)
cat.circle(100,steps = 5)
cat.circle(100,steps = 6)
cat.circle(100,steps = 7)
```
