[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之路才刚刚开始,后面需要学习的东西还很多,好好休息,然后让我们继续前进吧!