破解密码那些事儿(chapter 3,初识Python,下)

值必有类型

之前我们说的整形数浮点数其实是一种数据类型。每一个程序能认识的值都有类型。比如42就是一个整形数,具体而言整形类型可以用int来表示;7.5是一个浮点数,浮点数类型可以用float来表示。

在本书,我们学的数据类型并不多,包括下一章会学习到的string类型。到现在为止,为什么学习的都是值类型,值类型只是数据类型的一种,要识别一个数据的数据类型很简单,只需要看你打出的值就是了。比如整形数木有小数点,而浮点数是一定有小数点,你就很容易理解42是整形数,而42.0是浮点数了。

赋值语句与数据存储方式

我知道你们一直很明白我说的东西,直到上一节,关于值,值类型与数据类型的东西,这些基本的概念一定得明白,这一节希望能从计算机工作原理来和大家讲述。

当我们使用了估值表达式之后,程序会把他们推演到一个值,但是如何把他们存储下来呢?通常计算机把这些东西存储到变量里头。

为了更好的理解变量这个东西,我们假象一个盒子出来,这个盒子放着要存储的值。通常一个变量需要通过用=号连接的表达式来传递这个值,称为赋值。比如我要把15这个值存到名叫“spam”的变量里头去,我们只需要写spam=15:

破解密码那些事儿(chapter 3,初识Python,下)_第1张图片

你可以假想变量就是那个盒子,命名为spam(贴在盒子上,你可以写别的名字贴上去),里面装着一个15的值,就好像一张写着15的小纸片一样。

在命令行上敲入这句代码回车后,你看不到任何的响应,只有一个空行。除非出现了错误,显示的是错误语句,你可以认为这些指令已经成功执行。出现了>>>后你可以敲下一个指令了。

一个带有=的赋值语句做了什么事情呢?首先,创建了一个名叫spam的变量,然后存储了值为15的数据。和估值表达式不同,语句是一种指令性的操作,不会去做估值计算的事情,仅仅是完成某项操作,所以这就是为什么命令行执行完命令后没有回应的原因了。

看到这里,各位看官可能会迷惑,啥是表达式,啥是语句呢?请记住,如果Python的程序能推到出一个值的时候那就是表达式,如果不是,就是语句。(老外还是迷糊,不过有些东西一句话未必能讲清楚,慢慢看)

一个赋值语句的格式是这样的,一个变量名,后面跟着=,然后是一个表达式。这个表达式计算出来的值就会存到这个变量里头。

破解密码那些事儿(chapter 3,初识Python,下)_第2张图片

要记住,变量存储的永远只是一个值,而不是表达式,再复杂的表达式最终都会推演出一个值,不然程序就挂了。比如,我们有这样一个语句spam=10+5,表达式10+5会被计算为15,然后15就会被存储到spam里头。赋值语句中的变量如果是第一次出现,那么程序会先创建这个变量,然后把值存进去。

破解密码那些事儿(chapter 3,初识Python,下)_第3张图片

这里有个有意思的东西,如果我们输入spam+5的时候,命令行会返回20

破解密码那些事儿(chapter 3,初识Python,下)_第4张图片

看起来有点奇怪,不过你还记得我们之前已经给spam这个变量赋值15了,表达式spam+15就会被估值计算为15+5,然后把结果20送回。在表达式里头,那些变量的值会被提取出来,参与计算。(所以表达式不是仅仅是两个值类型的数做运算)

变量覆盖

(不要吐槽这个小标题,因为你知道么当年就关于这个词应该怎么表达,我们都吵了几个星期,最后才定下来的)

当一个变量已经赋过值,但是需要改动这个变量的值的时候,这就是变量覆盖了。请看例子:

破解密码那些事儿(chapter 3,初识Python,下)_第5张图片

第一次我们输入spam+5的时候,结果返回是20,因为spam里头我们存储的是15.但是我们执行了spam=3的时候,原来存在spam的值就变成了3,意味着15被3覆盖了。所以,你再次执行spam+5的时候,返回值就是8,这个时候spam+5就相当于3+5,spam的旧值已经不见了。

想知道现在某个变量的值是多少,只需要在命令行里头敲入该变量就是了

你可能会感到迷惑,为什么一个变量也可以是一个表达式?原因就是这样,变量存储的东西可以被取出变成一个表达式,还记得以前一个整型值就是一个表达式的概念么?

延伸一下,我们不妨考虑一下,在赋值语句的时候,在表达式一端也用上我们的变量:

破解密码那些事儿(chapter 3,初识Python,下)_第6张图片

