第1关:萌新的进化
大家好,我是吴枫,很高兴又和你见面了。请将屏幕调整成全屏,与我沉浸在Python的魔法世界。【windows系统:请按F11(或Fn+F11);mac系统:请同时按control+command+F。】
在上一关,我们通过最基本的print()函数,帮助千寻找回了自己的名字。同样的,也是借由print()函数,我们知道了与计算机单向沟通的方法。
但是,与世界上所有的沟通法则一样,沟通需要语言的支持。这点,就连计算机也不例外。
比方说,你跟Siri说:来,给我来段beatbox!Siri二话儿不说,立马就给你biu出一段儿噗噗噗。
但是,如果你跟Siri说:Quptenkos Ēngoso ȳdrassis?
所以,如果想要实现真正的人工智能,前提就是突破语言的障碍,让人类说出计算机能懂的话,这样,计算机才能帮我们将命令实现。
而这,也是我们今天要讲的主要内容:掌握【沟通的语言】,完成萌新的进化。
那么,计算机的语言是什么呢?这要从计算机的本质说起:
简单来讲,计算机的本质就是一个做计算的机器,它的主要任务就是处理各种数据,而这些数据的类型,就是计算机的语言类型。
数据类型
在Python的魔法世界,最常用的数据类型有三种——字符串(str)、整数(int)和浮点数(float),他们三者分别具有不同的属性:
字符串
首先,我们要讲的就是代码届的“坦克”——字符串:
字符串英文string,简写str。作为Python届的坦克,此数据类型组团必备随处可见,皮糙肉厚战斗力爆表。作为最常用的数据类型,字符串的识别方式非常简单——有层名为【引号】的皮。
只要是被【单/双/三引号】这层皮括起来的内容,不论那个内容是中文、英文、数字甚至火星文。只要是被括起来的,就表示是字符串类型。
比如,在昨天我们就见过的:
在这组代码里,【'千寻'】、【"Let's play"】 和最后的契约都属于字符串类型。
下面,请你先观察代码,然后点击运行按钮,跟我一起体验一下字符串的应用:
运行结果如下:
怎么样,字符串的使用是不是很简单?
下面,吴老师喊你来双杀喽~请你也来试一试,输出下面代码框中的内容,具体文本可直接复制粘贴。【要点提示:1.文本用引号括住,创建字符串;2.将字符串赋值给变量;3. 使用4个print()函数,分别打印4个变量】。
运行结果如下:
怎么样,你做对了吗?
关于字符串,大家一定要记得:字符串类型必须有引号的辅助。不然你这坦克,就只能被报错按在地上摩擦摩擦,躺遍召唤峡谷的每个角落。
下面,我们来小结一下字符串的知识点。
可是有的时候,某些数据它脱了引号的马甲,也照样能打印出来。例如在上一关我们见过的【print(2)】
而这,就是我们要介绍的,常见数据类型中的第二种:代码届的刺客——整数。
整数
整数英文为integer,简写做int。代码世界的整数,和我们数学课本中定义的一样:是正整数、负整数和零的统称,是没有小数点的数字。
比如在下面的代码框中,赋值语句中的数字都是整数:
现在,我们再趁热打铁一下,请问以下三个数据【'hello panda'】、【108】、【'108'】中哪个是字符串,哪个是整数?
现在思考10秒钟-------
答对了!由单引号括起来的【'hello panda'】和【'108'】是字符串,无引号的【108】是整数。
可我为什么说整数是代码届的刺客呢?其实,就本质来讲,整数和刺客一样,是一个灵活多变、可攻可受的脆皮英雄。
首先,整数可以不穿名为引号的马甲,直接跟print()函数组团搞输出,比如下列代码:
但是由于没有引号这层皮的保护,整数只能单独“行动”。一旦碰上其他文字类数据,譬如中文、英文。整数这个脆皮刺客,立马被报错秒杀。
其次,整数的“灵活多变”又体现在它的用处上,它不仅可以脱离引号被直接打印,还可以和运算符号结合,进行数学计算。
下面,就请你来点击运行按钮,跑一下这些代码。
代码的运行结果如下:
看,怎么样?代码届的刺客——【整数】的直接“输出”,以及计算功能是不是很强大?
不过说到计算,肯定要使用运算符了。Python世界的算数运算符,和我们平时在纸上写的运算符号有相同点,也有不同点。
首先,我们来看看不同的部分——样式:Python的运算符在写法上,与我们平时使用的运算符稍微有点区别。
不过,对于这么多的算术运算符,老师建议你先看一遍,有个大致的印象就行。你可以先把这张图保存上,等用的时候再找出来,对应着查阅就可以。
那么,说了不一样的,咱们再说说一样的——运算优先级:Python世界的运算优先级,和我们平时的计算优先级是一样的。
比方说刚刚那串代码【print((5025-525)/100+18*17)】,他的运算顺序是从左到右:最先计算括号里的【5025-525】。
然后将【5025-525】的结果除以100,第三步则计算【18*17】,最后将除法和乘法的结果相加。
先思考一下,再看答案:
答对了。答案是:A
按照运算优先级口诀,从左到右先算括号里的,括号外的则乘除先于加减。
掌握了方法,下一步就是实操“刺客”——整数的计算功能了。请你根据以下代码框中的题目,写出运算公式并计算出结果。【要点提示:运算符,运算优先级,print()函数】
你做出来了吗,我的代码和运行结果是这样的:
看一下老师的答案吧:
下面,我们来总结一下整数这部分的知识点:
到现在为止,我们已经知道了字符串和整数,这两种数据类型长啥样。可是,我们刚刚计算铭文攻击时产生的结果【3.2】,跟上面那两种类型长得都不一样,那【3.2】又叫啥呢?
它就是我们常见三种数据类型中的最后一种:代码届自带眩晕技能的法师——浮点数。
浮点数
整数是不带小数点的数字,那么相对的,带小数点的数字,就是浮点数。非常好识别,比如下列代码中的数字都是浮点数。
浮点数的英文名是float,与整数(int)和字符串(str)不同,浮点数没有简写。
那我为什么说浮点数能让你眩晕呢?虽然浮点数识别起来非常简单,但是其运算却晦涩难懂、让人头秃。
正如世界级C++大佬Herb Sutter说的:“世上的人可以分为3类:一种是知道自己不懂浮点运算的;一种是以为自己懂浮点运算的;最后一种是极少的专家级人物,他们想知道自己是否有可能,最终完全理解浮点运算。”
所以,浮点运算没有你想的那么简单。那么现在,请大家跟我通过一道题,来感受一下浮点数的“眩晕技能”:
请你先心算一道题【0.55+0.3】,结果是不是【0.85】?下面我们让Python算一下,请直接点击运行按钮,并阅读答案:
看到没,程序算出来的结果,是不是多了很多0,在末尾还有一个1?那这一长串“尾巴”是怎么出来的?
这是因为,Python计算浮点数的方式与我们不一样。Python计算浮点数时,会先把0.55和0.3转化成二进制数【注:二进制数由0和1表示,逢二进一】,如下列代码:
然后,这俩二进制数通过二进制法则运算后,再通过复杂的计算公式,将二进制结果转成十进制小数。
经过这两次转换,小数点后面就产生了多余的“尾巴”。这样,就造成了我们与程序计算结果的差异。
不过对于浮点数,你也不用太担心,因为在前期我们很少会涉及浮点数运算。而在后期,随着学习的深入,你会接触到更多的相关知识,辅助你对浮点数的进一步理解。
然后,我们来看一下浮点数这部分的主要知识:
以上,就是我们最常接触的三种数据类型:坦克字符串、刺客整数、法师浮点数的全部内容了。
你学得怎么样?来测试下?
先思考一下,对了,答案是D
恭喜大佬答对了!一眼看上去它们三个好像是同样的东西,但它们属于完全不同的数据类型。42是整数,由单引号扩起来的'42'是字符串,有小数点的42.0是浮点数。
现在,你已经掌握了字符串、整数、浮点数的使用了,下面我们来学以致用一下。
比方说,我有以下几个变量,然后想输出这样一句话:亚瑟团灭敌方获得ACE称号。你要怎么做呢?
这就涉及到了我们下一个知识点——数据拼接。
数据拼接
数据拼接的方法可简单了,就是利用数据拼接符号【+】,将需要拼接的变量连在一起就行了。
比如,上面的例子,我可以这么写:
有了拼接符号,我不仅可以输出亚瑟团灭敌方获得ACE称号,还可以调整变量的拼接顺序,输出不同的内容。
下面我们就来试一下,请你补全下列代码,同时打印出两个结果:【结果1】亚瑟秒掉李白获得First Blood;【结果2】李白秒掉亚瑟获得First Blood。【要点提示:print()函数,拼接符号+,无需标点符号,输出结果需与要求一模一样】。
学会了数据拼接,就能让我们的数据整合更为灵活,组合出任意我们想要的内容。
而这,就是我们数据拼接部分的要点:
但是现在,你已经不是代码届的小萌新了,是随时可以自己放烟花的入门人士了。怎么可以止步“一血”呢,我们要增加输出内容,拿五杀!
那么,为了输出结果【亚瑟秒杀5敌方获得Penta Kill】,我们是不是可以把代码写成这样?请直接点击运行按钮,如有报错请点击按钮【跳过本题】:
梦想是美好的,但现实是残酷的,我们立马被报错【TypeError:can only concatenate str (not "int") to str】(类型错误:只能将字符串与字符串拼接)
按在地上摩擦摩擦。
虽然通过报错提示,我知道了错误来源于print()函数内,数据类型的拼接错误。但是到底是哪个数据类型不对呢?我们要怎么查看数据类型呢?
拿刚刚那段报错代码来说,由于变量是由我们定义的,所以我们可以用人眼查找错误源。
但是在未来,当我们学会了更为复杂的命令,可以用代码对其他人提问,收集其他人的答案时。我们无法确定他们回复你的内容,是用什么数据类型写的。
所以,我们要学会善用Python的魔法,使用Python中一个已有的,既简单又实用的函数,来帮助我们查询不确定数据的类型。而这个函数,就是type()函数。
type()函数
那么,这个type()函数要怎么使用呢?答案就是:只需把查询的内容放在括号里就行。
只要你把内容写在括号里,type()函数就会立即将它的类型查询出来。下面,请你用刚才的代码来试一下。请直接点击运行按钮,只要运行通过就请继续课程。
哎?怎么什么都没出现呢?刚刚不是说过,只要按照type(需要查询的数据)这个格式写对了,就能出现数据的类型吗?
其实,什么都没有就对了。对于Python来说,你只是下了一个命令——给我查询类型哟~然后Python就老老实实地查询了类型,再然后……就没有了。
在你的命令里,并没有告诉Python:“你查到以后,记得告诉我这个类型的结果啊~”所以,异常老实的Python就把查询到的数据类型……存起来了,没告诉你。
下面,请你再实操一下,补全代码,运用print()函数,将查询函数的结果打印出来。例如:print(type(hero))
终端里出现的结果,是不是除了4个<class 'str'>,还有1个<class 'int'>?
在type()函数的帮助下,我们知道了:原来字符串里面出了一个“奸细”整数。难怪当时在终端区会给我报错说:数据类型不同呢。
可是为什么不同类型的数据不能拼接在一起呢?一句话:圈子不同不相融。
我打个比方,这就类似我饭阿森纳,你饭热刺。虽说咱俩都是足球粉丝,但喜欢的球队却是死对头,所以根本没办法交朋友,没法把咱俩放在一起。
但是,在某些时候,咱俩总得有低头不见抬头见,在一个球场看球的时候。那么这时候要怎么办呢?要如何把两个不同类型的数据拼在一起呢?
这就涉及到了我们这关最后一个知识点:数据转换。
数据转换
负责转换数据类型的函数一共有3种:str()、 int()和float()。
下面,我们先来学习一下,能帮我们解决刚才的代码Bug,拿到五杀的str()函数。
str()函数
str()函数能将数据转换成其字符串类型,不管这个数据是中文、数字、标点还是火星文,只要放到括号里。这个数据就能摇身一变,成为字符串类型。
下面,请你看看老师是如何运用str()函数解决报错,完成数据拼接的。请先观察下方代码的书写,然后点击运行按钮。
下面请你也来试一下:补全下方代码,成功打印出结果我一个电话立马有10000只山兔在你家楼下hola hola。【要点提示:str()函数,数据拼接,print()函数】
老师的答案是这样的:
整数转换字符串类型的方法是不是很方便?那如果我告诉你,还有一种转换成字符串的方法,而且这种方法你已经学会了呢?
那就是借用引号的帮助,比方说我一个电话立马有10000只山兔在你家楼下hola hola这个结果,我也可以写成下面这样:
下面,请你来实际运行一下,看能否出现两个一样的内容:
你看,我们是不是用两种不同的写法:str()函数和引号,输出了同一种结果?
可是,为什么引号内我们使用的是数字,而不是变量名number呢?这是因为,当我们使用引号时,引号里的东西,都会被强制转换为字符串格式。
所以,如果我们把变量名number放进引号里后,被强制转换为字符串的,将是变量名number,而不是变量名代表的数字10000。
可能有人会在心里吐槽:既然引号用着这么麻烦,那我直接用str()呗~你看这多省事。
其实,我并不是单单地在教你编程方法,而是想传达给你一种编程思维——条条大路通罗马。
代码的世界千变万化,同一个结果可能有千百万种答案,如果我们只心安理得地,局限在一种思维模式下。那这个思维定势一定会阻挡你的进步,阻止你成为真·大佬。
所以,我希望你能尽情创新,尝试不同的选择,就像老祖宗说的:胆大心细,绝对没错。
好了,题外话到此为止。现在我们来实操一下,锻炼一下编程思维。请补齐下方代码,并用两种方法打印出结果:我一个电话立马有500个吴亦凡在你家楼下skr skr。
我自己的答案是这样的:
怎么样,关于str()函数的内容你学会了吗?我们来做道题验证一下。
答对了!'老铁来个双击'和'呗?'为字符串类型,无法与整数类型666拼接。
下面,我们来小结一下str()函数部分的知识点。
既然整数类型能转换为字符串,那字符串类型能转换为整数吗?
那必须的。
int()函数
将数据转换为整数类型的方法也很简单,就是int()函数。其使用方法同str()一样,将你需要转换的内容放在括号里就行,像这样:int(转换的内容)。
下面我们来试验一下,请补全代码,计算出bug和hair这两个变量的和。【要点提示:1. int()函数转换数据类型;2. 运算符+计算;3. print()函数】
老师的答案是这样的:
不过对于int()函数的使用,大家要注意一点:只有符合整数规范的字符串类数据,才能被int()强制转换。
别看它虽然只有一句话,但它其实带有三层含义:首先,整数形式的字符串比如'666'和'0',可以被int()函数强制转换。
其次,文字形式,比如中文、火星文或者标点符号,不可以被int()函数强制转换。
最后,小数形式的字符串,由于Python的语法规则,也不能使用int()函数强制转换。
比方说下列代码,如果点击运行,程序会报错【ValueError:invalid literal for int() with base 10: '3.8'
这是不是意味着,浮点数不能转换成整数类型了?
不,虽然浮点形式的字符串,不能使用int()函数。但浮点数是可以被int()函数强制转换的。
下面,请你先观察下方代码框中的代码,然后点击运行按钮。
上方的代码串,就是一条将浮点数3.8强制转换的语句。但是,为什么输出的结果是3呢?
你看,int()函数的本质是将数据转换为整数。所以对于浮点数,int()函数会做取整处理。但是,同我们平时对小数四舍五入的处理方法不同,int()函数会直接抹零,直接输出整数部分。
现在,对于int()函数你是不是了解得很透彻了呢?我们来做道题检验一下吧。
恭喜你C位出道!'C位出道'为文字类数据,无法转换为整数类型。
最后,我们来小结一下int()函数的知识点。
可是,如果遇到这种情况:字符串就是小数形式,比如'3.8'这种。我不想让它变为整数3,想让它保持小数形式的3.8,那我要怎么做呢?
这就涉及到了我们这关,最后一个知识点——float()函数。
float()函数
首先float()函数的使用,也是将需要转换的数据放在括号里,像这样:float(数据)。
其次,float()函数也可以将整数和字符串转换为浮点类型。但同时,如果括号里面的数据是字符串类型,那这个数据一定得是数字形式。
那么,经过之前str()和int()操练,float()函数是不是好懂了一些?
下面,我们来打段代码练练手。请补齐代码,将下列变量,转换为浮点类型,并打印出结果。【要点提示:print(float(数据))】
答案是这样子的,是不是和你的一样呢?
到现在为止,你已经知道了转换数据类型的方法了,最后我们再通过一张图总结一下这三种方法。
下面,我们来解决刚进入float()函数部分时,我们的问题:字符串就是小数形式,比如'3.8',我如何将这个字符串,直接转换为浮点类型呢?
比方说我想使用以下变量,输出这样一个结果人工智障说:3.8+1等于4。
其中,输出结果中的4,是由字符串型变量【word = '3.8'】,加上整数型变量【number = 1】得出来的。
那么,我先将字符串转换为整数,计算后再与其他数据拼接?可我这第一步int(word)就被报错卡住了,那要怎么办呢?
不如,你先来看看我是怎么写的。【请不要更改代码,直接点击运行】
额……猛的一看这串代码真是转换套转换……真是好嗨哟~是不是感觉代码人生到达了巅峰~
先别急,让我们来一层一层拆解、分析一下。首先,我们先看float(word)这部分。
为了与整数【number = 1】进行计算,我们需要将字符串形式的【word = '3.8'】变为能做计算的数据类型。
经过我们上面的学习,我们知道,能做计算的类型有两种:整数型和浮点型。
那么,既然无法用int()函数转换。那我们可以不可以用float()函数,将字符串型变量【word = '3.8'】,转换为同样可以做数学运算的浮点型呢?要不,咱试下?
请在下方代码框中,用print()函数输出float(word)的结果,输出格式:print(float(变量))。
怎么样,是不是没报错?下面请看一下老师的答案:
经过转化后,我们的【word = '3.8'】已经成功脱去引号,成为了浮点型,可以做数学运算了。
下面,请你补齐下方代码,将成为浮点型的变量word与【number = 1】相加,并输出结果。【要点提示:运算符+,浮点类型可直接加减】
你的答案是不是也和老师一样呢?
但是,为了得到4这个结果,我们需要将计算结果4.8,抹去小数部分取个整。
下面,请你继续续补全代码。运用int()函数将上一步的计算结果转换,得出结果4。【要点提示:int()函数取整,print()函数,格式:print(int(需转化数据))】。
好了,现在你是不是觉得,终于可以进行拼接,得出结果人工智障说:3.8+1等于4了?
还不行,因为到现在为止,我们所有的数据都是整数类型,而数据拼接需要字符串的支持。
所以,我们还要把刚刚得出的那一串数据,用str()函数转换一下。
老规矩,请你继续补齐代码,将最下方代码串转换为字符串类型,并打印出字符串类型的结果4。【要点提示:print()函数,str()函数】。
可以先思考一下,再看下面的答案。
这回,我们终于来到了最后一步,可以与字符串型变量sentence = '人工智障说:3.8+1等于'拼接了。
国际惯例:补代码喽~【要点提示:字符串拼接+,print()函数】。
你做对了吗?我们再来瞄一眼老师的答案:
这么看来,虽然看上去挺复杂的,但通过我们这么一步步拆解,是不是简单多了?
我的答案如下:
恭喜你抽中N卡,答案为A,int()函数无法转换小数形式的字符串。
怎么样?掌握了数据类型、数据拼接以及数据转换的你,有没有成为大佬的成就感?
但这仅仅是开始,以后你将学习更为复杂的代码及命令,掌握更多的与计算机沟通的技巧。
比如在下一关,你将跟着我通过复仇者联盟:无限宝石的故事,一起学习与计算机沟通的逻辑。
那么最后,我们来用一张总结图结束这关的内容吧,我们下关见!