创造新文明
2018-08-23王丽丽
王丽丽
● 情境导入
上期文章提到阿派破解了羊皮卷的咒语。当他(她)大声朗读出咒语时,只见一道金光闪现,现出一副金色卡牌。阿派取出第一张卡牌,上面画了一朵玫瑰。他(她)随手一扬,卡牌就化作了一朵红玫瑰。
:在这一课中,学生将了解自定义函数的作用和创建方法,并利用自定义函数实现从一朵到一簇玫瑰花的绘制。学生还将了解到类的特点,使用类和对象描述玫瑰的特征。
● 解密玫瑰卡牌——高级海龟与函数
在之前的《神秘的图腾》一文中,我们已经了解了Python中海龟画图的基本使用方法。如图1的方法一,利用turtle绘制一朵红玫瑰。其中的for语句,我们曾在《过招守护使》一文中接触过,在这里利用for i in range(20)语句,实现绘制20瓣花瓣的效果。另外,circle的语法为turtle.circle(radius, extent=None, steps=None)。参数radius表示半径,为正数时逆时针画图,负数时顺时针。extent表示圆的弧度,如果缺省则表示画完整的圆。参数steps用于设定边数,如果steps为6,则表示画六边形,缺省为画圆。图1中的t.circle(i,80)表示逆时针绘制半径为i、弧度为80的圆弧,这样就绘制了玫瑰叶子的一條边缘线。
Python定义函数使用def关键字,def是define的缩写,表示“定义”的意思,一般格式如下:
def函数名(参数列表):函数体
函数名最好能见名知意,体现函数的功能,以字母、数字以及下画线组成,不能以数字开始。如图1的方法二,利用def Rose()自定义一个名为Rose的函数,函数体即左侧的一大块代码块,注意函数体要比def缩进四个空格,因为Python使用缩进表示结构层次。调用自定义函数和调用内建函数一样,只需要函数名和参数即可。如图1中的Rose()表示调用一次函数,绘制一朵玫瑰。如果需要反复多次绘制玫瑰,那我们可以多次调用自定义函数来完成快速绘制。
:Python提供了许多内建函数实现指定功能,如print()用于屏幕打印。我们也可以自己创建函数,实现特定的功能。在函数体内的变量,其作用域只限该函数内,在函数执行结束后就不能再用了。函数是重复利用代码、提高效率的一种方式。
● 设计玫瑰花簇卡牌——函数的多次调用
如果需要绘制50朵玫瑰花,那上文的重复调用函数的方法,显然还是不方便。我们可以利用for语句来实现函数的多次调用。如上页图2,一条for语句绘制50朵玫瑰花,且出现在画布的随机位置。
:结合函数和for语句,可以很方便地重复利用代码。本例中,除了设置玫瑰的随机位置,还可以试一试随机大小、随机颜色等,让运行效果更好。
● 表述玫瑰的特征——类和对象
玫瑰有很多品种,植株生长的高度也各不相同。如图3,将所有的玫瑰定义为rose这一类。不同的玫瑰具有各自的特征,如品名(name)和植株高度(height),这就是类的属性。玫瑰还可以有不同的状态,如植株正在生长(grow),这就是类的方法。
依据花朵大小来分类,玫瑰一般可分为:蔓性种、迷你种、中轮种和大轮种。我们可以在玫瑰(rose)这一父类下创建四个子类。其中的“大轮种(Hybrid)”这一子类的玫瑰,又有着不同的花朵颜色(color)属性,而且花朵可能处在不同的状态,如正在绽放(bloom)。
:类是具有相似属性和方法的对象的集合。一个对象就是某个类的实例。每个对象的属性值,根据对象的不同而不同,如不同品种的玫瑰花的颜色可能不同。通过类的创建,将事物分类,在编程时,更符合人的认知习惯,且结构清晰,易于维护。
接下来,在Python中代码实现。首先,所有的玫瑰可以定义为一个类。如图4,利用class关键字来定义类,后面跟上类名rose。然后,定义基本属性,即品名(name)和植株高度(height)。再定义一个名为__init__( )的特殊方法,在类的实例化操作时会自动调用该方法。接着,将玫瑰的生长状态定义为grow方法。这里,我们用简单的print函数输出玫瑰的当前状态。如果有需要,还可以尝试其他效果。
:与定义一般的函数不同,定义类方法必须包含参数self,而且self为第一个参数,代表类的实例。self参数可以从类中的一个函数调用类中或者父类中的另外一个函数。此外,Python支持参数的格式化输出。如图4,%s是字符串对应的格式通配符,%d是数值整型对应的格式通配符。
依据图3的分类,继续创建子类hybrid(大轮种)。当然,大轮种和其他三类都属于rose类,因此均继承了父类rose的特征。同时,它又具备自己的特征,如颜色属性(如图5)。
:现在,我们已经创建了两个类。注意在定义子类hybrid时,需要在类的参数(括号中)注明父类rose的名称,表明隶属关系。这样,子类可以继承父类的特征。
将hybrid类“实例化”后,就得到了一个对象。如图6,flower1属于hybrid类的一朵玫瑰,品名是“卡罗拉”,植株高度为90厘米,颜色为红色。同一个类,还可以创建多个对象,如通过实例化产生其他玫瑰,有不同的颜色和高度等特征。
最后,运行程序,效果如图7。
● 设计新卡牌
之后的卡牌牌面都是空白,你可以利用类和函数来设计新卡牌,快速建造其他物品,创造一个新的文明世界。