马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
编程思维 分为如下四点:
问题分解:把现实生活中的复杂问题,逐步拆分成容易解决的小问题;
模式识别:根据已有的知识和经验,找出新问题和以前解决过的问题的相似性;
抽象思维:将问题里涉及的数据抽象到数据结构(变量、列表、字典等),把数据处理过程可重复执行部分抽象成函数;
算法设计:根据前三步的分析成果,设计步骤,写出算法,从而解决问题。
文章、生词、词频、难度分等分别要用什么数据类型保存,整型?浮点型?字符串?列表还是字典?如何将代码封装成函数?
选对合适的数据类型十分重要,比如列表适合用于有序的集合,花名册就很适合用 列表:
roster = ['林黛玉', '贾宝玉', '薛宝钗']
但如果将姓名和学号一一对应,用列表就不太合适了,一一对应的场景下 字典 更为合适:
roster = {
'林黛玉': 20190101,
'贾宝玉': 20190102,
'薛宝钗': 20190103
}
除了姓名和学号外,如果还想再加一个性别,我们该怎么办?你肯定想到了,将 列表 和 字典 组合起来使用:
roster = [
{
'id': 20190101,
'name': '林黛玉',
'gender': '女'
},{
'id': 20190102,
'name': '贾宝玉',
'gender': '男'
},{
'id': 20190103,
'name': '薛宝钗',
'gender': '女'
}
]
word_list = article.lower().replace('.', '').split()
print(word_list)
#处理文章
得到大小写统一的单词列表后,我们就可以进行单词出现次数的计算了。
# 省略之前获取 word_list 代码
word_count = {}
for word in word_list:
if word in word_count:
word_count[word] += 1
else:
word_count[word] = 1
print(word_count)
# 输出:{'this': 2, 'is': 11, 'a': 5, 'photograph': 3, ... 'into': 1}
实际成果
一篇英文文章中有很多单词,初始难度分为 0,每当出现一次生词就将难度分 +5,最终的难度分就代表这篇文章的难度。
如果你已经有了思路,可以忽略下面的内容直接开始写代码了,如果你还是一头雾水,可以再思考一下然后看下面的提示。
提示:我们在统计生词数的同时可以进行难度分的计算,因此可以合并成一个 get_difficulty() 函数,参数为每个单词出现次数的字典和生词列表。初始难度分为 0,遍历生词列表,如果生词在单词出现次数的字典中,难度分增加 5 * 该单词出现的次数,最终即可得到难度分。
article = '''This is a photograph of our village.
Our village is in a valley.
It is between two hills.
The village is on a river.
Here is another photograph of the village.
My wife and I are walking along the banks of the river.
We are on the left.
There is a boy in the water.
He is swimming across the river.
Here is another photograph.
This is the school building.
It is beside a park.
The park is on the right.
Some children are coming out of the building.
Some of them are going into the park.
'''
new_words = [
'photograph',
'village',
'valley',
'between',
'hills',
'another',
'prep',
'wife',
'along',
'banks',
'water',
'swimming',
'building',
'park',
'into'
]
word_list = article.lower().replace('.', '').split()
def get_word_count(article):
word_count = {}
for word in word_list:
if word in word_count:
word_count[word] += 1
else:
word_count[word] = 1
return word_count
def get_difficulty(word_list,new_words):
s = 0
for a in new_words :
if a in word_list :
s += 5 * word_list.get(a)
else:
continue
return s
a = get_word_count(article)
s = get_difficulty(a,new_words)
print(s)
学习一下要用到的画图工具——turtle(海龟绘图)。
可以把教学环境中运行结果区域想象成一个画板,而你使用 turtle 控制画笔在画板上画画。而这个画笔是有形状的,默认是一个小箭头,我们可以使用 turtle.shape('turtle') 将其设成一个小海龟。除了变成小海龟外,还支持传入 'arrow'(箭头),'circle'(圆),'square'(正方形),'triangle'(三角形)和 'classic'(经典)
调用 turtle.forward(3) 让小海龟前进 3 像素,也就是小海龟移动到了坐标系中 (3, 0) 的位置。因为我们的画笔默认是落下的,因此在移动的过程中会留下一道轨迹,即一条长 3 像素的直线
画笔的颜色默认是黑色的,我们可以使用 turtle.color('red') 改成红色的。当然,你也可以使用 turtle.color('yellow') 改成黄色,使用 turtle.color('pink') 改成粉色等等。
除了使用颜色的英文外,我们还能传入 16 进制的 RGB 色值。RGB 色值能表示出 1600 多万种颜色,比如 #000000 表示黑色,#FFFFFF 表示白色,#FF0000 表示红色等。这里只是提及一下,不要求掌握,有兴趣的同学可以自行了解更多。
注意:如果你在本地环境使用 turtle 画图,图形绘制完毕后程序会自动退出。需要在代码最后加上 turtle.done() 来防止程序自动退出。
转弯其实很简单,分为左转和右转。左转是 turtle.left(),右转是 turtle.right()。它俩的参数是角度,比如 turtle.right(90) 表示右转 90 度。同理,turtle.left(90) 表示左转 90 度。
隐藏小海龟非常的简单,只要调用 turtle.hideturtle() 即可。当你想再次显示小海龟时,调用 turtle.showturtle() 即可
直接调用 turtle.setheading(0) 让小海龟朝东,调用 turtle.setheading(180) 让小海龟朝西。当然,0 到 360 度之间的角度都是可以的,调用 turtle.setheading(45) 可以让小海龟朝向东北方向。
试一试 画画n边形import turtle
turtle.color('red')
# n 要大于 2
def draw_polygon(n):
for i in range(n):
turtle.forward(10)
turtle.right(360/n)
turtle.hideturtle()
draw_polygon(8)
五角星画法import turtle
turtle.color('red')
turtle.hideturtle()
for i in range(5):
turtle.forward(100)
turtle.right(144)
设置颜色
turtle.color() 会将画笔颜色和填充颜色都设置成一个。而调用 turtle.fillcolor() 能单独设置填充颜色,你也可以调用 turtle.pencolor() 单独设置画笔颜色。
我们只要在画五角星之前调用 turtle.begin_fill(),在画完五角星之后调用 turtle.end_fill(),我们画的五角星就会被填充上我们设置好的颜色了。
红色五角星
import turtle
turtle.color('red') # 画笔颜色和填充颜色都设为红色
turtle.hideturtle()
turtle.begin_fill()
for i in range(5):
turtle.forward(100)
turtle.right(144)
turtle.end_fill()
移动五角星
我们做不到直接移动五角星,但我们可以移动画笔的初始位置。只要将画笔的初始位置往左上方移动一点,这样我们的五角星就处于坐标系的最中间了。上图中画笔的初始位置在坐标系中大概是 (-50 ,20),我们可以调用 turtle.goto(-50, 20) 来移动画笔的位置。第一个参数是 x 轴的坐标,第二个参数是 y 轴的坐标。
但直接移动画笔位置是有问题的,因为我们的画笔一直处于落下的状态,移动的过程中也会画出一条直线。我们可以调用 turtle.penup() 将画笔抬起,这样移动的过程中就不会画线。等需要时再调用 turtle.pendown() 将画笔落下开始绘图。
import turtle
from random import randint
def draw_star():
turtle.color('white')
turtle.hideturtle()
turtle.begin_fill()
for i in range(5):
turtle.forward(10)
turtle.right(144)
turtle.end_fill()
for i in range(50):
turtle.speed(0) # 最快速
turtle.penup()
x = randint(-150, 150) # x 轴
y = randint(-100, 100) # y 轴
turtle.goto(x, y)
turtle.pendown()
draw_star()
你应该注意到了 turtle.speed(0) 这行代码,这是控制绘图速度的。因为画 50 颗小星星耗时较久,所以要加快绘图速度。 turtle.speed(0) 的参数是 0-10 的整数,其中 1-10 数字越大,绘图速度越快。1 最慢,10 最快,默认是 6。而 0 表示没有动画效果,因此 0 比 10 的速度还要快。
未完待续~~~~~~~~~~
|