这句话spam=spam+5的意思其实就是说,spam的新值等于当前值加上5。记住等号的左边是要赋值的变量,等号的右边的要计算的表达式。通过这个方式我们可以让spam持续的增长:

破解密码那些事儿(chapter 3,初识Python,下)_第7张图片

使用多个变量

其实,在我们的程序里头,通常都会有很多变量,你想要多少就有多少。比如,我们给以下两个变量fizz和eggs赋值:

此时,fizz的值是10,而eggs的值是15.


破解密码那些事儿(chapter 3,初识Python,下)_第8张图片

让我们尝试给变量spam赋个新值,敲入spam=fizz+eggs,回车之后再敲入spam,看看命令后输出什么:

破解密码那些事儿(chapter 3,初识Python,下)_第9张图片

也就是说spam的值已经变成25了,是因为我们表达式fizz+eggs已经告诉计算机把存在变量里头的值拿出来相加了。

变量名

名字对我们很重要,但是对计算机来说,他们是不关心的。给变量命名反映的不仅是值的数据类型,更重要的是让人更明白程序的运行机制。比起name这样无意义的变量名来说,我们更应该用abrahamLincoln或者monkey这样的名字。虽然无论你怎么命名,只要程序写对了,计算机都会正确运行。

对于Python来说,变量名也是大小写敏感的(对Python而言,所有出现字符的时候都是大小写敏感的)。大小写敏感意味着,拼写相同变量,只要某个字符大小写不一样,那就会被认为是不同的变量。所以spam,SPAM,Spam和sPAM就是4个独立的不相干的变量,存储着各自的不同的值。

实话说,在一个程序里头,拼写相同但是大小写不同的变量是不应该出现的,那么做会是个灾难。比如你把你的姓存在变量NAME,把名字存在变量name中,你刚开始写这个程序的时候,你会很清楚,但是过后你要重新阅读的时候,你就会抓狂了。

Camel Case

(这个没法翻译,这就是个名字,翻译成骆驼风格,整个人都不好了)这个命名风格要求如果变量里头包含了多个英文单词的时候,最好把这个单词的首字母大写。请看例子,比如我要命名一个这样的变量whatIHadForBreakfast,来存储我早餐吃了什么,是不是比whatihadforbreakfast好多了。这就是Camel Case,为什么叫骆驼风格呢,你看那些夹杂着大写的变量名是不是很像驼峰(哈哈哈,这就是西方的幽默,我也不知道哪里好笑)。这是一个在Python里头很方便也很常用的东西,虽然你可以不这么做,但是做事情要有规矩,命名也就是个规矩。多个单词组成的变量,从第二个单词开始首字母大写会大大增强代码的可读性(纳尼,我的程序为什么要给人家读,小样的,不然你以后自己读起来也痛苦)。

作业时间

1.下面的代码输出的是啥?

>>> spam = 20

>>> spam

2.下面的代码输出的又是啥?

>>> spam = 20

>>> spam = 30

>>> spam

3.下面的代码输出的又是啥?

>>> spam  20

>>> spam = spam + 20

>>> spam

4.下面的代码输出的又是啥?

>>> spam = 20

>>> spam + 20

40

>>> spam

5.下面的代码输出的又是啥?

>>> spam = 20

>>> SPAM = 30

>>> spam

6.下面的代码输出的又是啥?

>>> spam =

7.下面的代码输出的又是啥?

>>> monkeyplumber

8.下面的代码那些是表达式,那些是语句?

>>> 2 + 2

4

>>> spam = 42

9.下面的代码那些是表达式还是语句?

>>> 5

5

答案:1.20;2.30;3.40;4.20;5.20;6.程序会出错,因为变量赋值语句缺失值;

7.程序出错,因为变量没有定义;8.2+2是表达式,spam=42是语句;9.表达式

为何破解密码的内容还未到?

很快就到了,我们不会学太多的预备知识,我们还有一个章节编程的内容需要学习.

本章节你学到了Python语言的基本的编程知识,以及如何在命令行里头执行代码.Python语言需要你告诉计算机应该怎么去做,计算机没有常识不会明白你的言语,只能通过一些简单的指令去工作.你已经学习了估值表达式,这个东东就是值和操作符号(正如+和-)的集合.同时你知道了你如何能把某个值存到变量里头,以便下次使用.

命令行是学习Python一个很有用的工具,因为每次你敲了语句都可以看到执行的结果.让我们到下一个章节,掌握了更多的基础知识,你就可以完成你的第一个程序了.

你可能感兴趣的:(破解密码那些事儿(chapter 3,初识Python,下))