面向孩子们的 Python 入门指南(二)

原文:Introduction to Python for Kids

协议:CC BY-NC-SA 4.0

六、使用turtle画酷酷的东西

在前几章中,我们学习了如何在 Python 中处理数字。我们看了 Python 中不同类型的数字,可以做的各种操作,以及使用各种模块和预定义的方法来享受 Python 的乐趣!

在这一章中,我们将会看到 Python 中的另一个模块, Turtle 模块。我们将学习关于turtle的所有知识,用它来绘制图形、形状、设计、文本等等。我们还会以一些很酷的迷你项目来结束这一章。

我们开始吧

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你开始厌烦了吗?让我们从理论上休息一下,好吗?我答应给你快乐,现在是我兑现承诺的时候了。让我们用 Python 来画吧!你想知道怎么做吗?

好吧,我来给你介绍一下那个神奇的世界,那就是“乌龟”。 Turtle 是一个 Python 模块,它附带了大量工具(预定义的方法),你可以用它们在屏幕上绘图。天空是你用turtle所能做的极限。

在这一章中,让我们从turtle的基础开始,随着我们深入到这本书,我将向你展示你可以用turtle和 Python 做的更高级的技巧。

不再有无聊的项目!从这一章开始,我们的迷你项目将会变得丰富多彩。你兴奋吗?我知道我是!

好吧,我们开始吧。

你为什么不创建一个新文件,随便你怎么命名?你可以用它来写这一章。不过要小心命名!不要将您的文件命名为 turtle.py,因为您的 Python 安装中已经有一个 turtle.py,使用相同的名称命名您的文件会导致运行时出错。除此之外,你可以给它起任何你想要的名字。我将我的文件命名为 drawTurtle.py。

在我们开始之前,我们需要将乌龟导入到我们的 Python 脚本文件中。turtle只是一个附加品,记得吗?因此,除非您导入它,否则它不会出现在您的文件中。这个过程实际上非常简单。只需输入“进口”,然后输入带小“t”的“海龟”。

import turtle

好极了。我们已经将 Turtle 导入到脚本文件中。接下来让我们创建我们的屏幕。 Turtle 创建图形,如果你注意到了,你的 Python Shell 并没有正确显示图像或绘图。因此,我们将创建我们自己的屏幕,在那里我们的绘图将出现。

让我们创建一个变量“s”(你可以随意命名)。我们将使用 turtle 的 getscreen()预定义函数从 turtle 获取我们的屏幕,并将其分配给 s ,如下所示:

s = turtle.getscreen()

现在,变量“s”包含了我们的龟屏(图 6-1 )。让我们运行前面的代码行,看看我们会得到什么。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-1

蟒蛇龟屏

您是否看到了一个类似于上图的弹出窗口,中间有一个黑色标记?那是我们的乌龟。

现在我们有了屏幕,让我们创建我们的turtle!迷茫?不要这样。在 turtle 中,一只乌龟会画出你在屏幕上命令的任何东西。字面意思。会很酷的,你会看到的。海龟包里还有另一个预定义的函数 Turtle()(海龟太多了,我知道:D)。它有你需要在屏幕上画画的所有工具,像画线、画圆、给它们上色等等。让我们得到这个函数,并把它赋给一个变量 t,这样我们可以在以后绘图时使用它。

t = turtle.Turtle()

记住 Turtle()函数中的“T”是大写的。

当您现在运行代码时,您不会看到任何变化。它仍然是相同的空白屏幕,但我们现在已经设置好了一切。前三行代码(import、getscreen 和 turtle())在每个涉及 Turtle 图形的程序中都是常量,所以总是从这些代码开始,我假设您已经在我未来的示例中包含了这些代码行。

接下来我们画画吧!

让你的 turtle 动起来

现在我们已经准备好了一切,让我们让我们的乌龟按照我们想要的方向移动,并在它移动的时候画画。我们的乌龟要画直线,我们要给它这些线的距离和方向。听起来不错?让我们看看它是如何工作的。

向前和向后移动

先从基础的开始测试,前进后退。

要向前移动,需要使用 Turtle()函数的 forward()预定义方法,在括号内,需要给出距离。所以,如果你想让你的海龟向前移动(并画出)100 点,你要在括号内给 100 点,就像这样:

t.forward(100)

我们在前面的例子中给出了t.forward(),因为 forward()函数也在变量 t 的内部,因为我们把 Turtle()内部的所有东西都赋给了它。

