企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[Toc] # 第2章 Python基础 在今天的学习中,小墨学习了输入输出及字符串的内容,还给墨妹妹做了个小游戏。墨妹妹刚开始学习打字,小墨给她做了个什么样的游戏呢?另外,做游戏时,小墨还遇到了自己的第一个bug,他又是如何来“杀虫”的呢?一起来看看吧。 时间:早上9:00 地点:墨馨书屋 墨博士:早上好小墨。你现在能熟练使用IDLE了吗? 小墨:早上好博士。嗯……应该……没问题吧。 墨博士:回答的不干脆呀。这样吧,今天呢,我们来学习Python的基础知识,包括输入输出、变量和数据类型等,学习的时候我也再提一下IDLE的使用,你也来看看自己的掌握情况。 小墨:太好了! # [插图:墨馨书屋内景] ## 2.1 输出 墨博士:在第1章中,我们编写了如下的程序: ``` print('Hello World !') print('Hello Python !') ``` 运行,可以在IDLE窗口中看到结果为: ``` Hello World ! Hello Python ! ``` 也即打印了print后面的括号里单引号引起来的内容。 我们可能不明白为什么会这样,但是可能会猜出这样的结论: 1. print用于向控制台打印内容 2. print后面括号中的单引号中的内容是什么,就打印什么 到底是不是呢?编写这段代码,运行看看结果: ``` print('我开始学Python了') print('非常的开心') print('并不像想象的那么难') ``` 写好后按F5运行,结果为: ``` 我开始学Python了 非常的开心 并不像想象的那么难 ``` 三个print,就打印了三次,内容也是单引号中的内容,这样就验证了我们的猜测。 在Python中,print的作用就是将括号内的单引号中的内容打印到屏幕上,这个过程,称为**输出** >动动手:自我介绍:使用print()编写程序,输出自己的姓名和爱好。 ## 2.2 输入 小墨:博士,自我介绍我已经写好了,但是写一些东西然后让它输出实在是太无聊了!能不能写一个程序,可以给其他人用,让他们输入自己的姓名、爱好,然后程序自动组装成类似“我叫xx,我喜欢xx”的语句输出呢?我觉得墨妹妹会喜欢这样的小游戏的,她正在学习打字。 墨博士:分析一下,要想完成你说的效果,我们需要知道“用户输入”和“组装”怎么做。 先说用户输入,在Python中,想要输出使用print,对应的,想要输入就使用input。 现在在IDLE中按Ctrl + N,新建一个窗口,录入如下内容: ``` input() ``` 按下键盘上的Ctrl + S,选择保存的路径,然后给要保存的文件起个名字,比如叫my_name,然后点击保存。如图2.1所示。 ![](http://p7moyixbi.bkt.clouddn.com/%E5%9B%BE2.1.png) 图2.1 保存后的my_name.py文件 然后按下F5,运行该程序。发现什么了吗? 小墨:在前面学习print时候,每次运行,IDLE窗口中都会先输出一行类似“======================= RESTART: D:/my_python/hello.py =======================”的内容,然后输出程序运行的结果,输出完毕之后又会出现“>>>”。 但是这次运行之后,并没有以“>>>”结尾。如图2.2所示。 ![](http://p7moyixbi.bkt.clouddn.com/%E5%9B%BE2.2.png) 图2.2 my_name.py的运行结果 墨博士:这是因为input()用于接收用户的输入,如果你不输入,它就一直在那等着。也就是说程序一直在运行着没有结束。 小墨:哦原来是这样。那输入后是不是就结束了? 墨博士:现在我们随便输入点什么,然后按回车键,就可以看到程序结束了。如图2.3所示。 ![](http://p7moyixbi.bkt.clouddn.com/%E5%9B%BE2.3.png) 图2.3 my_name.py的运行结束 这就是输入的功能了。 小墨:这个输入有点不友好,运行之后墨妹妹肯定不知道该怎么用,我来修改修改: ``` print('请输入你的名字:') input() ``` 这样运行之后,会现有一句提示,就好多了。 墨博士:嗯加上友好提示,程序就更棒了。这个功能还可以通过在input后面的括号中加入单引号引起来的一句话来实现。将my_name.py中的内容修改如下: ``` input('请输入你的姓名:') ``` 你看,修改之后可以发现窗口名称的两边又出现了星号,还记得这是什么意思吗? 小墨:出现星号说明文件做了修改没有保存。 墨博士:没错,不光是新建文件需要保存,修改之后的文件我们也需要保存。此时按下Ctrl+S,就可以看到星号消失了。 再次运行、就可以看到友好的输入提示了。输入内容后回车结束程序,效果如图2.4所示。 ![](http://p7moyixbi.bkt.clouddn.com/%E5%9B%BE2.4.png) 图2.4 my_name.py的运行结果 >动动手:编写程序,使用input分别让用户输入姓名和爱好。 ## 2.3 变量 墨博士:用户输入说完了。接下来我们把用户输入的内容组装为“我叫xx,我喜欢xx”的格式并输出。 拼接之前,你需要先了解**变量**的概念。 小墨,你知道一个圆的面积如何计算吗? 小墨:这个我小学就学过了,圆的面积等于π乘以半径的平方。π是圆周率,是个无尽的小数,我会背小数点后面的100位,3.141592653589793…… # [插图:π] ![](https://img.kancloud.cn/6a/48/6a48245a14681fcc90e76e8f89ec6788_640x480.png) 墨博士:停~停~停~,现在呢,我们用Python代码来计算下半径为1、2、5的三个圆的面积并输出,π不需要取那么多位,就取到3.1415926吧。程序可以这样: ``` print(3.1415926*1*1) print(3.1415926*2*2) print(3.1415926*5*5) ``` 小墨:这个星号是什么呀? 墨博士:在Python中*号就表示数学上的乘积关系,程序运行,你看,这样就计算好了: ``` 3.1415926 12.5663704 78.539815 ``` 在这个程序中,我们发现这个π的值被重复写了三次,麻烦不说,还容易写错。那么我们能不能定义一个符号,比如说a,就表示π的值,然后让a去代替这个π的值去计算呢?大概思路是这样的: 先让a 表示3.1415926,那么程序就变为: ``` print(a * 1 * 1) print(a * 2 * 2) print(a * 5 * 5) ``` >墨博士提醒:按照Python的编码规范,运算符的两边要留一个空格,比如写“a * 2”,而不是“a*2”,虽然计算结果上没有区别,但是前者更规范,风格更好,程序可读性更好。 这里的a就是变量,简单的说,就是用一个符号去表示一个数或计算结果,这个符号就称为变量,比如这里的a。 那么如何让 a 表示3.1415926呢,很简单: ``` a = 3.1415926 ``` 这样就可以了。注意这里的“=”不是数学中的等于,而是编程语言中的“赋值运算符”,它的运算顺序是从后往前的,作用是将后面的内容“赋”给前面的变量。这样把3.1415926赋值给a之后,a就可以表示3.1415926了。 小墨:我明白了,这个a就像一个代词,现在代指3.1415926这个数。 墨博士:是的,另外变量的**变**体现在哪儿呢?其实是这样的: 新建一个文件,输入这段代码: ``` a = 3.1415926 print(a) a = 2 print(a) ``` 并保存运行,可以看到先输出了3.1415926(第2行),接着又输出了2(第4行),也就是说a所表示的值是可以变化的,它可以一会表示这个,一会表示那个,给它赋了新值,它就表示新的内容了,这就是所谓的变。 回到我们的程序,由于我们不知道用我们程序的人会输入什么名字或爱好,就可以拿一个变量接收用户输入: ``` name = input('请输入您的姓名:') ``` 这样当我们输入内容之后,输入的内容就赋给了name这个变量,此时name就可以表示输入的内容了,name是我们自己起的名字,和上面的a一个道理。 > 墨博士提醒:IDLE中存储文件时的文件名,以及这里的变量名,起名规则如下:一般全小写,如果由多个单词组成则不同单词之间用下划线_分割,如first_name。另外要注意,为了程序的可读性,一般名字起的要见名知意,尽量不要用a123,sdf等无意义的名字。 接下来我们就将输入的内容输出,修改程序如下: ``` name = input('请输入您的姓名:') print(name) ``` **注意**:和上面输出a一样,第二句print后面括号中的name两边不要加单引号,表示输出该变量所表示的值,而加上这个单引号表示输出name这个单词本身。 运行结果如图2.5所示: ![](http://p7moyixbi.bkt.clouddn.com/%E5%9B%BE2.5.png) 图2.5 my_name.py的运行结果 > 动动手:编写程序,请分别让用户输入姓名和爱好并分别输出 ## 2.4 字符串 接下来我们把用户输入的内容拼接为“我叫xx,我喜欢xx”格式并输出。 还得先来了解一个新的内容:**字符**和**字符串** 字符是指计算机中使用的文字和符号,比如汉字“我”,数字“1”,英文符号“a”,数学符号“π”等都是字符。 字符串,就是一串字符。字符和字符串的关系如图2.6所示。 # [插图:山楂和冰糖葫芦,类似于下面的关系] ![](http://7xtc8l.com1.z0.glb.clouddn.com/image/python_java//bb2a87d3-dcf5-4b9f-ab66-c26b3ae7a6d0.jpg) 图2.6 字符和字符串的关系 小墨:原来字符和字符串的关系就是山楂和冰糖葫芦的关系呀。 墨博士:哈哈是的。在python中,使用单引号或双引号引起来的内容,我们称之为字符串。 > 墨博士提醒:字符串用成对单引号''或成对双引号""表示,一般情况下两者没有区别。 下面来说说拼接的事儿。在使用print输出字符串时,有三种拼接方式。 在IDLE中新建文件并录入以下代码: ``` name = input('请输入你的姓名:') hobby = input('请输入你的爱好:') print('我叫' + name + ',我喜欢' + hobby) print('我叫', name, ',我喜欢', hobby) print('我叫%s,我喜欢%s' % (name, hobby)) ``` 保存后运行,结果为: ``` 请输入你的姓名:小墨 请输入你的爱好:编程 我叫小墨,我喜欢编程 我叫 小墨 ,我喜欢 编程 我叫小墨,我喜欢编程 ``` 第1、2行代码接收输入并用两个变量name和hobby表示输入的姓名和爱好。第3行代码中有个+号,在Python中加号不仅能用来做数学中的相加计算,还能把一些东西拼接起来,比如这里的+号将“我叫”、“,我喜欢”以及name和hobby两个变量一起拼接了起来,输出了完整的一句。第4行代码通过逗号拼接,从输出的结果可以看到,这种方式中的逗号转成了空格。第5行代码的%s是一个占位符,表示占着这个位置,然后后面跟一个百分号,再跟一对小括号,小括号中放入我们的两个变量,此时就是把小括号中的name变量的值赋给第一个%s,hobby变量的值赋给第二个%s,也即前面有多少%s,后面就放几个变量,并且%s的顺序和变量的顺序一致,如果前面只有一个%s,则后面的小括号省略不写。比如: ``` print('我叫%s' % name) ``` 这种用法最多,写起来也最方便,后面我们会经常和它打交道。多写几遍,尝试下不同的情况,你就能熟练掌握这三种方式了。 小墨:好的,这样就完成输入名字再输出的功能了,我今天回去就可以让墨妹妹用用我编写的程序了。 墨博士:需要注意的是:第2、3种拼接方式,只用于print输出语句,而第一种加号的方式,可以用于任何需要字符串拼接的地方,比如: ```{} s1 = 'hello ' s2 = 'world' s3 = s1 + s2 s4 = 'hello ' + 'world' print(s3) print(s4) ``` 输出结果为: ``` hello world hello world ``` 代码的第1、2行是将两个字符串Hello和World赋值给s1和s2,也即用变量表示。代码的第3行s1和s2这两个字符串使用+号拼接,拼接的结果赋值给s3。 第4行是直接将两个字符串用+号拼接然后赋值给了变量s4。 > 动动手:请输入您的python考试成绩,最终输出为:您的python成绩是89分 ## 2.5 数据类型 墨博士:小墨,来看这段代码: ``` a = 2 b = 3 print('a + b = ' + (a + b)) ``` 你觉得运行会输出什么? 小墨:您刚才有提到这个+号可以用作数学上的相加计算,所以这里应该会输出a + b = 5吧? 墨博士:Python中的+确实既可以用来做数学相加计算,也可以用来拼接一些内容。但是这个程序的运行结果可能和你想的不太一样,如图2.7所示: ![](http://p7moyixbi.bkt.clouddn.com/%E5%9B%BE2.7.png) 图2.7 运行报错 运行出bug了!小墨,你听说过bug吗? > bug词语由来:Bug一词的原意是“臭虫”或“虫子”;而在电脑系统或程序中隐藏着的一些未被发现的缺陷或问题,人们也叫它“bug”。 “Bug”的创始人格蕾丝·赫柏(Grace Murray Hopper),是一位为美国海军工作的电脑专家,也是最早将人类语言融入到电脑程序的人之一。而代表电脑程序出错的“bug” 这名字,正是由赫柏所取的。1947年9月9日,赫柏对Harvard Mark II设置好17000个继电器进行编程后,技术人员正在进行整机运行时,它突然停止了工作。于是他们爬上去找原因,发现这台巨大的计算机内部一组继电器的触点之间有一只飞蛾,这显然是由于飞蛾受光和热的吸引,飞到了触点上,然后被高电压击死。所以在报告中,赫柏用胶条贴上飞蛾,并把“bug”来表示“一个在电脑程序里的错误”,“Bug”这个说法一直沿用到今天。 与Bug相对应,人们将发现Bug并加以纠正的过程叫做“Debug”(中文称作“调试”),意即“捉虫子”或“杀虫子”。 # [插画:bug,类似下图] ![](https://img.kancloud.cn/18/df/18df44d8089afb51985379cf775ef902_900x882.png) 小墨:这个我曾经听墨哥哥提起过,他说公司给配了最新的电脑,这样他的编程效率提升了,就能写出更多的bug来了。 墨博士:……,墨哥哥那是开玩笑的。有bug了要赶紧debug才对,不过也不用太紧张,IDLE给了我们足够的出错提示信息帮助我们修复bug,如图2.7所示。 这里的报错信息告诉我们,程序data_type.py的第三行出了问题,也即`print('a + b = ' + (a + b))`出了问题,所以你看,IDLE已经很明确的指出了程序出错的原因,接下来根据它的提示去解决问题就好了。 这里我们程序运行出问题的原因,是“TypeError: must be str, not int”,叫“类型错误,一定要是str,不能是int”,什么意思呢? 这就要说说python中的数据类型了: 先说变量和常量的概念:变量的概念我们已经很清楚了,是指可以表示不同内容的符号,是可变的量。常量的概念和变量对应,表示永远不会改变的量,比如1永远是1,不可能是2,字符串‘abc’也永远是‘abc’,这些不可改变的量都可以称为常量。 变量也好、常量也罢,其表示的都是一个数据,数据与数据是不同的,比如1、2这些是整数;1.1、3.14这些是小数;-2、-12这些是负数等,这就有了类别。对应到程序中,就是数据类型的概念了,比如a = 2,此时变量a的类型是**整数类型**,简称整型,也就是上面报错信息中提到的**int**;而**str**表示的是**字符串类型**,如果b = 'abc',那么此时变量b的数据类型就是字符串类型。 > 墨博士提醒:在python中,变量的数据类型是可以变化的,比如: >``` >a = 2 >print(a) >a = 'abc' >print(a) >``` >运行结果为: >``` >2 >abc >``` >这里第1行中a是int类型,第2行中a就变成str类型了。 回到上面代码的报错上,这里报错的原因是:'a + b = '是一个字符串,而(a+b)是两个int类型做了数学的加运算,两个int类型的数据相加,得到的结果还是int类型。Python中str类型之间可以使用+号拼接,而str类型和int类型是不能通过+号拼接的。 小墨:那如果想要拼接怎么办? 墨博士:想要拼接,需要将a+b的结果由int类型转为str类型,这使用str()来实现。修改代码如下: ``` print('a + b = ' + str(a + b)) ``` 输出结果为: ``` a + b = 5 ``` 同理,我们也可以在字符串上加上int(),让字符串转为整数,但前提是这个字符串的字符组成本身就是整数。比如: ``` a = '2' print(int(a) + 10) ``` 输出结果为: ``` 12 ``` 上述程序中的第一行中的2虽然是一个整数,但是加上单引号之后就变成了字符串类型的2了,此时赋值给a,a也就是字符串类型了。如果字符串类型的a和整数类型的10直接通过+号拼接,结果还是会报类似上图2.7的错误。想相加的话可以通过int()将a转为整数类型,再相加就是数学运行了,运算结果为12。你理解了吗小墨? 小墨:嗯理解了,str()能将整数类型转为字符串类型,int()能将字符串类型的数字转为整数类型的。 ## 2.6 本章小结 墨博士总结:本章你的收获非常多,无论是理论性还是实践性的东西都涉及了。你更加熟悉了IDLE的基本用法,学会了输入输出的使用、变量的使用、理解了使用变量的好处、掌握了整数类型和字符串类型的区别、str()和int()的使用,还解决了第一个bug。毫不夸张的说,你已经入门Python了。 不过你的Python之路才刚刚开始,后面需要学习的东西还很多,好好休息,然后让我们继续前进吧!