好奇心驱动的scratch作品

2022-04-29  本文已影响0人  Python_Camp

scratch实现娃的天马行空的想法,有故事、角色和剧本情节,创作空间可以和导演匹敌,不是吗?

梓捷同学作品薛定谔的猫

1973年4月28日。平克-弗洛伊德的《月之暗面》在美国专辑榜上排名第一,开始了在榜单上741周的破纪录之旅。2003年,《滚石》杂志在其 "有史以来最伟大的500张专辑 "名单中把这张专辑列为第43位。

image.png

color7 = {  'red':                  '#FF0000',
            'orange':               '#FFA500',
            'yellow':               '#FFFF00',
            'green':'#008000',
            'blue':                 '#0000FF',
            'indigo':               '#4B0082',
            'purple':               '#800080',
            }


t.bgcolor("black") #background 背景
t.goto(-100,0)   #正中间
for i in range(3):
    t.color('white')
    t.fd(150)    #forward 前进
    t.left(120)

t.color('white')
t.pensize(6)
t.penup()
t.goto(-260,-20)
t.pendown()
t.left(20)
t.fd(195)

#棱镜内部
t.color('blue')
t.pensize(6)
t.penup()
t.fd(98)
t.pendown()
x,y = t.position()


#射出棱镜彩虹

t.right(30)

for k, v in color7.items():
    t.pencolor(cnames[k])
    t.pensize(3)

    t.fd(300)
    t.pendown()
    t.goto(x,y)
    t.rt(0.8)
    t.penup()

t.done()

image.png

python运用turtle模块实现,但老师的代码并不完美。因为射出的光线在编程命令中是一条条逐条实现,显然和物理事实不符。这就算任务驱动的学习?如何实现光线同时射出?

魔鬼细节 enumerate vs range

image.png
grass = [7,1,14,3,8,2,7,2,0,6]
# 原题输入
print(sum(grass)/len(grass))
# 数学求平均验证可以做到每格 5 个草墩

# 初始化 金币花费cost
cost = 0
for i,e in enumerate(grass[:-1]):  
    st = grass[i] - 5  #注意没有采用 e  取而代之用地址脚标[i]
    cost += abs(st)  
    grass[i+1] += st
    grass[i] -= st
print(cost,grass)

输出结果
41 [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]

金币的花费是41

注意上述写法没有采用enumerate常用的 e 取而代之用地址脚标[i]
为何不直接用 e
试试看如何

# 写法 2 

grass = [7,1,14,3,8,2,7,2,0,6]
# 原题输入
print(sum(grass)/len(grass))
# 数学求平均验证可以做到每格 5 个草墩

# 初始化 金币花费cost
cost = 0
for i,e in enumerate(grass[:-1]):  
    st = e - 5  #注意采用 e  不用地址脚标[i]
    cost += abs(st)  
    grass[i+1] += st
    grass[i] -= st
print(cost,grass)

输出结果
33 [5, 7, 1, 14, 3, 8, 2, 7, 2, 1]

金币的花费是33,不同于前面的写法结果41,why?
请同学深入思考两种写法

添加一行代码,观察e, grass[i], grass三个变量的变化过程

cost = 0
step = 0
grass = [7,1,14,3,8,2,7,2,0,6]
for i,e in enumerate(grass[:-1]):
    print(i,e,grass[i],grass)
    st = e - 5
    cost += abs(st)

    grass[i+1] += st
    grass[i] -= st
print(cost,grass)

0 0 7 7 [7, 1, 14, 3, 8, 2, 7, 2, 0, 6]
1 2 1 3 [5, 3, 14, 3, 8, 2, 7, 2, 0, 6]
2 4 14 12 [5, 5, 12, 3, 8, 2, 7, 2, 0, 6]
3 11 3 10 [5, 5, 5, 10, 8, 2, 7, 2, 0, 6]
4 16 8 13 [5, 5, 5, 5, 13, 2, 7, 2, 0, 6]
5 24 2 10 [5, 5, 5, 5, 5, 10, 7, 2, 0, 6]
6 29 7 12 [5, 5, 5, 5, 5, 5, 12, 2, 0, 6]
7 36 2 9 [5, 5, 5, 5, 5, 5, 5, 9, 0, 6]
8 40 0 4 [5, 5, 5, 5, 5, 5, 5, 5, 4, 6]
41 [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]

输出结果看,只有第一行e 和 grass[i]相等都是 7,第2行还是输出呈现明显的规律,就算e正好是原数组grass的遍历,grass[i]则是每一步修改后的grass[i]的新赋值。至此,我们只是觉察到两者指向的数值不同,但并不清楚为什么不同?

上一篇下一篇

猜你喜欢

热点阅读