回顾Scratch:Scratch是一种图形化编程语言,对于初学编程的人来说特别友好,能够用拖拽代码的形式快速的学习编程的基本概念,如果你还没有接触过编程,建议先简单学习下Scratch,对于后续的Python学习会很有帮助。
Python简介:Python是目前主流的编程语言之一了,一方面是由于它的语法较为简单、上手比较容易;另一方面也是因为它的开放性,有很多有趣有用的第三方模块可以供我们使用,尤其是最近火热的人工智能更是Python擅长的领域。对于青少年来说,选择Python作为代码编程的选择是非常适合的,不仅能够体验编程的乐趣,更能够为将来的C++学习奠定一个基础。
要编写Python程序,首先要往电脑中安装Python环境,不同的电脑系统适用的Python版本是不一样的,下面我们来讲解具体的安装步骤。
安装完成之后我们可以通过程序菜单找到Python,点击图标即可进入到Python的交互环境,在这里可以进行简单的计算,比如1+1回车就可以看到答案了,当然也可以进行基础的编程,比如建立一个变量a=1回车,再建立一个变量b=2回车,然后计算a+b回车,不理解这部分内容的话也不要紧,后面紧跟着我们就会开始讲解变量的知识了。另外,还有其他快捷的方式进入Python交互模式,按住windows键和R键打开运行框,然后直接输入python就可以了;还可以先输入cmd打开命令行,然后输入python,在这里还可以输入exit()回车后退出python交互模式回到普通的命令行模式。
如果要写比较复杂的程序并且想要把程序保存下来的话,用交互模式就不行了,这时候我们可以选择Python自带的IDLE,从程序菜单中找到IDLE打开,默认显示的是交互模式,但是也可以从左上角的File这里选择NewFile,也就是新创建一个文件,在这里编写的代码就可以进一步保存起来了,保存好之后可以选择Run->RunModule执行这个文件里面的程序。但是IDLE只有最基本的编辑功能,没有像自动提示、颜色高亮等高级功能,为了更方便的编写Python程序,我们还得再学习一个工具VSCode.
VSCode是一个独立的软件,可以编写各类程序,我们可以简单配置后用于编写Python程序,那么如何安装呢?
我们通过一个实际的案例来学习编程里很重要的变量的概念,案例的名字叫狗龄计算器,具体功能为:输入一只狗的实际年龄,这个计算器会告诉你对应的人类年龄,也就是相当于人的多少岁。要完成这个计算,只需要把狗的年龄乘以7。就这么简单,开始吧!我们把这个实际的项目案例分成了几个步骤来完成,这也是编程的基本思路:把大的任务拆解成一个个小的任务,然后分别来编程解决这些小任务,最终我们就完成了大的任务。对于狗龄计算器来说,我们拆分成如下几个任务:
为了实现这个任务,我们需要提示用户提供狗狗的名字,然后记住这个名字,以便在第4步中使用。为此我们要学习两个知识点:
在python中有一个向用户请求输入的功能,叫input函数。(函数的具体定义在后面的章节中会讲解,可以简单地把它想成是调用了python提供的一个功能)。下面来看具体用法:
input("请问你的狗狗叫什么名字?")`其中,input为函数的名字,代表输入的意思;调用input函数(或者说使用input功能)需要在后面跟上一对括号;括号里面的是提示用户的文字,需要放在两个引号之间。括号和引号一定要注意使用英文模式的输入法输入,python代码中最常见的错误就是把括号引号等写成了中文,你可以实际输入一下中英文的括号和逗号,感受他们的区别如果运行这段程序的话,python就会提示用户去输入一些内容,按下回车键意味着输入结束。那输入的名字去哪里了呢?这就引出了我们的第二个知识点。
变量是每种编程语言必不可少的功能,它的主要功能就是帮助我们存储一些内容以便后面使用,它的主要用法如下:
dog_name="大宝"`其中,左边的dog_name是变量的名字,中间的等号在编程中被称作赋值符号,右边的“大宝”是具体的内容。这一行代码的意思就是把变量dog_name赋值为大宝,也可以说把大宝这个名字存储到dog_name这个变量中。关于变量的名字:名字可以随意起,但是有一些基本的规则:必须是连在一起的,不能有特殊符号,不能数字开头,我们这里通过下划线把两个单词组合在一起作为我们变量的名字,当然也可以是dogname,dogName等形式
接下来我们将上面的两个知识点组合起来:首先让用户输入一个狗狗名字,然后把名字存到一个变量中。代码如下:
dog_name=input("请问你的狗狗叫什么名字?")`这样我们就完成第一个小任务了,接下来进入第二个小任务。
学会了向用户询问狗狗的名字之后,怎么实现向用户询问狗狗的年龄是不是就比较简单了呢?代码如下:
dog_age=input("请问你的狗狗几岁啦?")`现在我们已经得到狗狗的名字和年龄了,以后怎么使用它们呢,这就要用到print函数了。
print函数,也就是打印输出功能可以说是python编程中最常用的功能了,通过他我们可以把变量中的内容输出显示出来。代码如下:
变量之所以被叫做变量是因为变量中存储的内容是可以变化的,例如如下代码:
a=1a=2我们首先新建了一个变量a,然后把a赋值为了1,这时候变量a里面存的内容是1;接下来我们又把a赋值为了2,这时候变量a里面存的内容就变成了2,我们也可以说变量a被改变了。
改变变量的方法不只是直接把内容写在等号右边,我们也可以使用一些比较复杂的表达式,表达式跟数学表达式很像,由+,-,*,/等运算符组成。比如:
a=1+1在这个例子里面,python会首先计算等号右边的表达式:1+1,然后把计算结果2赋值给等号左边的变量a,相当于如下代码:
a=2也支持小数、乘法,如下:
b=10*3.14159也支持小括号
n=(98+97+58)/3也支持在表达式中使用变量
a=98b=97c=58n=(a+b+c)/3操作符之间的优先级也是支持的
n=3+4*5答案是35还是23?常用操作符优先级从高到低排序如下:
在这一步中我们只需要把狗狗的年龄乘以7就可以得到对应的人类年龄,看起来很简单,代码如下:
dog_age=12human_age=dog_age*7print(human_age)运行程序会发现我们得到了84,很简单的就完成了任务。但是别忘了我们是需要让用户输入狗狗姓名和年龄的,因此完整的代码如下:
dog_name=input("请问你的狗狗叫什么名字?")dog_age=input("请问你的狗狗几岁了?")human_age=dog_age*7print(human_age)运行程序时输入年龄12,会发现我们得到的结果居然是12121212121212,这显然是不对的!问题出在哪里呢?你可以在IDLE中试试如下代码:仔细观察会发现,将数字用引号括起来之后的乘法跟没有引号是完全不同的,这里有一个新的概念:字符串,用引号括起来的的内容我们称之为字符串,跟数字是不同的数据类型,关于数据类型,我们马上讲解。回到我们的问题上,我们会发现input函数其实返回的是一个字符串,而我们需要的是一个数字,带着这个问题进入数据类型的章节。
python中每一个数据都有一个类型,不同的类型有不同特性,比如在上面的乘法中,不同类型的数据用同样的乘法操作符进行计算的结果是大不一样的。目前我们接触了两种数据类型:字符串和数字。字符串类型可以简单地通过引号来识别,它代表的是字符/字母/文字的概念,例如:
a=3b=-3c=3.14d=3.0python还有其他类型,如布尔型、列表、字典和对象,后面用到的时候我们再逐步讲解。
回到我们的问题,我们希望使用input函数输入数字时它就给我返回数字,但实际上它返回的是一个字符串。这时候我们就需要用到python提供的类型转换的功能,尝试如下代码:
dog_name=input("请问你的狗狗叫什么名字?")dog_age=input("请问你的狗狗几岁了?")human_age=int(dog_age)*7#增加int函数,将字符串转换为数字再进行乘法print(human_age)完成这部分内容后,我们就进入了最后一步!
当我们计算出来狗狗对应到人类的年龄之后,我们就需要把狗狗的名字跟年龄组合在一起输出了,为此我们首先复习一下print函数,在之前的例子中我们用了很多次print,但是都是输出一个内容:
print("Hello")print(32)那怎么样才能输出很多内容呢?有两种方法:
print("Hello"+"World")a="Hello"b="World"print(a+b)这里要注意的是加号连接符只能连接两个字符串,如果是一个数字一个字符串是没办法连接的,会报错,比如:
print("Hello"+32)第二种方法是利用print函数的进阶功能:通过逗号隔开的方法可以给print函数传递多个内容,print函数会把他们用空格连在一起后输出,例如:print("Hello",32,"World")最终狗龄计算器的完整代码为:
a=32b=18print(a,b)变量定义a="Hello"a=Hello当我去掉Hello外面的引号时会怎么样?
到目前为止,我们的程序还不算很有趣,我们的代码还只是一组简单的语句,只会按照顺序从上到下依次执行,其实电脑之所以能做很多自动化的任务,是因为它可以自己做条件判断。在本章中我们将通过一个石头剪刀布的游戏来掌握判断语句。首先我们来拆解一下这个游戏,也就是分析一下游戏由哪几部分组成:
python提供了很多内置的功能,这些内置的功能以模块(也称为库)的形式存在,模块的概念我们以后还会深入讲解,这里我们先学习如何使用。对于随机数,要使用的模块叫random模块,用法如下:
importrandomimport是导入的意思,random就是随机数模块的名称;导入随机数模块之后就可以使用生成随机数的功能了,用法如下:
random.randint(0.2)这句话的意思是生成0到2范围内的一个随机整数,有可能是0,1或者2.你可以试一下如下的代码:
importrandomrandom_choice=random.randint(0,2)print(random_choice)print("电脑选择的是:",random_choice)现在我们已经实现了随机的功能,但是随机出来的是0,1,2并不是我们期望的石头剪刀布,所以接下来我们要尝试把生成的随机数转换一下,这时候就得学习本章的核心主题了:判断语句,通过判断语句让程序能够自己做决定。
为了让程序能够做决定,首先它得知道一件事儿是对的还是错的,这个对和错的表示方法跟英语判断题里用的T和F是同样的单词:T就是True的缩写,也就是对的、成立的;F就是False的缩写,也就是错的、不成立的。这个True和False在Python里是一个全新的类型,叫布尔值,这个了解即可,但是需要特别注意的是True和False的首字母是大写的,并且没有加引号。考考你,如果加了引号是什么数据类型?你可以在IDLE中执行如下代码,直观体验一下True和False是如何产生的:
if<条件判断1>:<执行1>elif<条件判断2>:<执行2>elif<条件判断3>:<执行3>else:<执行4>if语句执行有个特点,它是从上往下判断,如果在某个判断上是True,把该判断对应的语句执行后,就忽略掉剩下的elif和else,所以,请测试并解释为什么下面的程序打印的是teenager:
我们首先完成第一步检测平局,利用前面学到的if判断语句,我们可以判断一下电脑的选择跟玩家的选择是否相同,如果相同的话则设定为平局,代码如下:
如果电脑选择跟玩家选择不相同的话,就得判断出来谁是赢家了,这时候我们需要首先梳理一下电脑赢的情况有哪些:
接下来我们也可以按照同样的方法梳理出玩家赢的情况,但是有更简单的方法:我们已经把平局和电脑赢的情况都梳理出来了,那么剩下的是不是就都是玩家赢的情况了呢?在具体代码之前,我们需要学习一个新知识:怎么在Python里面表示并且?这个也很简单,用and这个单词,比如:
age>5andage<10更进一步,Python中除了可以表示并且,还有两个跟并且类似的经常用的关键词:or和not.or是或者的意思,比如:
age>5orage==5not是反过来的意思,比如:
not(age<5)思考一下当age=6时上面的表达式的结果是什么?当age=11时结果又是什么?当age=5时结果又是什么?
回到我们的石头剪刀布的游戏,我们利用and并且的功能来实现谁是赢家的判断,代码如下:
如果平局,我们输出:平局!我们都选择了xx。如果没有平局,我们输出:xx赢了,玩家选择了xx,电脑选择了xx。代码如下:
首先来看一下while语句的用法:
sum=0n=1whilen<=100:sum=sum+nn=n+1print(sum)while循环语句可以跟之前学过的if判断语句相结合,比如计算1到100之间所有奇数的和:
sum=0n=1whilen<=100:ifn%2==1:sum=sum+nn=n+1print(sum)有些时候,如果代码写得有问题,会让程序陷入“死循环”,也就是永远循环下去。这时可以用Ctrl+C退出程序,或者强制结束Python进程。请试写一个死循环程序。
在循环中,break语句可以提前退出循环。例如,本来要循环打印1~100的数字:
n=1whilen<=100:print(n)n=n+1上面的代码可以打印出1~100。如果要提前结束循环,可以用break语句:
n=1whilen<=100:ifn>10:#当n=11时,条件满足,执行break语句break#break语句会结束当前循环print(n)n=n+1执行上面的代码可以看到,打印出1~10后,程序结束,可见break的作用是提前结束循环。
在循环过程中,也可以通过continue语句,跳过当前的这次循环,直接开始下一次循环。
n=0whilen<10:n=n+1print(n)上面的程序可以打印出1~10。但是,如果我们想只打印奇数,可以用continue语句跳过某些循环:
n=0whilen<10:n=n+1ifn%2==0:#如果n是偶数,执行continue语句continue#continue语句会直接继续下一轮循环,后续的print()语句不会执行print(n)执行上面的代码可以看到,打印的不再是1~10,而是1,3,5,7,9。可见continue的作用是提前结束本轮循环,并直接开始下一轮循环。
学习了while循环语句之后,我们来结合Python中内置的海龟画图模块来做一些有趣的程序,首先来尝试一下如下的代码,熟悉下海龟画图的基本用法:
importturtle#导入海龟画图模块turtle.forward(100)#前进100步turtle.right(90)#向右转90度turtle.forward(100)turtle.right(90)turtle.forward(100)turtle.right(90)turtle.forward(100)turtle.right(90)turtle.done()#结束画图通过如上的代码我们就绘制出了一个正方形,那如果想要绘制多个正方形怎么办呢?当然可以复制和粘贴,不过既然学习了while循环语句,我们就要利用它来实现这个效果了,代码如下,试试效果吧:
importturtle#导入海龟画图模块i=1whilei<=10:turtle.forward(100)#前进100步turtle.right(90)#向右转90度turtle.forward(100)turtle.right(90)turtle.forward(100)turtle.right(90)turtle.forward(100)turtle.right(90)turtle.right(36)i=i+1turtle.done()#结束画图这样我们就实现了画10个正方形的效果,如果你觉得速度太慢的话可以添加一行代码调节海龟画图的速度:
turtle.speed(0)speed是速度的意思,括号里面可以填0~10的整数,从1到10,速度越来越快,0是最快的。另外,你知道怎么改成画36个正方形吗?大胆尝试一下。
细心的同学可能也发现了前进100步和向右转这两行代码重复好好几次,不能优化吗?答案是可以的:
importturtle#导入海龟画图模块turtle.speed(0)i=1whilei<=36:j=1whilej<=4:turtle.forward(100)#前进100步turtle.right(90)#向右转90度j=j+1turtle.right(10)i=i+1turtle.done()#结束画图这种写法叫做嵌套重复,也就是两个重复执行的循环语句套在了一起,你能想清楚它的执行逻辑吗?这个很重要,深入思考一下。
最后再给大家提供两个有趣的海龟画图的例子,大家可以试着编程运行一下看看效果。
在这个程序中,我们从3个列表中随机挑选出了3个词语,然后把它们组合成了一个句子,因为是随机挑选的,所以有时候会有奇怪的有趣的短语出现,来试试吧。
接下来我们以班级里同学名字作为案例来详细讲一下列表的用法。首先,列出班里所有同学的名字,就可以用一个list表示:
>>>len(names)3用索引来访问list中每一个位置的元素,记得索引是从0开始的:
scores=[60,50,60,58,54,54,58,50,52,54,48,69,34,55,51,52,44,51,69,64,66,55,52,61,46,31,57,52,44,18,41,53,55,61,51,44]我们要实现的功能是把每一种泡泡方案的编号和得分以此输出,然后输出泡泡方案的总个数、最高分以及最高分对应的方案编号是哪个。
我们的第一个小任务是把列表中的每一个元素依次取出来,这个过程我们也称为迭代列表,我们可以使用之前学过的while循环来做,代码如下:
泡泡方案#35的得分为:44之所以会有这个问题,是因为print函数虽然可以通过增加逗号的形式将多个内容一起输出,但是会在各个内容中间添加一个空格。我们可以通过加号链接的方式来解决这个问题,但是注意加号只能把两个字符串连接在一起,所以需要把整数类型的i转换为字符串之后再进行连接:
张三李四王五所以foriin...循环就是把每个元素代入变量i,然后执行缩进块的语句。再比如我们想计算1-10的整数之和,可以用一个sum变量做累加:
sum=0foriin[1,2,3,4,5,6,7,8,9,10]:sum=sum+iprint(sum)如果要计算1-100的整数之和,从1写到100有点困难,幸好Python提供一个range()函数,可以生成一个整数序列,再通过list()函数可以转换为list。比如range(5)生成的序列是从0开始小于5的整数:
>>>list(range(5))[0,1,2,3,4]回到计算1-100的整数之和这道题,通过for语句就可以这么写了:
sum=0foriinrange(101):sum=sum+iprint(sum)运行上述代码,结果是不是也是5050呢。另外,for循环的写法经常用在重复多少次的场景中,比如重复说5遍“我学会了!”:
range函数可以生成从0到某个数的序列,也可以创建任意类型的数字区间。下面给出几个例子:
range函数支持填入两个参数,第一个为起始数,第二个为结束数,第一个不填的话则默认为0,所以range(5)就相当于range(0,5):
有了最高分之后,我们还得进一步找到哪个方案是最高分,这时候就得注意了,是不是有可能并列最高分呢?所以找最高分编号的时候就不能想找最高分一样用变量来存储了,必须得使用列表以解决有可能有多个编号是最高分的情况。我们的思路是这样的,新建一个列表类型的变量best专门用来记录最高分方案编号,一开始把它设置为空,找到编号之后把它添加到列表中,然后再迭代泡泡列表的时候检查一下当前得分是不是等于最高分,如果等于的话就把它的编号添加到best列表中。然后迭代结束的时候我们就找到了所有具有最高分的方案编号。代码如下: