鱼C论坛

 找回密码
 立即注册
查看: 3331|回复: 13

[学习笔记] Python学习笔记23-----实践演练(1) New!

[复制链接]
发表于 2020-8-22 23:31:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
编程思维 分为如下四点:

问题分解:把现实生活中的复杂问题,逐步拆分成容易解决的小问题;
模式识别:根据已有的知识和经验,找出新问题和以前解决过的问题的相似性;
抽象思维:将问题里涉及的数据抽象到数据结构(变量、列表、字典等),把数据处理过程可重复执行部分抽象成函数;
算法设计:根据前三步的分析成果,设计步骤,写出算法,从而解决问题。


文章、生词、词频、难度分等分别要用什么数据类型保存,整型?浮点型?字符串?列表还是字典?如何将代码封装成函数?

  1. 选对合适的数据类型十分重要,比如列表适合用于有序的集合,花名册就很适合用 列表:

  2. roster = ['林黛玉', '贾宝玉', '薛宝钗']
复制代码

  1. 但如果将姓名和学号一一对应,用列表就不太合适了,一一对应的场景下 字典 更为合适:

  2. roster = {
  3.   '林黛玉': 20190101,
  4.   '贾宝玉': 20190102,
  5.   '薛宝钗': 20190103
  6. }
复制代码

  1. 除了姓名和学号外,如果还想再加一个性别,我们该怎么办?你肯定想到了,将 列表 和 字典 组合起来使用:

  2. roster = [
  3.   {
  4.     'id': 20190101,
  5.     'name': '林黛玉',
  6.     'gender': '女'
  7.   },{
  8.     'id': 20190102,
  9.     'name': '贾宝玉',
  10.     'gender': '男'
  11.   },{
  12.     'id': 20190103,
  13.     'name': '薛宝钗',
  14.     'gender': '女'
  15.   }
  16. ]
复制代码

  1. word_list = article.lower().replace('.', '').split()
  2. print(word_list)
复制代码

#处理文章

得到大小写统一的单词列表后,我们就可以进行单词出现次数的计算了。

  1. # 省略之前获取 word_list 代码
  2. word_count = {}

  3. for word in word_list:
  4.   if word in word_count:
  5.     word_count[word] += 1
  6.   else:
  7.     word_count[word] = 1

  8. print(word_count)
  9. # 输出:{'this': 2, 'is': 11, 'a': 5, 'photograph': 3, ... 'into': 1}
复制代码


实际成果


一篇英文文章中有很多单词,初始难度分为 0,每当出现一次生词就将难度分 +5,最终的难度分就代表这篇文章的难度。

如果你已经有了思路,可以忽略下面的内容直接开始写代码了,如果你还是一头雾水,可以再思考一下然后看下面的提示。

提示:我们在统计生词数的同时可以进行难度分的计算,因此可以合并成一个 get_difficulty() 函数,参数为每个单词出现次数的字典和生词列表。初始难度分为 0,遍历生词列表,如果生词在单词出现次数的字典中,难度分增加 5 * 该单词出现的次数,最终即可得到难度分。


  1. article = '''This is a photograph of our village.
  2. Our village is in a valley.
  3. It is between two hills.
  4. The village is on a river.
  5. Here is another photograph of the village.
  6. My wife and I are walking along the banks of the river.
  7. We are on the left.
  8. There is a boy in the water.
  9. He is swimming across the river.
  10. Here is another photograph.
  11. This is the school building.
  12. It is beside a park.
  13. The park is on the right.
  14. Some children are coming out of the building.
  15. Some of them are going into the park.
  16. '''

  17. new_words = [
  18.   'photograph',
  19.   'village',
  20.   'valley',
  21.   'between',
  22.   'hills',
  23.   'another',
  24.   'prep',
  25.   'wife',
  26.   'along',
  27.   'banks',
  28.   'water',
  29.   'swimming',
  30.   'building',
  31.   'park',
  32.   'into'
  33. ]
  34. word_list = article.lower().replace('.', '').split()
  35. def get_word_count(article):
  36.   word_count = {}
  37.   

  38.   for word in word_list:
  39.     if word in word_count:
  40.       word_count[word] += 1
  41.     else:
  42.       word_count[word] = 1
  43.   
  44.   return word_count

  45. def get_difficulty(word_list,new_words):
  46.   s = 0
  47.   for a in new_words :
  48.     if a in word_list :
  49.       s += 5 * word_list.get(a)
  50.     else:
  51.       continue
  52.   return s
  53. a = get_word_count(article)
  54. s = get_difficulty(a,new_words)
  55. print(s)
  56.       
复制代码


学习一下要用到的画图工具——turtle(海龟绘图)。
turtle 是 Python 中自带的绘图模块

可以把教学环境中运行结果区域想象成一个画板,而你使用 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边形
  1. import turtle

  2. turtle.color('red')

  3. # n 要大于 2
  4. def draw_polygon(n):
  5.   for i in range(n):
  6.     turtle.forward(10)
  7.     turtle.right(360/n)
  8. turtle.hideturtle()
  9. draw_polygon(8)
复制代码


