## 写在前面的一些废话

如果不感兴趣,可以调到下一小节.

### 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.
![上图一个是Python的交互式命令行,一个是文本编辑器,写代码比较多的时候,用下面的比较好](http://upload-images.jianshu.io/upload_images/1108512-1f1c466decc9fdec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![IDLE自带了Python turtle的demo,大家可以打开看一看有很多好玩的东西](http://upload-images.jianshu.io/upload_images/1108512-b8810da7252d36b6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### 使用小乌龟
要用Scratch编程我们要启动软件,经典的小猫默认就在舞台上,而python turtle则需要用另外的方式
>其实我们是用鼠标点击还是用代码,都是给计算机下命令,所以你要知道那一部分代码实现什么目的和功能,只要你理解了,代码看起来也不是那么难.我的文章更多的是在梳理自己的思路,如果有不当之处,还请大家指正.
```Python
from turtle import *
```
这是之前的教程里我打开的方式,这个时候因为乌龟比较懒,只有当你让他动一动才会出现到舞台上
```
from turtle import *
forward(100)
```
![进击的小乌龟](http://upload-images.jianshu.io/upload_images/1108512-23a507850e921891.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
跟Scratch一样我们这里并没有添加舞台角色,舞台默认有个角色小乌龟,当然形状是箭头
![命名](http://upload-images.jianshu.io/upload_images/1108512-cdfb0ec412c26c51.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我们知道Scratch的角色是有名字的,那么我们能否给turtle中的小乌龟命名呢?
是可以的,我们单击添加角色,选择添加角色的过程用命令来代替就是
```
Turtle()
```
调用这个命令就可以生成一个turtle对象,也就是类似于Scratch中的角色,同时我要起名字比如
```
cat = Turtle()
```
这里的cat就是角色的名字.
```
from turtle import *
cat = Turtle()
panda = Turtle()
```
以上我们新建了两个角色,
![看舞台上有两个角色,因为重复了所以看不到](http://upload-images.jianshu.io/upload_images/1108512-6607f019e01c52a9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
接下来,我们让小猫向右移动,小狗向左移动
```
from turtle import *
cat = Turtle()
panda = Turtle()
cat.forward(100)
panda.forward(-100)
```
注意```cat.forward(100)```这个语法,含义是让cat角色,向前移动100个单位,因为默认cat是朝向右侧,这个跟Scratch是相同的,通过```.```来给cat下命令,前进后退,左转,右转等等.而括号里面的数字就是叫做*参数*,意思是前进多少,后退多少,左转多少度,右转多少度等等.跟
![](http://upload-images.jianshu.io/upload_images/1108512-440a2f898429d95f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)这里10的含义是一样的.
![看舞台上出现了两个箭头](http://upload-images.jianshu.io/upload_images/1108512-aa00360c8afc288b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
## 改变舞台角色的外观
在Scratch里面有多种多样角色,而turtle中的就要少很多,我们接下来就学习如何改变
### 自带外观
turtle是自带外观的,通过```shape()```函数来进行改变
![看右侧的箭头变身为小乌龟了](http://upload-images.jianshu.io/upload_images/1108512-8ee2e1ecf3b43dff.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
```
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")
```
![看左侧的熊猫形状是圆形](http://upload-images.jianshu.io/upload_images/1108512-974b91e162325086.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
是不是很好玩的?
### 处理舞台相关的形状
从上面```shape()```函数中我们知道要想跟形状打交道,我们需要使用```register_shape()```函数,这个函数的功能是向舞台添加默认形状之外的形状,就相当于我们在Scratch中新建角色,用绘制或者上传图形的办法来做.
![我们在学习的时候可以用内置的help命令查看某个函数的具体功能,当然是英文的介绍,所以说学好英文是很有用的](http://upload-images.jianshu.io/upload_images/1108512-1d097510e77b722a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这个函数最简单的用法呢,其实就是,用文件名做参数,比如我在桌面保存一个叫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")
```
![导入a.gif看右侧cat的形状变成了一只可爱的小猴子](http://upload-images.jianshu.io/upload_images/1108512-93237736918bfd40.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>我是从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)
```
![小猴子画了一个圆,这个画面很逗有没有,](http://upload-images.jianshu.io/upload_images/1108512-e8057ed087a8731c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
在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)
```
![分布画圆,分别是3,4,5,6,7,10步画圆](http://upload-images.jianshu.io/upload_images/1108512-f205eb032a28999b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)