让我们保存并运行我们的脚本,我们将得到这个(图 6-2 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-2

前进 100 分

太好了!我们得到了一条向前的直线,它停在 100 点,正如我们所希望的。

你如何让它向后移动?是的,你猜对了!通过使用 backward()函数。但是有一个条件!如果你现在让你的海龟后退,它只会越过当前的线,你什么也看不见。让我们测试一下。

t.backward(100)

运行前面的代码,你会得到这个(图 6-3 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-3

落后 100 分

是的,一点都没变。看我画的指向turtle起点的箭头。我们的乌龟只是回到了那个起点,却没有画出什么新的东西。

有一种方法可以解决这个问题。还有一个函数叫做 home(),它会让你的海龟回到家(起始位置)。所以,在我们给出 backward 命令之前,为什么不用 home()让 turtle 回到位置呢?

整个代码片段将如下所示:

import turtle
s = turtle.getscreen()
t = turtle.Turtle()
t.forward(100)
t.home()
t.backward(100)

当我们运行前面的代码时,我们会得到这个(图 6-4 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-4

前进、回家和后退

耶!我们的乌龟从出发位置出发,向右(向前)画了一条 100 点的直线,然后回到出发位置(它确实是边走边画的,但是因为它画过了原来的线所以你没看到),再向左(向后)画了一条 100 点的直线。它完美地工作。

或者,您可以只给t.backward(200)来获得相同的结果。

运行代码时,您注意到什么了吗?海龟(Turtle)实时为你画出这些线条。是不是很牛逼?外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让你的乌龟改变方向

不能一直向前向后画。你需要改变方向来画出合适的形状。这就是天使出现的地方。你在学校学过角度了吗?如果没有,也不用担心。我来快速解释一下概念。这很容易。

看图 6-5 。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-5

在 Turtle 中使用角度来改变方向

在 Python 的海龟模块中,角度基本上就是方向。所以,如果你想让你的海龟从现在的位置(家)一直往前走,那就直接说往前(100)。如果你想让它直接向上,那么首先通过向左(45°)或向左(45°)改变方向。现在,如果你给 forward(100)或类似的东西,你会得到一条向上的线,就像我在前面的图中画的一样。类似地,向下,再次使用 90 度,但这次是向右(90 度)。对于其余部分,您可以参考前面的图像,并决定您需要使用哪一行代码来改变方向。

如你所见,如果我们想让我们的turtle转完整个圈,也就是向下画而不是向右画,那么我们需要给 90 度作为我们的角度。现在让我们来测试一下。我假设你已经输入了三行强制性的海龟代码。然后,键入以下内容:

t.forward(100)
t.right(90)
t.forward(100)

我们首先让海龟向前移动 100 点。然后我们让它右转 90 度,这是一个急转弯(对画正方形和长方形有用)。现在,我们的海龟面朝下,我们让它再向前移动 100 点。

当我们运行前面的代码行时,我们会得到这个(图 6-6 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-6

右(90)

现在让我们向左移动 90 度,看看我们会得到什么。

t.left(90)
t.forward(100)

当你运行这个脚本时,你会得到这个(图 6-7 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-7

左(90 度)

看,它向左急转弯了。

恭喜你!你现在有四个最强大的工具供你使用,你可以用它们来画很多东西。你想从几个很酷的造型开始吗?

让我们从简单的开始,好吗?正方形怎么样?

迷你项目-画一个正方形

不要马上看解决方案。编程中同一个问题有很多解法,尽量自己找,然后看我的。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好吧,我会让我的解决方案非常简单。我要用向前和向右。我的正方形的长度和高度都是 100 点。

这些是我要用来画正方形的步骤:

  1. 我先让乌龟向前移动 100 点,然后右转 90 度。

  2. 然后再向前移动 100 点,画出正方形的第二条边,再右转。

  3. 再次向前画第三条边,再次右转。

  4. 再次向前画第四条边,也是最后一条边。

让我们将前面的说明转换成代码:

import turtle
s = turtle.getscreen()
t = turtle.Turtle()
t.forward(100)
t.right(90)
t.forward(100)
t.right(90)
t.forward(100)
t.right(90)
t.forward(100)

让我们运行前面的代码行。你会看到 turtle 用我们的命令实时绘制(图 6-8 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-8

画一个正方形

耶!我们得到了我们的广场!

你可以只输入t.home()而不是最后的t.forward(100),你会得到同样的结果。你为什么不试试看?

迷你项目-画一个六边形

对于我的六边形,我将遵循与我的正方形相同的规则。唯一的不同是我每次都要让我的乌龟转 60 度,因为这是六边形的边所在的角度(图 6-9 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-9

六边形的角

此外,我将使用六次 forward 函数,而不是四次,因为我需要它来绘制六条边。

看看下面的代码。很容易理解。

import turtle
s = turtle.getscreen()
t = turtle.Turtle()
t.forward(100)
t.right(60)
t.forward(100)
t.right(60)
t.forward(100)
t.right(60)
t.forward(100)
t.right(60)
t.forward(100)
t.right(60)
t.forward(100)

为一个形状键入所有这些代码行有点乏味,你不觉得吗?别担心。当我们看自动化时,我将教你如何用几行代码画出你想要的任何形状,任何次数。我保证等待是值得的。

当你运行前面的代码时,你会得到这个(图 6-10 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-10

画一个六角形

又来了!

快捷指令

每次向前、向后、向右和向左打字有点乏味,你不觉得吗?为什么我们不缩短每件事,让事情变得简单些呢?可以写成 fdbkrtlt 来代替。

让我们用我们的正方形试试我们的捷径。

import turtle
s = turtle.getscreen()
t = turtle.Turtle()
t.fd(100)
t.rt(90)
t.fd(100)
t.rt(90)
t.fd(100)
t.rt(90)
t.fd(100)

运行前面的代码,你会得到这个(图 6-11 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-11

快捷方式 fd、bk、lt 和 rt

我们成功了,耶!

现在我要你让你的想象力自由驰骋。想画什么就画什么。只需输入你的代码,运行它,查看结果,并进行修改。创建尽可能多的形状。尽情享受吧!外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

转到屏幕上的随机点

到现在为止,你可能已经是让 turtle 在屏幕上画直线并操纵它们得到不同形状的专家了。但这难道不是一个繁琐的过程吗?您实际上是编写两行代码来绘制每一条直线——向前或向后绘制,然后向右或向左改变方向。

如果你可以命令你的turtle去一个特定的位置,当它去的时候画一条直线,它就这样做了,会怎么样?没有角度,没有前进,什么都没有。类似这样的事情会节省你的时间和空间,不是吗?

你当然可以用预定义的函数 goto 做类似的事情。但是,不要像你做向前和向后那样,仅仅指定你想让你的乌龟移动的点数,你需要指定你想让乌龟移动到的确切坐标。

什么是坐标?你在学校学过它们吗,也许是在你学图形的时候?如果没有,也不用担心。我现在解释一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-12

海龟坐标

看前面的图片(图 6-12 )。turtle平时(家)出发的点就是标有(0,0)的大红点。第一个 0 是 x 值,第二个 0 是 y 值。你注意到这些线被标记为 X,–X,Y 和–Y 了吗?这些被称为轴。不用太担心轴和坐标。如果你还不知道他们,你只需要知道足够多,知道把你的海龟送到哪里。

x 值向右正增加,向左负增加。Y 值向上正增加,向下负增加。现在你知道了,你也知道(x,y)是坐标的写法,再看一下图像。你看到坐标现在是怎么写的了吗?

(200,200)是它所在的位置,因为 x 在正 200,y 也在正 200。所以,如果你给 goto(200,200),那么你将从(0,0)画一条直线,这是 turtle 的默认起点,到(200,200),这将是一条对角线(图 6-13 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-13

(0,0)到(200,200)

用 goto 画一个正方形

好了,现在你知道坐标是如何工作的了,让我们用它来画点东西。正方形怎么样?

我将从默认值(0,0)开始。我不必提及这一点,因为默认情况下 Turtle 会这么做。然后,我将向上移动到(0,100),然后向右移动到(100,100),向下移动到(100,0),最后回到(0,0)。你为什么不参考坐标图像来看看这些点在哪里?

现在让我们编写代码:

import turtle
s = turtle.getscreen()
t = turtle.Turtle()
t.goto(0,100)
t.goto(100,100)
t.goto(100,0)
t.home()

t.home()会让海龟回到(0,0)的位置。

当你运行前面的代码时,你会得到这个(图 6-14 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-14

带 goto 的正方形

看看,你只用了四行代码而不是七行代码就画出了同样的东西。你为什么不摆弄坐标,画更多的正方形或其他形状呢?

迷你项目-画一个曼荼罗(只有直线)

在这个迷你项目中,我们将把你的绘画提升到一个新的高度。我们要画一个曼荼罗,但是只用直线。好吧,我承认。只有线的曼荼罗不是真正的曼荼罗,但是,嘿,它仍然是曼荼罗,所以让我们跟随它。我们将在未来的课程中学习绘制更复杂的曼荼罗,所以请耐心等待!外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们开始吧,好吗?首先,我们要在底部画一个正方形,并从正方形的每一边画四个倾斜的正方形:

  1. 让我们先从基础做起。

    #Mandala with lines
    import turtle
    s = turtle.getscreen()
    t = turtle.Turtle()
    
    
  2. Now, we’re going to create our base, our square. It’s going to be a square of 100 points on each side, starting from the point (0,0), moving upward to (0,100) for the first side, then right toward (100,100) for the second side, then down to (100,0) for the third side, and going back to home (0,0) for the last side.

    #Create the square base first
    t.goto(0,100)
    t.goto(100,100)
    t.goto(100,0)
    t.home()
    
    

    When we run what we have so far, this is what we’ll get (Figure 6-15).

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    图 6-15

    第一步——画出正方形的底部

  3. 接下来我们画第一个倾斜的正方形。

现在,我们的笔在(0,0)。我们将要求它画一条对角线到点(50,50)(正方形的中间),然后在点(0,100)会合,这将在正方形内给出一个圆锥形。

#First tilted square
t.goto(50,50)
t.goto(0,100)

当我们运行前面的代码时,我们会得到这个(图 6-16 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-16

第 2 步–第一个倾斜的正方形,第一部分

  1. Now let’s draw the same shape outside of the square to complete our first tilted square. Let us have our Turtle go to the exact opposite of the point 50,50 which is –50,50 and then again back home.

    t.goto(-50,50)
    t.home()
    
    

    When we’re done, we’ll get something like this (Figure 6-17).

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    图 6-17

    步骤 3-完成第一个倾斜的正方形

  2. 我们有了第一个倾斜的正方形!耶!现在来看下一个。

    第二个很简单,真的。我们只是从 0,0 到点 50,-50(在方块下面),然后在 100,0 处会合。然后我们要去方块的对面到 0,100,准备画下一个方块。

#2nd tilted square
t.goto(50,-50)
t.goto(100,0)
t.goto(0,100) #Getting ready to draw the next tilted square

当我们运行前面的代码时,我们将得到这个(图 6-18 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-18

步骤 4–第二个倾斜的正方形

  1. From the point 0,100, let’s draw the next tilted side to 50,150. Then let’s go back to 100,100 from there, we’ll get a conical shape again. Then, when we go to the center of the square to 50,50, we’ll have our third tilted square (Figure 6-19).

    #3rd tilted square
    t.goto(50,150)
    t.goto(100,100)
    t.goto(50,50)
    
    

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    图 6-19

    第五步–第三个倾斜的正方形

  2. 从中心 50,50,到 100,0,这样我们可以准备完成第四个倾斜的正方形。转到 150,50 开始圆锥形,转到 100,100 结束圆锥形。

    #4th tilted square
    t.goto(100,0)
    t.goto(150,50)
    t.goto(100,100)
    
    

当我们运行整个脚本时,我们将得到这个(图 6-20 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6-20

第六步–第四个倾斜的正方形

哇哦!是的,我们有一个基本的曼荼罗形状,但是当我们完成学习剩余的好东西乌龟的时候,你可以定制这个形状到你想要的任何形状!

摘要

在这一章中,我们看了 Python 的图形模块 Turtle ,如何使用它通过使用向前、向后、向右和向左来绘制线条,同时也使我们的乌龟走向各自的坐标点。我们还学习了用 Python 绘制正方形、矩形、六边形等形状,并以两个迷你项目结束了这一章。

下一章,让我们更深入地研究turtle;学习如何画圆、点、半圆和圆弧;让事情变得丰富多彩;并编写更多有趣的迷你项目!

七、深入turtle

在前一章中,我们介绍了 Python 中的 Turtle 库。我们看着用turtle画线条和形状,我们甚至学会了如何画一个完全由线条组成的曼荼罗图案。

在这一章中,我们将更深入地了解一下turtle。您将学习如何为您的设计绘制颜色,以及绘制各种形状、大小和角度的圆形和弧形。您还将学习如何在屏幕上绘制文本。在这一章的最后,你将学会如何改变你绘画的角度,并最终画出笑脸或任何类型的图画。

自定义您的屏幕

没有颜色的图形和图像有什么用?现在,你的屏幕看起来很无聊。它有一个白色的背景,你的屏幕标题永远是“蟒蛇龟图形”。但是你可以改变这一切。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

首先,你可以用 title 方法改变你的屏幕标题,但是要记住一些事情。这个函数不是 t (turtle)的一部分。乌龟)。你需要以 turtle 开头,实际的包,就像这样:

turtle.title('Hello Turtle!')

你的背景颜色也是一样。您需要使用 bgcolor 方法来更改您的背景颜色,并在单引号(')或双引号(")内指定您的颜色。

我将把我的屏幕背景色改为红色。

turtle.bgcolor('red')

你想看看我们做的改动吗?看黄色箭头(我在图 7-1 中画的)。我们的标题现在写着“你好海龟!”我们的屏幕是红色的。完美!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-1

背景颜色设置为红色

尝试将您的屏幕更改为不同的颜色或标题。

你也不局限于基本的颜色。跟着这个链接: https://en.wikipedia.org/wiki/Web_colors

你会在上面找到上百种颜色的名字。让你的想象力自由驰骋!

定制您的图形

你知道如何改变屏幕的背景颜色。太好了。但是图像颜色呢?彩色笔和用颜色填充的图像是任何一幅好画的主食,不是吗?

因此,您可以更改笔的颜色(图形的轮廓)和图形的颜色(填充颜色)。如果你觉得龟(笔)的速度太慢,你也可以为你的线条设置一个尺寸,并改变它的速度。

要更改笔的颜色,请使用 pencolor 函数(按原样用所有小写字母编写函数),并给出颜色的名称作为参数(括号内的内容)。我将使用上一节中我给你链接的颜色表中的一种颜色。

同样,要更改填充颜色,请使用 fill color 函数。您可以使用 pensize 函数增加笔的大小(线条的粗细),并给出一个数字作为参数。指定一个大于 2 的数字才能真正看出差异,因为 1 是默认的钢笔大小。此外,您可以使用速度功能来提高笔的速度。默认的速度值是 1,所以给出比这个值更大的值,你会看到一个变化。

让我们应用所有这些,看看结果。

import turtle
s = turtle.getscreen()
t = turtle.Turtle()
turtle.title('Hello Turtle!')
turtle.bgcolor('DarkOrchid')
t.pencolor('Salmon')
t.fillcolor('Chartreuse')
t.pensize(5)
t.speed(7)
t.goto(0,100)
t.goto(100,100)
t.goto(100,0)
t.home()

好吧。我已经指定了背景颜色为“暗兰”,钢笔颜色为“鲑鱼”,填充颜色为“黄绿色”,钢笔大小为 5,速度为 7。我还用 goto 画了一个正方形。来看看有没有效果(图 7-2 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-2

设置速度、大小、笔色和背景色

这在一定程度上起了作用。我的笔画得太快了,这次没看到它画(真扫兴)。线条粗,笔色确实是三文鱼色,但是填充色在哪里?

那是因为 Turtle 希望你指明你希望填充开始和结束的时间,这样它就不会不小心填充了不该填充的东西(就像只是两条线连接在一个点上)。

当希望填充开始时,需要使用 begin_fill()方法,当希望填充结束时,需要使用 end_fill()方法。

因此,在我输入了更改颜色、大小和速度所需的代码行之后,这就是我在绘制形状时要做的事情:

t.begin_fill()
t.goto(0,100)
t.goto(100,100)
t.goto(100,0)
t.home()
t.end_fill()

现在,当我运行我的程序时,我会得到这个(图 7-3 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-3

设置矩形的填充颜色

是的,有效!

此外,您可以使用快捷方式进行格式化。您可以不使用两行代码来指定钢笔和填充颜色,而是使用一行代码,如下所示:

t.color('Salmon','Chartreuse')

第一个值用于 pencolor,第二个值用于 fillcolor。

或者,更好的是,您可以对所有四个格式选项使用一行,如下所示:

t.pen(pencolor='Salmon', fillcolor="Chartreuse", pensize=5, speed=7)

请注意,您不必将数字放在报价中。当您在脚本中使用前面的代码行时,您会注意到结果根本没有改变。

您可以根据自己的需要省略这些参数中的任何一个(pencolor='Salmon '是一个参数)。

在我们结束这一部分之前,我想让你尝试一下。我希望您将速度的值指定为 0。你认为会发生什么?海龟会以一只真正的海龟的速度开始画我们的正方形吗?还是会惊喜?试试看!外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

没有线条的形状

到目前为止我们一直在看画线,但是如果你想画圆呢?这也有一个预定义的函数。它叫做“圆”,你必须给出半径,作为括号内的自变量。半径基本上就是圆的大小。

让我们试一个,好吗?

s = turtle.getscreen()
t = turtle.Turtle()
t.circle(100)

我一直保持简单。运行前面的代码,你会得到这个(图 7-4 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-4

画一个圆-逆时针方向

正如你所看到的,turtle 从默认的 0,0 位置开始逆时针方向(向左)画圆,所以圆被画在 0,0 位置的上方。

如果我给半径一个负值,它会顺时针方向画,也就是在 0,0 位置的下面。让我们试试。

t.circle(-100)

运行上面几行代码,你会得到这个(图 7-5 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-5

画一个圆-顺时针方向

你可以使用你在你的圆的直线上使用的相同的颜色和尺寸选项。

作为一个小活动,我想让你用不同的颜色画出不同颜色的圆圈,看看你得到了什么。

你可以用“点”功能画一个点。它只是一个使用钢笔颜色填充自身的填充圆,或者您可以在第二个参数中给出一个首选颜色。

t.dot(100, 'Salmon')

运行前面的代码,你会得到这个(图 7-6 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-6

画彩色圆点

你注意到什么了吗?我们的圆比我们的点大得多。这是因为我们在点函数中给出的值实际上是直径,而不是半径。所以,你的圆,有相同的值,将会是你的点的两倍大。

现在,让我们画一个弧线!弧线是圆的一部分,不是吗?所以,我们还是要用 circle 函数,但是我们要添加更多的参数,让 turtle 知道它应该只画圆(弧)的一部分。

你知道天使是怎么工作的,不是吗?(图 7-7

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-7

圆中的角

360 度构成一个圆,所以如果你想要一个半圆,你只需要 180 度。要做四分之一圆(弧),需要 90 度。我们现在要做一个半圆。

t.circle(100,180)

运行前面的代码,你会得到这个(图 7-8 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-8

画一个半彩色

当你给定的值为-100,180 时,你会得到相同的弧线,但是在下面。给定 100°、–180°,您将看到第一个弧的镜像,给定–100°、–180°,您将看到相同的镜像,但在 0,0°位置下方。自己试试看吧!

如果你给的角度是 90 度,你会画出四分之一圆。你为什么不试着改变角度来得到不同大小的弧线呢?不要只停留在 90 或者 180。你有 0 到 360 度的角度可以选择。玩得开心!外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

更多选择!

对于海龟 ??,我们有更多的选择,但是因为我们在这一章中只讨论了基础知识,所以在我们继续讨论项目之前,我只讨论几个。有时,您可能想要在屏幕上绘制多个形状或图形,并且它们可能位于不同的位置。因此,您需要一种方法来将笔移动到新位置,而不在移动中绘制任何内容。移动后,您的笔应该会再次开始绘图。penup 和 pendown 方法(都是小写字母)可以帮助您做到这一点。

当你给你的海龟下“笔”命令时,你是在让它把笔从屏幕上拿开。它将不再绘制,但它将根据您的前进、后退或转到命令移动位置。命令“pendown”的作用正好相反。如果你想让你的笔再画一次,给它 pendown 命令。仅当 penup 命令有效时,此命令才起作用。

此外,您可以在程序完成图形绘制后使用 hideturtle 函数来隐藏屏幕上的乌龟。我相信你知道这个方法后会很欣慰。我知道我是。那些海龟在我的照片上看起来不太好!

我知道我刚刚向你扔了一堆随机的方法,你可能会感到困惑。那么,我们为什么不把刚刚学到的东西拿来测试一下呢?让我们先画一个正方形,然后画一个圆形,在屏幕的不同边上,把乌龟藏在最后,好吗?

  1. 我将在启动程序时使用“penup”(在我像往常一样设置 turtle 之后),然后将笔发送到位置(–200,200)。一旦我的笔移动了,我就要指定 pendown,因为接下来我要画我的正方形。

    import turtle
    s = turtle.getscreen()
    t = turtle.Turtle()
    t.penup()
    t.goto(-200,200)
    t.pendown()
    
    
  2. 然后,我将我的正方形的填充颜色设置为蓝色。

  3. 接下来,我将使用常见的代码行来绘制我的正方形。

    #Draw the square
    t.begin_fill()
    t.goto(-100,200)
    t.goto(-100,100)
    t.goto(-200,100)
    t.goto(-200,200)
    t.end_fill()
    
    
  4. 一旦画出,我需要再次改变位置来画出我的圆。因此,再次暂停,转到(200,–200),它在屏幕的另一侧,然后暂停。

    #Change positions again
    t.penup()
    t.goto(200,-200)
    t.pendown()
    
    
  5. 我将我的圆的填充颜色设置为红色。

t.fillcolor('blue')

  1. Then, I’m going to draw a 50-point radius circle.

    #Draw the circle
    t.begin_fill()
    t.circle(50)
    t.end_fill()
    
    

    就这样!我们在屏幕的相对两侧有两个形状!外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  2. 最后,我将使用 hideturtle()函数来隐藏乌龟(否则它仍会显示在圆圈上)。

t.fillcolor('red')

t.hideturtle()

当你运行程序时,你会得到这个(图 7-9 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-9

隐藏“t”形海龟

  1. 这就是你会发现事情有点不同的地方。如果我只是用 t.hideturtle(),那么我就只隐藏其中一只乌龟(你为什么不画出来看看?).但是你一定注意到有两只乌龟。有一个在原始位置(0,0),它属于 turtle 包本身,还有一个(预定义函数 Turtle()的 t)进行绘制。

所以,我们需要 hideturtle()重复两次。我们已经为“t”编写了 hideturtle()。让我们为完整的“海龟”包再写一个。

turtle.hideturtle()

一旦我添加了前面的代码行,让我们再次运行脚本(图 7-10 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-10

隐藏“海龟”海龟

看那个!屏幕中央的乌龟也消失了。是啊!

在屏幕上绘制文本

到目前为止,我们已经绘制了各种各样的图形,但是没有一幅图像是完整的,没有一点文字,是吗?这也很简单。你想看看吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

要编写一个简单的文本,只需使用turtle的 write 方法,指定想要显示的文本,就像这样:

import turtle
s = turtle.getscreen()
t = turtle.Turtle()
t.write('Hello there!')

运行它,你会得到这个(图 7-11 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-11

在屏幕上绘制文本

那看起来像鸡肉涂鸦。嗷!我们能以任何方式操纵这段文字吗?没错。

让我们先把文本放在某个地方。

t.penup()
t.goto(200,200)
t.pendown()

现在,让我们再画一次,但有一点小小的变化:

t.write('Hello there!', move=True)

默认情况下,move 参数为 False。如果你使它为真,你会看到正在绘制的文本下面的箭头,就像这样(图 7-12 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-12

在不同的位置绘制文本

你现在可能看不出太大的区别,因为文本太小太短了。

还是太小了!让我们增加一些风格,好吗?你知道你可以在你的文本上使用不同的字体风格,不是吗?有 Arial、Calibri、Times New Roman 等一大堆类似的款式。简单的谷歌搜索会给你一个列表。

我要做我的乔治亚。但这还没有结束。我也可以增加或减少字体大小和改变字体类型。让我们一起玩吧!

让我们再次改变位置,为我们将要创建的“大”文本腾出空间:

t.penup()
t.goto(-200,200)
t.pendown()

x 位置现在是–200,而不是 200。

现在,让我们画课文。

t.write('Hello there!', move=True, font=('Georgia',40,'normal'))

你注意到上面代码中的一些东西了吗?我已经提到了“字体”下的所有样式,它们都在组合括号内。另外,字体样式(’ Georgia ‘)和类型(’ normal ')在引号内(可以是单引号或双引号)。让我们运行上面的代码,我们会得到这个(图 7-13 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-13

格式化文本

您可以使用 pencolor 工具更改文本的颜色。

t.pencolor('Red')

您还可以将文本加粗、斜体和下划线(或这三种中的任意一种),方法是将它们作为值与其余字体值一起包含,如下所示:

t.write('Hello there!', move=True, font=('Georgia',40,'normal','bold','italic','underline'))

运行前面的代码,你会得到这个(图 7-14 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-14

更改文本的颜色

看起来不错!外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

迷你项目-正方形内的圆圈

这将是一个简单的项目。在这个项目中,我们将在一个正方形内画一个圆:

  1. 我们先设置一下 turtle。我没有在这个程序中设置速度,但是你可以这样做。

    import turtle
    s = turtle.getscreen()
    t = turtle.Turtle()
    
    
  2. 接下来,我将正方形的填充颜色设置为“红色”,钢笔大小设置为 5。我要先画正方形,然后画里面的圆。

    #Set the color and pen size for the square
    t.fillcolor('Red')
    t.pensize(5)
    
    
  3. 让我们现在画正方形。我将首先转到-100,-100 的位置,这样我可以围绕屏幕中心(0,0)画圆。这样,我可以围绕同一个中心点画圆。

    #Draw the square
    t.penup()
    t.goto(-100,-100)
    t.pendown()
    t.begin_fill()
    t.goto(-100,100)
    t.goto(100,100)
    t.goto(100,-100)
    t.goto(-100,-100)
    t.end_fill()
    
    
  4. 现在,为了将圆的中心设置为 0,0,我要求我的笔移动到位置 0,-100,所以当我从这个点逆时针方向画一个 100 点的半径时,中心将是 0,0。我已经将圆形的填充颜色设置为“蓝色”。

    #Set position so the circle's center is 0,0
    t.penup()
    t.goto(0,-100)
    t.pendown()
    #Draw the circle
    #Color and size
    t.fillcolor('Blue')
    #Circle
    t.begin_fill()
    t.circle(100)
    t.end_fill()
    
    
  5. 最后,让我们把乌龟藏起来。

    t.hideturtle()
    turtle.hideturtle()
    
    

现在,让我们运行整个代码,看看我们是否得到了我们想要的(图 7-15 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-15

在正方形内画圈

哇哦!:d

更改绘图方向

到目前为止,改变方向的唯一方法是使用 right()和 left()方法。但是,在创建圆弧时,您可能需要其他东西来改变笔的角度,以便您可以将圆弧放置在您想要的任何位置。想画眉毛怎么办?还是侧身一笑?

Turtle 为你提供了 setheading()方法来做到这一点。我们先来看看什么是标题。heading()方法给出了笔在特定时间的角度。

import turtle
s = turtle.getscreen()
t = turtle.Turtle()
print(t.heading())

当我运行前面的代码时,我得到这样的结果:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\drawTurtle.py
0.0

现在,笔处于 0°的角度,这意味着它将在水平方向上绘制。但是用 setheading(),我可以改变角度。

也许,让我们把它做成 90 度。只要提到括号内的角度,就可以了。

t.setheading(90)

现在让我们检查航向。

print(t.heading())

运行前面的代码,您将得到这样的结果:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\drawTurtle.py
90.0

很好,航向是 90 度。这对我们意味着什么?我们划一条线检查一下好吗?

t.pensize(5)
t.forward(100)

当我们运行前面的代码行时,我们会得到这个(图 7-16 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-16

将航向设置为 90 度

看那个!它向上画了一条线,所以当航向为 90 度时,笔指向上方。你已经知道了每个角度的位置,所以你可以用 setheading()来猜测你的笔将会指向哪个角度,但是让我们用一个小程序来演示一下,好吗?我们正在重新开始,因此请打开一个新脚本或清除您当前使用的脚本。

  1. 让我从设置海龟开始。我要打印当前的航向(程序开始运行时为 0 度,指向右边)。我还增加了笔的大小为 5,速度为 5。

    import turtle
    s = turtle.getscreen()
    t = turtle.Turtle()
    print(t.heading())
    t.pensize(5)
    t.speed(5)
    
    
  2. 现在,我要让笔在当前度数上向前画 100 点。一旦画好,我将使用 heading()方法让笔写出当前的度数。然后让我们提起笔,回到(0,0)重新开始。

    #0 degrees
    t.forward(100)
    t.write(t.heading())
    t.penup()
    t.home()
    t.pendown()
    
    
  3. 现在,让我们改变方向为 90 度(向上),向前画,重复前面的动作。

    #90 degrees
    t.setheading(90)
    t.forward(100)
    t.write(t.heading())
    t.penup()
    t.home()
    t.pendown()
    
    
  4. 现在,180 度(指向左边)。

    #180 degrees
    t.setheading(180)
    t.forward(100)
    t.write(t.heading())
    t.penup()
    t.home()
    t.pendown()
    
    
  5. 最后 270 度(指向下方)。

    #270 degrees
    t.setheading(270)
    t.forward(100)
    t.write(t.heading())
    Finally, let’s hide all the turtles.
    t.hideturtle()
    turtle.hideturtle()
    
    

运行前面的代码,你会得到这个(图 7-17 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-17

设定航向的角度图

你明白使用 setheading()的意义了吗?你可以把你的角度调到任何你想要的角度。现在,我们刚刚把它设置成画垂直线或水平线。不如换个角度看看有什么收获?

迷你项目–笑脸

在这个项目中,让我们更进一步,好吗?让我们画一个笑脸!

  1. 我已经设置好了turtle套装。如果你喜欢,你可以改变速度。

    import turtle
    s = turtle.getscreen()
    t = turtle.Turtle()
    
    
  2. 接下来,我让笔移动到 0–100 的位置,这样我就可以画一个圆,这是我们的脸,圆心在 0,0。这将让我更好地计算眼睛、鼻子和嘴巴。

    #Let's draw a smiley
    #Go to the position
    t.penup()
    t.goto(0,-100)
    t.pendown()
    
    
  3. 现在,让我们画这张脸。填充颜色将是黄色,钢笔大小将是 5,圆的半径将是 100 点。

    #Draw the face
    #Color and size
    t.fillcolor('yellow')
    t.pensize(5)
    #Circle
    t.begin_fill()
    t.circle(100)
    t.end_fill()
    
    
  4. 接下来,我要画眼睛。我在反复试验的基础上设定了位置。你可以在你的程序中使用相同的或者改变位置来看看你得到了什么并且创建你自己的(我推荐这样做)。

我要让我的笔去位置–40,30 画左眼,画一个直径 30 的黑点。

  1. 然后,到位置 40,30(同一水平线,X 值相反)画右眼,同样是直径 30 的点。

    #Second eye
    t.penup()
    t.goto(40,30)
    t.pendown()
    t.dot(30)
    
    
  2. 接下来,我们来画鼻子。这就是圆心在 0,0 的地方,因为我们的笑脸的鼻子将从 0,0 开始。让我们画一条从 0,0 到 0,–30 的直线。

    #Draw the nose
    t.penup()
    t.goto(0,0)
    t.pendown()
    t.goto(0,-30)
    
    
  3. 最后,棘手的部分。让我们画出微笑。我们要让乌龟走到第一只眼睛的 x 位置,也就是–40,但是 y 位置也是–40。同样,我是在反复试验后找到这个值的,最终得到了一个我想要的结果。自己试试!外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    #Draw the smile
    #Go to the x position of the first eye but a different y position
    t.penup()
    t.goto(-40,-40)
    t.pendown()
    
    
  4. 微笑是一个半圆,不是吗?但是,如果你尝试像现在这样画一个半圆,你会得到一个倾斜的微笑,而不是我们在笑脸上看到的唯一微笑。这就是 setheading 的用武之地。我们需要改变笔的角度,这样我们就可以按照我们想要的角度画出半圆。让我们将角度更改为–60。不要迷茫!这与将角度设置为 120°是一样的(两者都可以使用)。

    Next, let’s draw a semi-circle with the angle 120, so it’s not exactly a semi-circle, but not a quarter circle either – something in between.

    #Change the direction of the pen (turtle)
    t.setheading(-60)
    t.circle(40,120)
    
    
  5. 最后,让我们藏起我们的乌龟!

    #Finally, hide the turtle
    t.hideturtle()
    turtle.hideturtle()
    
    
#Draw the eyes
#First eye
t.penup()
t.goto(-40,30)
t.pendown()
t.dot(30)

咻!太久了。现在我们要运行代码并检查我们的努力是否有成果吗?(图 7-18 )

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7-18

笑脸

耶!那是一个可爱的小笑脸!为什么不试着创造不同的表情符号呢?或许是一个悲伤的笑脸?皱眉头,还是大笑?你有你需要的工具(goto,setheading 等。)到现在创造任何形象,不仅仅是脸!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

摘要

在这一章中,我们深入探讨了 Python Turtle 模块。我们学会了如何使用颜色,画弧线、圆圈和圆点,并控制它们的方向和大小,最后,我们学会了如何在屏幕上绘制文本。

在下一章,让我们深入研究字符串,如何创建和使用它们,以及 Python 为您配备的各种预定义的字符串方法,最后,让我们用它们来制造一些魔法吧!

八、玩转字母和单词

在前几章中,我们暂时停止了 Python 基础知识的学习,我们学习了所有关于 Turtle 的知识,并使用它来绘制直线、由直线、圆、曲线甚至文本组成的形状。我们用一堆酷炫多彩的迷你项目完成了这一章。

在本章中,我们将回顾 Python 的基础知识,了解字符串、它们是什么、如何创建它们、如何使用 Python 中各种可用的预定义函数来操作它们,以及从程序用户那里获得直接输入以使您的项目更加动态。像往常一样,我们将以一些迷你项目来结束这一章,但是我们现在将使用 Turtle 来使我们的项目变得丰富多彩。

什么是字符串?

弦…弦…弦。这么简单的东西用这么成熟的词。字符串就是字母和数字,串在一起。句子、短语和单词——它们都是字符串。单个字母也可以是字符串。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你还记得打印声明吗?当我们第一次开始使用 print()函数时,我们在括号内的引号中写了一些东西。是“你好!”?确实是的。

那是一根绳子。Print 语句中通常包含字符串。但这还没有结束。您也可以将字符串存储在变量中,就像处理数字一样。

现在你知道了什么是字符串,接下来让我们学习如何创建它们!这将是一个比一般章节更长的章节,所以系好安全带!我保证所有的练习和有趣的项目会弥补长度。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们创建一些字符串

我将创建一个名为 strings.py 的新脚本文件,并将其用于本章。

a = 'This is a string'

变量“a”现在有了字符串“这是一个字符串”。您也可以将字符串放在双引号内。

a = "This is a string"

现在让我们试着打印这个字符串,好吗?很简单。再次使用 print 语句,但不是在括号内键入带引号的字符串,而是键入包含该字符串的变量的名称,不带引号,如下所示:

print(a)

现在,如果您运行前面的代码,您将得到这样的结果:

RESTART: C:/Users/aarthi/AppData/Local/Programs/Python/Python38-32/strings.py
This is a string

我们成功地打印了我们的字符串。耶!

你的字符串也可以有数字,它们仍然被认为是一个字符串。引号内的任何内容都是字符串。让我将一个数字放在引号中,并使用 type()方法检查它的类型。

a = "1234"
print(type(a))

当您运行前面的代码时,您将得到这样的结果:

= RESTART: C:/Users/aarthi/AppData/Local/Programs/Python/Python38-32/strings.py
<class 'str'>

看那个!即使“a”有一个数字 1234,因为它被放在引号内,Python 自动认为它是一个字符串。

我想要一条又一条的线!

只要您坚持创建单行字符串,那么字符串就很好。如果我们需要多条线呢?我们不能一直为每个新的字符串行创建单独的打印语句。这就是我们在第一个迷你项目中所做的,我们打印了苏珊·史密斯的介绍,记得吗?那太不方便了!

为什么我们不试着在字符串格式中创建多行,看看会发生什么?

a = "This is the first line.
This is the second line.
This is the last line."

在前面的例子中,“a”有三行字符串,用双引号括起来。让我们运行它,看看会发生什么(图 8-1 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-1

带双引号的多行字符串–错误

哦哦。我甚至不能运行代码。我立即得到一个弹出窗口,显示前面的错误。我们之前写的根本不是可接受的代码。那么,如何才能创建多行字符串呢?还记得第三章的多行注释吗?我们使用了三个单引号,注释前不带空格,注释后也是一样,这样就创建了一个多行注释。

我要坦白一件事。该语法实际上是多行字符串的语法。我们只是借用它来创建一个多行注释,因为一个没有存储在变量中的多行字符串会被 Python 忽略,所以它在技术上充当了一个注释(尽管它不是)。

好了,聊够了。现在让我们创建一个多行字符串。我将复制 Susan Smith 的介绍,但是我将使用多行字符串来创建和打印它。

intro ='''Hello there!
My name is Susan Smith.
I am 9 years old.
I love puppies!'''
print(intro)

当我运行前面的代码时,我得到这样的结果:

= RESTART: C:/Users/aarthi/AppData/Local/Programs/Python/Python38-32/strings.py
Hello there!
My name is Susan Smith.
I am 9 years old.
I love puppies!

简单利落,你说呢?外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传是的!

我的字符串有引号!O:

天哪,我们的字符串有引号,我们得到一个错误!

intro =""Hello!", said Susan"

我得到了这个(图 8-2 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-2

同一个字符串中的单引号和双引号–错误

邦默

我可以改变绳子周围的引号。

intro ='"Hello!", said Susan'
print(intro)

有用吗?

= RESTART: C:/Users/aarthi/AppData/Local/Programs/Python/Python38-32/strings.py
"Hello!", said Susan

没错。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是如果我的字符串既有单引号又有双引号呢?可能是如下所示的字符串:

“那是我的泰迪熊”,苏珊说。

我不能把前面字符串中的双引号替换成单引号。我需要一种方法告诉 Python“That ’ s”中的单引号实际上是字符串的一部分,而不是代码的一部分。我们在 Python 中有一个叫做 的转义字符 ,它只是一个反斜杠,“”。您可以在作为字符串一部分的引号(单引号或双引号)前使用它,Python 会在运行代码时忽略它。

让我们试试。

intro = '"That\'s my Teddy", said Susan.'
print(intro)

运行前面的代码,我们会得到这样的结果:

= RESTART: C:/Users/aarthi/AppData/Local/Programs/Python/Python38-32/strings.py
"That's my Teddy", said Susan.

是的,有效!

让我们把两根或更多的绳子连接起来

当我们将“+”符号用于两个或多个数字时,它们被加在一起。你想看看如果你对绳子做同样的事情会发生什么吗?好吧!

我已经创建了两个变量 str1 和 str2 来保存字符串“Hello”和“there!”。我已经创建了第三个变量“string ”,并为它分配了 str1 和 str2。

str1 = 'Hello'
str2 = 'there!'
string = str1 + str2
print(string)

让我们打印字符串,看看会得到什么:

= RESTART: C:/Users/aarthi/AppData/Local/Programs/Python/Python38-32/strings.py
Hellothere!

哦,看那个。它只是把 str1 中的字符串放在 str2 中的字符串之后。真有意思。即使我们使用了加法运算符,加法也没有发生。

事实上,这种字符串操作有一个名称。叫做 字符串串联 。当你在两个或多个字符串上使用“+”时,你把它们加在一起,是的,但不是传统意义上的。你只要把它们合并在一起,按照它们被加入的顺序。

不过,我的成绩让我有些困扰。“Hellothere!”不是我想要的。我想在这些词之间留一个空格。那是那个短语的正确用法。所以,我为什么不加进去呢?

str1 = 'Hello'
str2 = 'there!'
string = str1 + " " + str2
print(string)

那很简单!我们刚刚创建了另一个只有一个空格的字符串,并将其添加到 str2 之前。让我们运行前面的代码,我们将得到这个:

= RESTART: C:/Users/aarthi/AppData/Local/Programs/Python/Python38-32/strings.py
Hello there!

现在,这看起来是正确的。因此,正如你所看到的,你可以连接两个以上的字符串,它们可以在变量中,也可以在引号中。如果放在引号内,即使是空格也是字符串。

印刷中的串联()

您也可以在 print()中应用字符串连接。

a = 'Hi!'
print('Susan says, "' + a + '"')

看起来是不是有点复杂?别担心。“我已经用逗号、空格和双引号将字符串的第一部分括起来了,”Susan 说。字符串的下一部分是变量“a”中的内容,所以我将这两个字符串连接起来。字符串的最后一部分是右双引号,它也包含在单引号中。或者,我可以只使用双引号,并使用转义字符来区分字符串的双引号。

如果我运行前面的代码,我会得到这样的结果:

= RESTART: C:/Users/aarthi/AppData/Local/Programs/Python/Python38-32/strings.py
Susan says, "Hi!"

做得好!

空字符串

所有这些字符串操作让我想起了一些事情!有一种叫做 的空字符串 ,在这里你不需要在引号之间输入任何东西,甚至连一个空格都不要输入。

a = ''

在前面的例子中,变量“a”存储一个空字符串。如果你把它打印出来,你将在输出中得不到任何东西(甚至没有一个空格)。试试看!外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

访问字符串中的字符

我要在《弦》里给大家介绍一个令人瞠目结舌的话题!您实际上可以访问、检索甚至修改字符串中的特定字符(字母)。这有多酷?您可以使用此功能在字符级别对字符串进行更改。

a = 'Hello there!'

看下面的字符串索引图。字符串中的每个字符都有一个索引。事实上,它们有两个指数,一个正指数和一个等价的负指数。您可以通过使用这些索引来访问这些字符。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-3

字符串索引图表

如图 8-3 所示,正指数从 0 开始,数值向左增加。负指数从–1 的最后一个位置开始。空格有索引,感叹号也有。这不仅仅是为了字母/数字。

好吧,这很好,但是我们如何访问这些索引呢?简单!键入字符串的名称,打开和关闭方括号,并在括号内键入相关的索引,就可以开始了。

如你所见,索引从 0 开始,最后一个是字符串长度减 1。字符串中的空格也会占用索引。

所以,如果我想检索字符串的第一个字符“H”,我会这样做:

print(a[0])

当您运行前面的代码时,您会看到:

= RESTART: C:/Users/aarthi/AppData/Local/Programs/Python/Python38-32/strings.py
H

完美!

现在,如果我要检索字符串的最后一个字符,我会首先计算字符串的长度。在这种情况下,长度为 12,包括空格。现在让我们减去 1,如下所示:

print(a[12-1])

当您运行程序时,您的解释器(空闲)将自动计算得出 11 的索引。结果是这样的:

= RESTART: C:/Users/aarthi/AppData/Local/Programs/Python/Python38-32/strings.py
!

是的,没错。

负指数

正如您在前面的图像中看到的,字符串中的相同字符有正索引和负索引。让我们尝试访问“o”,它位于正索引 4(字符串中的第五个位置)和负索引位置–8。

print(a[-8])

运行前面的代码,您将得到这样的结果:

= RESTART: C:/Users/aarthi/AppData/Local/Programs/Python/Python38-32/strings.py
O

效果非常好!

因此,第一个字符将位于[–12],最后一个字符将位于[–1]。

切割字符串的一部分

你可以提取字符串的一部分,而不仅仅是一个字符。那就叫 切片

切片遵循与字符提取相同的模式,但唯一的区别是您必须在方括号内给出一个范围。如果我想提取一个字符串中的前四个字符,我会给定范围为 0:4,因为第一个字符的索引是 0,第四个字符的索引是 3。在切片中,范围的结尾(在我们的例子中是 4)将被省略。因此,是 0:4 而不是 0:3。让我们试试看能得到什么!

a = 'Hello there!'
print(a[0:4])

运行前面的代码,您将得到这样的结果:

= RESTART: C:/Users/aarthi/AppData/Local/Programs/Python/Python38-32/strings.py
Hell

是的,我们拿到了!

如果我们想要最后四个字符呢?你可以用两种方法来做这件事。最后一个字符的正索引是 11,倒数第四个字符的正索引是 8,所以我们可以这样做:

print(a[8:12])

运行前面的代码,我们会得到这样的结果:

= RESTART: C:/Users/aarthi/AppData/Local/Programs/Python/Python38-32/strings.py
ere!

太好了。目前为止一切顺利。但是负指数呢?最后一个字符的负索引是–1,倒数第四个字符的负索引是–4,因此我们可以改为执行以下操作:

print(a[-4:-1])

注意,我们首先给出了–4(倒数第四个字符),它将被包含在内。但是–1 不包括在内,对吗?这就是语法的工作原理,这是最后一个索引。

好了,让我们运行前面的代码,看看它是否有效:

= RESTART: C:/Users/aarthi/AppData/Local/Programs/Python/Python38-32/strings.py
Ere

啊好吧,它不工作。我们少了一个“!”。☹

我们能做什么?嗯,在这种情况下,从一个点开始,需要字符串的其余部分(字符串末尾的倒数第四个位置),您可以将范围内的最后一个数字留空,就像这样:

print(a[-4:])

运行前面的代码,您将得到这样的结果:

= RESTART: C:/Users/aarthi/AppData/Local/Programs/Python/Python38-32/strings.py
ere!

完美!

字符串方法——字符串的魔力!

就像处理数字一样(第五章第五章),你有很多预定义的方法来帮助你处理数字。有些看起来很神奇!你会明白的。

在 Python 官方文档中有一个完整的 Python 字符串方法列表,并解释了它们的作用。下面是链接: https://docs.python.org/2.5/lib/string-methods.html

以后可以参考前面的文档。我将试着涵盖大多数重要的方法,虽然我不能涵盖每一个方法,因为那样会使这一章太长。不过不要担心。一旦你学会了一些,你就能破译其余的是如何工作的。

好吧,让我们开始吧!

为什么我们不从简单的开始呢?len()方法用于查找字符串的长度。

该方法的语法如下:len(string)

a = 'Hello there!'
print(len(a))

当您运行前面的代码时,您将得到这样的结果:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
12

计算字符串中的字符数(包括空格),您会注意到它的长度确实是 12。

大写和小写

好的,现在让我们看看其他的方法。“capitalize()”方法将字符串中的第一个单词大写。它不会改变原来的字符串。它只是创建了一个副本,你可以把它赋给一个新的变量或者打印出来。

语法是这样的:string.capitalize()。

“字符串”可以是引号内的确切字符串,也可以是存储该字符串的变量。

a = 'i am here'
print(a.capitalize())
print(a)

当您运行前面的代码时,您将得到这样的结果:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
I am here
i am here

看,大写并不影响原来的字符串。

同样,可以使用 upper()方法将字符串中的所有字符(字母)大写。这也创建了一个副本。所有的字符串方法都创建副本。他们很少对原始字符串进行更改。

a = 'i am here'
print(a.upper())

当您运行前面的代码时,您将得到这样的结果:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
I AM HERE

同样,您可以使用 lower()方法将字符串中所有大写字母更改为小写字母。

a = 'I AM here'
print(a.lower())

当您运行前面的代码时,您将得到这样的结果:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
i am here

你注意到有些字母已经很小了吗?这种方法不会改变这些。

不像在 capital 中那样只将整个字符串的第一个字母大写,实际上可以使用 title()方法将字符串中每个单词的第一个字母都大写。

 a = 'i love chimpanzies!'
print(a.title())

运行前面的代码,您将得到这样的结果:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
I Love Chimpanzies!

杂项方法

使用 count 方法,可以返回单词、字母或短语在字符串中出现的次数。

语法是string.count('word')

这个方法是区分大小写的,就像 Python 中的其他方法一样,所以如果你想要“word”,不要把它打成“Word”。

为了测试这个方法,我创建了一个多行字符串,就像我教你的那样:

a = '''Susan is a lovely girl.
Barky is Susan's best friend.
Barky plays with Susan'''

让我们数一数在前一串中“Susan”和“Barky”被提到了多少次,好吗?

print(a.count('Susan'))
print(a.count('Barky'))

结果是这样的:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
3
2

哇哦!外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以用 strip()方法修剪字符串中多余的空格。

a = '         Hello there!          '
print(a.strip())

当您运行前面的代码时,您将得到这样的结果:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
Hello there!

完全没有空格!

同样的方法有左侧和驾驶侧版本。rstrip()方法只去除字符串右侧的空白。lstrip()方法对字符串的左边做同样的事情。你为什么不试试它们,看看它们是否有效?

还记得我们刚刚用过的那根大绳子吗?如果我们弄错了呢?如果我们要谈论罗尼而不是苏珊呢?我们需要交换他们的名字,对吗?您可以使用 replace 方法来实现这一点。语法是string.replace('original','replaced')

a = '''Susan is a lovely girl.
Barky is Susan's best friend.
Barky plays with Susan'''
print(a.replace('Susan','Ronny'))

让我们运行前面的代码,我们将得到这个:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
Ronny is a lovely girl.
Barky is Ronny's best friend.
Barky plays with Ronny

看,现在是罗尼了!

我们还可以找到某个单词、字母或短语在字符串中的起始位置。记住,字符串位置从 0 开始,所以你总是落后一个计数。

a = "I love coding. I have fun with coding"
print(a.find('coding'))

运行前面的代码,您将得到这样的结果:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
7

计算字符数,包括空格,您会注意到第一次出现的“编码”从位置 8 开始(因此对于 Python 字符串是 7)。

如果找不到这个短语呢?

print(a.find('Coding'))

你知道“编码”不同于 Python 中的“编码”,所以它不会出现在字符串中。

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
-1

哎呀,结果是 a–1。

index()方法与 find()方法完全一样。唯一的区别是,如果没有找到短语,它将返回一个错误,而不是–1。为什么不尝试用 index()做同样的事情呢?

使用 split 方法,您可以将一个字符串拆分成一个列表。我们将在以后的课程中讨论什么是列表。现在,只需要知道列表中包含多个值,用逗号分隔。

为了使用 split 方法,您需要给出一个分隔符。比如说我想把字符串按单词拆开。然后我会给出一个空格作为分隔符。

a = "I love coding."
print(a.split(' '))

当您运行前面的代码时,您将得到这样的结果:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
['I', 'love', 'coding.']

这是一个列表,它包含我们的字符串,用单词分隔。

真的吗?假的?

在我进一步讨论这些方法之前,我想教你们 Python 或任何编程语言中真和假的概念。很简单。如果某事为真,那么你的程序将返回“真”。如果一个条件为假,那么你将得到“假”。就这样。

例如,假设我想看看我的字符串中是否有单词“best friend”。我很想知道巴克利是不是罗尼最好的朋友。

我必须使用“in”关键字。关键字是在 Python 中做一些事情的特殊单词。“in”关键字检查我们想要查找的单词或短语是否在我们的字符串中。

string = "Barky is Ronny's best friend."
print('best friend' in string)

运行前面的代码,您将得到这样的结果:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
True

但是如你所知,Python 是区分大小写的。所以,“闺蜜”和“闺蜜”或其他任何版本都不一样。所以照原样用词,好吗?

让我们看另一个例子,好吗?

print('Python' in 'Python is fun')

当您运行前面的代码时,您将得到 True。

但是如果你要求这个:

print('Coding' in 'Python is fun')

你将得到 False,因为“编码”不在字符串“Python 是有趣的”中。

同样,你可以在你的字符串中测试很多其他的字符串。

你想看看你的字符串是否既有字母又有数字吗?使用 isalnum()方法。只有当字符串中的每个单词都包含字母和数字时,它才返回 true,如下所示:

a = 'number123 number253'
print(a.isalnum())

前面的代码将返回 True,而下面的代码:

a = 'This is a number: 123'
print(a.isalnum())

将返回 False,因为大多数单词只有字母而没有字母数字。

如果字符串中的每个字符都是字母(没有数字或特殊字符),isalpha()方法返回 true。如果字符串中的每个字符都是数字(没有字母或特殊字符),isnumeric()方法返回 true。

如果所有字符都很小,Islower()返回 true。如果每个字符都大写,Isupper()返回 true。

我希望你在使用这些方法的同时给出不同的可能性,并探索它们是如何真正发挥作用的。成交?

你可以参考我在“字符串方法——字符串的魔力”中给出的链接部分获得其余的方法,并在您的实验中使用它们。玩得开心!😛

嘿,我知道你在想什么。

“天哪,方法真多。我怎么会记得他们所有人?”

你为什么要这么做?我会告诉你一个更大的秘密…嘘

程序员不会一开始就试图去记忆语法。这就是谷歌的作用。他们只是创造了很多。他们解决了很多难题,创造了有趣的项目,并在遇到困难时搜索语法。随着时间的推移,这些语法会被牢牢记住,因为他们用得太多了。

所以,忘掉记忆吧。用这本书作为参考。解开谜题,用你的技巧创建迷你项目,并将大项目带到下一个级别,当你完成所有这些时,你将成为 Python 的大师。开心就好。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

字符串格式

打印声明是枯燥和有限的。☹:你不能用你想要的方式格式化它,如果你尝试,你会淹没在一堆引号中。但是更重要的是,你不能用字符串打印数字(即使它们在变量中)!O:

让我证明给你看。

a = 4
b = 5
sum = a + b

所以现在,我想打印下面的语句:4 + 5 = 9,我想使用变量名而不是实际值来打印它,以保持动态。我也许可以改变一个变量的值,我的打印语句也会自动改变。

我们应该可以用之前学过的连接来实现,对吗?让我们试试。

print('The answer is: ' + a + ' + ' + b + ' = ' + sum)

理想情况下,前面的代码应该会产生以下结果:

答案是:4 + 5 = 9

但这是我们得到的:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
Traceback (most recent call last):
  File "C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py", line 4, in <module>
    print('The answer is: ' + a + ' + ' + b + ' = ' + sum)
TypeError: can only concatenate str (not "int") to str

从本质上讲,这个错误说的是你只能把一个字符串(引号内的任何东西)和一个字符串连接起来,而包含数字(不带引号)的变量不是字符串。

这句话对我来说不仅很难写,而且令人困惑,它根本不起作用。

这就是格式化的由来。您可以设置打印报表的格式。只需将{}(没有空格)放在变量出现的地方,稍后可以使用 format 方法填充它们。

先说简单的。

a = 'apple'

假设我想打印’这是一个苹果’,其中值’苹果’来自变量 a。

我会键入整个字符串,但将{}放在“apple”的位置,如下所示:

'This is an {}'

接下来,我将标记 format 方法并将变量“a”放在括号内。Python 会自动用变量中的值替换{}。

a = 'apple'
print('This is an {}'.format(a))

当您运行前面的代码时,您将得到这样的结果:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
This is an apple

很简单,不是吗?你再也不用摆弄空格和引号了,呼呼!

我们现在来看一个更复杂的例子,好吗?

a = 'Apples'
b = 'Bananas'

如果我想印“苹果和香蕉有益健康”,我会这样做:

print('{} and {} are good for your health'.format(a,b))

运行前面的代码,您将得到这样的结果:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
Apples and Bananas are good for your health

你注意到我是如何在格式中用逗号分隔变量的吗?

您可以将字符串的第一部分放在一个变量中使用,就像这样:

a = 'Apples'
b = 'Bananas'
s = '{} and {} are good for your health'
print(s.format(a,b))

或者,如果我想先打印香蕉,然后打印苹果,但我不想改变它们的排列顺序,我可以在要打印的字符串中标记它们,就像这样:

s = '{1} and {0} are good for your health'
print(s.format(a,b))

Python 中的索引是从 0 开始的,还记得吗?

运行前面的代码,您将得到这样的结果:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
Bananas and Apples are good for your health

好吧。既然我们是使用 format()设计印刷品的专家,为什么不回到我们最初的问题呢?

a = 4
b = 5
sum = a + b

让我们格式化我们的字符串!

print('The answer is: {} + {} = {}'.format(a,b,sum))

运行前面的代码,您将得到这样的结果:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
The answer is: 4 + 5 = 9

是的!简单整洁,就应该这样。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从用户那里获得输入(开始自动化)

到目前为止,我们只是固定了变量的值。那太无聊了!我想要自动化。编程就是这样的,不是吗?

我希望每次运行加法程序时给出一个不同的数字,每次打印消息时给出一个不同的字符串。这就是输入。用户或运行程序的人给出可在程序中使用的值以获得结果。这些值被称为输入。

在 Python 中,可以使用 input()方法获取输入。很简单,不是吗?

当你运行一个程序时,它会问你要值,然后等你给它值。这就是所谓的提示。

我打算从简单的开始。我会收到一条可以立即打印的消息。在请求输入时包含一条信息总是好的,这样用户就知道他们期望给出什么值。您可以将消息包含在输入的括号内的引号中。

message = input('Enter your message: ')
print('Here is your message: ' + message)

我提示用户输入一条消息,我在变量“message”中收到了同样的消息。然后我把它打印出来了。很简单。

当我运行前面的代码时,我首先得到的是:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
Enter your message:

程序在这个阶段停止了,因为它在等我的消息。

现在让我输入:

Enter your message: I love Python!

当我按下回车键,我会得到这个:

Here is your message: I love Python!

效果非常好!我的信息以我想要的格式打印出来了。

字符串到整型或浮点型的转换

我们研究了输入,以及如何动态获取值并在程序中使用它们。计算难道不是使用动态值的最好方法之一吗?每次执行加法运算时,我都希望得到不同的数字。

让我用 input 来做同样的事情,看看它是否有效。

a = input('First number: ')
b = input('Second number: ')
sum = a + b
print('{} + {} = {}'.format(a,b,sum))

在前面的代码片段中,一切看起来都很好。应该管用吧?错了。

当我运行它时,我得到的是:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
First number: 5
Second number: 2
 5 +  2 =  5 2

我的程序提示我输入这两个数字,我输入了它们。一直到现在都很好。但是后来,事情变得不稳定了。

为什么呢?

你根本没有输入数字。当你给一个输入赋值时,你的程序认为它是一个字符串,而不是一个数字。所以,这里发生的是字符串连接,而不是加法。

我们如何让 Python 把我们的输入看成数字?当然,您需要转换它们!还记得我们如何转换不同类型的数字吗?同样,可以使用 int()方法将字符串转换为整数,或者使用 float()方法将字符串转换为浮点数。

让我们修改我们的代码:

a = input('First number: ')
#Convert 'a' into an integer and store it back in 'a'
a = int(a)
b = input('Second number: ')
#Convert 'b' into an integer and store it back in 'b'
b = int(b)
sum = a + b
print('{} + {} = {}'.format(a,b,sum))

我在代码中唯一改变的是获得每个输入后的整数转换。我已经将转换后的值存储回同一个变量中。让我们运行这段代码,看看它是否有效:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
First number: 5
Second number: 2
5 + 2 = 7

唷!现在可以用了。

迷你项目——将 乌龟 文字带到下一个层次!

这将是一个简单的项目。我们将实时输入您的用户名,并在我们的turtle屏幕上用彩色大字体打印出来:

  1. 先来设置一下我们的turtle:

    import turtle
    s = turtle.getscreen()
    t = turtle.Turtle()
    
    
  2. 接下来,让我们创建一个变量名,将用户名作为输入:

  3. 我们不需要以任何方式转换这个字符串,因为我们只是将它与另一个字符串连接起来。现在,让我们在turtle上创建我们定制的问候。在此之前,让我们创建想要打印的确切字符串,并将其赋给变量“greeting”。

name = input("What's your name? ")

  1. 现在,让我们设置笔的颜色,也许,暗紫色?让我们也将笔移动到位置–250,0,这样它就可以在屏幕的中心绘制。

    t.pencolor('DarkViolet')
    t.penup()
    t.goto(-250,0)
    t.pendown()
    
    
  2. Finally, let’s create our text.

    t.write(greeting,font=('Georgia',45,'normal','bold','italic'))
    
    

    我已经将变量“greeting”与我们需要的文本放在一起,代替了实际的文本,我还将字体样式设置为“Georgia ”,大小设置为 45,并将文本设置为粗体和斜体。我省略了 move 属性,所以它默认为“false”(文本下面没有箭头)。

  3. 最后,让我们藏起我们的乌龟:

    t.hideturtle()
    turtle.hideturtle()
    
    
greeting = 'Hi {}!'.format(name)

让我们现在运行这个程序:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
What's your name? Susan Smith

它问名字。我报出了“苏珊·史密斯”这个名字,按下回车键,瞧!(图 8-4 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-4

多彩的问候

我们有我们的问候,它看起来也很漂亮!外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

迷你项目-对着屏幕大喊大叫

我们要按照题目说的去做。让我们对着屏幕喊,好吗?哦,等等…或者屏幕会对我们大喊大叫?不管怎样,让我们大声喊叫吧!喔!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

概念很简单。我们将从用户那里得到一个字符串输入。信息将是“用不到 3 个字说出你的想法”。少于三个单词,所以我们的文本可以在一行中以足够大的字体显示。在后面的章节中,您将学习获得尽可能多的输入单词所需的工具,并确保通过腾出空间来打印它们,所以现在不要担心这个。

然后,我们将结果大写,在末尾添加两个或更多感叹号,并打印出turtle中的所有内容。简单吧?开始吧!

  1. 首先,让我们设置一下turtle包:

    import turtle
    s = turtle.getscreen()
    t = turtle.Turtle()
    
    
  2. 然后,让我们得到输入:

    message = input("Enter what's on your mind in 3 words or less: ")
    
    
  3. 最后,我们来格式化一下我们要喊的消息吧!我们的“信息”可能是小写字母。我们如何将邮件中的每个字母都转换成大写?没错。upper()方法。让我们利用这一点,并在结尾加上三个感叹号,使我们的信息更具戏剧性!

  4. 现在,我要将笔移动到–250,0,并将笔的颜色改为红色,因为没有什么比红色更能说明大喊大叫了。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    t.pencolor('Red')
    t.penup()
    t.goto(-250,0)
    t.pendown()
    
    
  5. 现在,进入节目的主要部分。让我们创建我们的turtle文本。我将使用“Arial Black”字体。字体的大小将会是 45,但是我将会停止将文本加粗。这次不用斜体。

shout = '{}!!!'.format(message.upper())

  1. 最后,让我们把乌龟藏起来。

    t.hideturtle()
    turtle.hideturtle()
    
    
t.write(shout,font=('Arial Black',45,'normal','bold'))

让我们运行一切。我的信息是“这是什么?”。让我们看看我们得到了什么:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py

用三个字或更少的话说出你的想法:这是什么?

当我按下回车键并查看我的turtle屏幕时,我得到了这个(图 8-5 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-5

对着屏幕大喊

没错。成功!

迷你项目-扭转你的名字

我要在解决这个项目的同时教你一些有趣的东西。到目前为止,我们已经看到了各种操纵琴弦的方法。在我们结束这一章之前,我们为什么不多看一个?

你知道你可以扭转你的弦吗?对,没错!完全颠倒,只有一行小小的代码。你想尝尝吗?

让我们创建一个程序,它获取用户的名字作为输入,颠倒他们的名字,并将其显示在 Turtle 屏幕上:

  1. 让我们像往常一样设置turtle

    import turtle
    s = turtle.getscreen()
    t = turtle.Turtle()
    
    
  2. 并获取用户名,将其放入变量“name”中。

  3. 现在有趣的部分来了!我们将格式化我们想要照常显示的字符串。我们创建了一个变量“reverse”来存储字符串。但是我们如何逆转呢?还记得我们过去如何使用方括号来访问单独的字符、提取字符串的一部分等等吗?还有,你还记得负指数吗?这就对了。

    如果使用以下语法,可以反转字符串:string[::–1]。这是一个双冒号,后面跟一个–1。就这么简单!外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

name = input("What's your name?")

  1. 最后,让我们将钢笔的颜色改为“金色”,将位置改为–250,0,并在屏幕上绘制反向的字符串。

    t.pencolor('Gold')
    t.penup()
    t.goto(-250,0)
    t.pendown()
    t.write(reverse,font=('Georgia',45,'normal','bold'))
    t.hideturtle()
    turtle.hideturtle()
    
    
reverse = '{}'.format(name[::-1])

让我们运行程序:

= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
What's your name? Susan Smith

现在,点击输入,你会得到这个(图 8-6 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-6

颠倒你的名字

呵呵,她的名字被颠倒了,好吧。😛

迷你项目——丰富多彩的动态数学

在数字一章中,我们不得不求助于用预定义的数字和没有颜色进行无聊的计算!☹

所以,我想在我们进入下一章之前,我们可以从数字中获得一些真正的乐趣。我们走吧。

在这个项目中,我们将对两个给定的数字进行加法、乘法、减法和除法运算。无聊,我知道!但是这一次,我们将从用户那里获得两个数字作为动态输入,并在 Turtle 中以彩色显示结果。有趣吗?我知道!

  1. 让我们先设置一下乌龟

    import turtle
    s = turtle.getscreen()
    t = turtle.Turtle()
    
    
  2. 然后,让我们得到我们将在操作中使用的第一个和第二个数字的输入。但是有一个问题!我们不能照原样使用它们。它们是字符串格式的,记得吗?所以,让我们把它们转换成整数,然后赋回给相同的变量。

    num1 = input("Enter the first number: ")
    num1 = int(num1)
    num2 = input("Enter the second number: ")
    num2 = int(num2)
    
    
  3. 现在,让我们做加法。我们将创建一个名为 display 的变量,它将保存四个操作的所有格式化字符串。

    #Addition
    add = num1 + num2
    display = "{} + {} = {}".format(num1,num2,add)
    
    
  4. 格式化后,让我们将笔放在–150,150 的位置,这样我们的绘图就与屏幕中间对齐了。然后,我们把笔的颜色改成“红色”,画出文字。

    t.penup()
    t.goto(-150,150)
    t.pendown()
    t.pencolor("Red")
    t.write(display,font=("Georgia",40,"normal","bold"))
    
    
  5. 现在做同样的减法,除了现在位置是–150,50,颜色是“蓝色”。

    #Subtraction
    sub = num1 - num2
    display = "{} - {} = {}".format(num1,num2,add)
    t.penup()
    t.goto(-150,50)
    t.pendown()
    t.pencolor("Blue")
    t.write(display,font=("Georgia",40,"normal","bold"))
    
    
  6. 对于乘法运算,位置将为–150 和–50,颜色将为“绿色”。

    #Multiplication
    mul = num1 * num2
    display = "{} * {} = {}".format(num1,num2,add)
    t.penup()
    t.goto(-150,-50)
    t.pendown()
    t.pencolor("Green")
    t.write(display,font=("Georgia",40,"normal","bold"))
    
    
  7. 对于除法运算,位置为–150 和–150,颜色为“紫色”。

    #Division
    div = num1 / num2
    display = "{} / {} = {}".format(num1,num2,add)
    t.penup()
    t.goto(-150,-150)
    t.pendown()
    t.pencolor("Violet")
    t.write(display,font=("Georgia",40,"normal","bold"))
    
    
  8. 最后,让我们把乌龟藏起来。

    t.hideturtle()
    turtle.hideturtle()
    
    
  9. 现在,让我们运行程序。它首先要求输入。我们的输入是 10 和 5。

    = RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\strings.py
    Enter the first number: 10
    Enter the second number: 5
    
    

当我们点击回车,这就是我们得到的结果(图 8-7 )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8-7

丰富多彩的动态数学

太美了!外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

摘要

在这一章中,我们学习了字符串,它们是什么,创建单行、多行和空字符串,创建带引号的字符串,连接两个或多个字符串,访问字符串中的字符,提取字符串的一部分,字符串切片,如何以不同的方式操作字符串,以及从用户那里获取输入并在我们的程序中使用它们。

在下一章,让我们看看如何命令我们的程序做我们想做的事情。我们将研究“if”语句,用“if else”和“if elif else”语句创建多个选项,等等。会很好玩的!外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值