五角星画法

  1. import turtle

  2. turtle.color('red')
  3. turtle.hideturtle()

  4. for i in range(5):
  5.   turtle.forward(100)
  6.   turtle.right(144)
复制代码

设置颜色

turtle.color() 会将画笔颜色和填充颜色都设置成一个。而调用 turtle.fillcolor() 能单独设置填充颜色,你也可以调用 turtle.pencolor() 单独设置画笔颜色。

我们只要在画五角星之前调用 turtle.begin_fill(),在画完五角星之后调用 turtle.end_fill(),我们画的五角星就会被填充上我们设置好的颜色了。


红色五角星


  1. import turtle

  2. turtle.color('red')  # 画笔颜色和填充颜色都设为红色
  3. turtle.hideturtle()

  4. turtle.begin_fill()
  5. for i in range(5):
  6.   turtle.forward(100)
  7.   turtle.right(144)
  8. turtle.end_fill()
复制代码


移动五角星


我们做不到直接移动五角星,但我们可以移动画笔的初始位置。只要将画笔的初始位置往左上方移动一点,这样我们的五角星就处于坐标系的最中间了。上图中画笔的初始位置在坐标系中大概是 (-50 ,20),我们可以调用 turtle.goto(-50, 20) 来移动画笔的位置。第一个参数是 x 轴的坐标,第二个参数是 y 轴的坐标。


但直接移动画笔位置是有问题的,因为我们的画笔一直处于落下的状态,移动的过程中也会画出一条直线。我们可以调用 turtle.penup() 将画笔抬起,这样移动的过程中就不会画线。等需要时再调用 turtle.pendown() 将画笔落下开始绘图。


  1. import turtle
  2. from random import randint

  3. def draw_star():
  4.   turtle.color('white')
  5.   turtle.hideturtle()
  6.   turtle.begin_fill()
  7.   for i in range(5):
  8.     turtle.forward(10)
  9.     turtle.right(144)
  10.   turtle.end_fill()

  11. for i in range(50):
  12.   turtle.speed(0)  # 最快速
  13.   turtle.penup()
  14.   x = randint(-150, 150)  # x 轴
  15.   y = randint(-100, 100)  # y 轴
  16.   turtle.goto(x, y)
  17.   turtle.pendown()
  18.   draw_star()
复制代码



你应该注意到了 turtle.speed(0) 这行代码,这是控制绘图速度的。因为画 50 颗小星星耗时较久,所以要加快绘图速度。 turtle.speed(0) 的参数是 0-10 的整数,其中 1-10 数字越大,绘图速度越快。1 最慢,10 最快,默认是 6。而 0 表示没有动画效果,因此 0 比 10 的速度还要快。



                               
登录/注册后可看大图


未完待续~~~~~~~~~~


                               
登录/注册后可看大图

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-25 16:23:17 | 显示全部楼层
此帖仅作者可见
小甲鱼最新课程 -> https://ilovefishc.com

使用道具 举报

发表于 2020-8-31 23:46:40 | 显示全部楼层

回帖奖励 +1 鱼币

此帖仅作者可见
小甲鱼最新课程 -> https://ilovefishc.com

使用道具 举报

发表于 2020-9-2 10:30:13 | 显示全部楼层
此帖仅作者可见
小甲鱼最新课程 -> https://ilovefishc.com

使用道具 举报

发表于 2020-9-2 13:16:37 From FishC Mobile | 显示全部楼层
此帖仅作者可见
小甲鱼最新课程 -> https://ilovefishc.com

使用道具 举报

发表于 2020-9-5 10:55:12 | 显示全部楼层
此帖仅作者可见
小甲鱼最新课程 -> https://ilovefishc.com

使用道具 举报

发表于 2020-9-5 10:56:08 | 显示全部楼层
此帖仅作者可见
小甲鱼最新课程 -> https://ilovefishc.com

使用道具 举报

发表于 2020-9-5 21:48:58 | 显示全部楼层
此帖仅作者可见
小甲鱼最新课程 -> https://ilovefishc.com

使用道具 举报

发表于 2020-9-5 21:49:45 | 显示全部楼层
此帖仅作者可见
小甲鱼最新课程 -> https://ilovefishc.com

使用道具 举报

发表于 2020-9-27 16:00:44 | 显示全部楼层

回帖奖励 +1 鱼币

此帖仅作者可见
小甲鱼最新课程 -> https://ilovefishc.com

使用道具 举报

发表于 2020-9-30 08:07:56 | 显示全部楼层
此帖仅作者可见
小甲鱼最新课程 -> https://ilovefishc.com

使用道具 举报

发表于 2020-9-30 12:18:11 | 显示全部楼层
此帖仅作者可见
小甲鱼最新课程 -> https://ilovefishc.com

使用道具 举报

发表于 2021-5-31 14:51:56 | 显示全部楼层
此帖仅作者可见
小甲鱼最新课程 -> https://ilovefishc.com

使用道具 举报

发表于 2021-5-31 15:28:26 | 显示全部楼层

回帖奖励 +1 鱼币

此帖仅作者可见
小甲鱼最新课程 -> https://ilovefishc.com

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 14:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表