上一节课
变量与类型
咱们接着上一节课的内容,打开你的Terminal中的Python解释器,继续学习。
(由于初始内容比较简单,只需要在Python解释器中练习就可以了,感兴趣的读者可以在Atom里面敲Python代码并Command + i
运行,但这个方法不做要求)
读者朋友可能发现了,Python解释器可以当Windows或者Mac里面的计算器来用。比如笔记哥今天出门买了菜, 回家要算总账:
蓝莓一磅 $2.99 我买了2磅
车厘子一磅 $4.99 我买了6磅
龙虾一磅 $8.99 我买的那一只是1.5磅
(以上为疫情前打折时大纽约地区某超市的物价)
现在我要算算今天一共花了多少绿币,用Python解释器,敲:
>>>2.99 * 2 + 4.99 * 6 + 8.99 * 1.5 (然后按回车)
49.405
四舍五入,49.41美元,正确。
恭喜你,你已经可以使用Python解决中国大陆小学三四年级的应用题了。
接下来,你可能问,假如我想引入小学五六年级学的未知数的概念,比如我们买的蓝莓、车厘子、龙虾的单价都已经确定,但我买的重量是不定的、变化的,Python能帮我算出来吗?
当然可以!这里面就引入了我们这个话题里提到的变量。在Python等编程语言中,你可以把“变量”理解为小学五六年级时候学的未知数。未知数(变量)是运动着的、变化着的数。
具体拿回这道题来说,我们可以设三个变量x, y, z
去分别代表买了的蓝莓、车厘子和龙虾的重量。
而且Python中的变量起名与小学数学学到的未知数基本类同,用x, y, z
这样的字母肯定没问题。
但是,在Python中,当我们定义一个变量的时候,是要给它一个初始值,而不能只是光溜溜的写一个x
放在那里完事。下面,我们就先给这三个变量都初始为0,看看结果是怎样。
>>>x = 0 (回车)
>>>y = 0 (回车)
>>>z = 0 (回车)
你可能会说,为啥我敲完这些,Python解释器都没给我反馈呢?我咋知道x
是不是真的等于0了,y
是不是真的等于0了?
别急!
首先我要告诉你,在编程世界里,单个的等号=
一般我们不叫它“等于”,而是叫赋值,或者说把什么什么值赋给了什么。x=0
的意思是:把0
这个值,赋给了x
。
然后,你想看x
被赋予0
这个值以后,是否真的等于0了,可以用我们上节课学到的print('你好, python')
这个例子中的print()
函数,在解释器中打:
>>>print(x) (回车)
0 (你看到的结果)
>>>print(z)
0
看来,Python果然没有骗我们,给变量赋了什么值,变量它就真的等于了什么。所以啊,现在你稍微花1分钟想想,笔记哥今天买的2磅蓝莓、6磅车厘子、1.5磅龙虾,用三个变量来存储这三种商品的重量,最后算总价,可以在Python里怎么写呢?
(1分钟过去,公布答案)
>>> x = 2
>>> y = 6
>>> z = 1.5
>>> 2.99 * x + 4.99 * y + 8.99 * 1.5
49.405
OK,你做对了吗?
小结一下:Python中的变量,相当于算术里的未知数。在Python中,一个变量还可以看作是指向某个值的名字。比如x=2
,可以看作是有一个指向数字2
的名叫x
的名字。
然后,每一个变量,或者更准确的说,每一个值,都是有其类型的。比如,数字2
,它在Python中是整数(int)类型,数字2.99
,在Python中是浮点(float)类型,一句短语'你好,python'
在Python中是字符串(str)类型。这些类型,我们都可以通过Python自带的(built-in)函数type()
进行查看。比如:
>>> type(2)
<class 'int'>
>>> type(2.99)
<class 'float'>
>>> type('你好,python ')
<class 'str'>
上面显示的<class 'int'>
中,class就是”类型”的意思,在计算机科学的语境中还可翻译做”类”;’int’就是英语单词integer(整数)的缩写。str
是英语单词”string”(字符串)的缩写。
说到string,特别提一下,在Python中,既可以用英语字母输入法下的单引号,也可以用双引号来表示一段字符串。比如我们打
>>> type("你好,python ")
<class 'str'>
得到的效果是一样的。笔记哥个人习惯用单引号来表示字符串。当然,当我要用双重引用的时候,比如某某人说什么,我会同时用到单引号和双引号,如下:
>>>print('John said to me, "he just fell in love with Jane."')
John said to me, "he just fell in love with Jane."
假如我们没有把单引号或者双引号配对好,比如上面的例子中,最后一个单引号我给漏打了,那么Python就会给咱们报错。
>>> print('John said to me, "he just fell in love with Jane.")
File "<stdin>", line 1
print('John said to me, "he just fell in love with Jane.")
^
SyntaxError: EOL while scanning string literal
新朋友一看到报错可能会觉得很郁闷,但报错其实是Python以及其他编程语言的一个很好的功用。毕竟,即便是程序员老手,也很难保证写出来的代码一遍就全对了。报错中的信息是在告诉我们,哪儿出错了,出了什么错。只有根据出了什么错,我们才好有针对性的把代码改对。
比如上面的信息,“SyntaxError: EOL while scanning string literal”,告诉我们这里有个句法错误, EOL就是end of line(行尾)的意思,当扫描这个字符串内容的时候,我们在行尾发现了错误,然后那个⏫的小箭头其实就是提醒我们,这儿少了什么东西。少的东西其实就是后单引号。
变量名与关键字
变量名的起名跟咱们人的起名一样,都是有一定法则的。我想,你在现实生活中应该没有见过一位名叫7983滨
的哥们吧。
Python变量名的起名大致符合如下三点就都是合法的变量名:
- 不以数字开头
- 不包含除了下划线
_
之外的特殊字符 - 不使用Python语言中的关键字
假如你故意违背上述三原则,那么Python解释器会告诉你invalid syntax
(非法句法)的错误。如下:
>>> 7983bin = '李滨'
File "<stdin>", line 1
7983bin = '李滨'
^
SyntaxError: invalid syntax
>>> price@ = 2.99
File "<stdin>", line 1
price@ = 2.99
^
SyntaxError: invalid syntax
>>> class = '三年4班'
File "<stdin>", line 1
class = '三年4班'
^
SyntaxError: invalid syntax
这里面要特别提一下Python的保留关键字,在我们免费小课的第一讲中,我提到Python当中有30个保留关键字,比英语单词的17万多个单词要少多了,所以Python比英语要好学。这里更正一个错误,至少我看到的材料,Python是有35个保留关键字,而不是30个。上次说的30个我是照搬照抄了Dr. Chuck Severance老爷子书里的一张图。这里更新说,Python是有35个保留关键字,也是源于那本书里后续的一张图。
先前第一课的图中,少包括的5个Python保留关键字为True
, False
, None
, async
和await
。
Python的35个保留关键字,图片来自《Python for Everybody》一书
总之,不要使用Python的保留关键字直接作为变量的名字。但如果你稍微改造一下,比如
>>> class1 = '四年5班'
这个class1
就是一个合法的变量名。
敲黑板:选择对人类有意义的变量名
在已经实现变量名合法的前提下,你给你的变量起什么名字理论上就可以随心所欲了。比如,我们上次例子提到的买菜,你可以把蓝莓、车厘子、龙虾的重量分别用变量名x, y, z
表示,也可以你突发奇想用一些散列码来表示它们(读者朋友不明白什么是散列码没有关系,可以先理解为混乱的人类难以懂的不容易重复的一段编码),比如你用a9k783j, x50z7y3, m8lev1n
>>> a9k783j = 2
>>> x50z7y3 = 6
>>> m8lev1n = 1.5
>>> 2.99 * a9k783j + 4.99 * x50z7y3 + 8.99 * m8lev1n
49.405
(👆为一个不好的例子,请勿模仿!!)
你最终也是能算到正确的答案。且在Python的眼中(假如Python语言有眼的话),无论表示蓝莓重量的变量名是叫x
还是叫a9k783j
,都是一样的,它们都是内存的同一段地址片段,储存着一个小数(准确的讲浮点数)或者整数值。这x
或a9k783j
这样的名字,只是表示对这个地址片段的指向。唯有那个数字2
,才是地址片段里面的内容。Python语言不关心这个指向的名字叫什么,只要保证它没把指向所指的地址片段里面的内容搞错,就OK的了。
但是,但是,但是,重要的事情说三遍!我们是人类。你能够容忍你以后的工作队友,在其变量名的时候,给你编个a9k783j
这样的名字吗?显然,这是反人类直觉的,也使得写出来的代码难以维护。所以,在现实学习工作中,我们强烈建议读者朋友们
具体贴近所描述的事物,使用人类易懂的名词
就着三样商品的重量而言,取名x, y, z
还不是最好的,更好的变量命名选择,我给大家看一下:
>>> blueberry_weight = 2
>>> cherry_weight = 6
>>> lobster_weight = 1.5
>>> 2.99 * blueberry_weight + 4.99 * cherry_weight + 8.99 * lobster_weight
49.405
怎么样,是不是一目了然知道这三个变量分别是啥意思啦。我们当中的小朋友读者如果英文不太跟上,用拼音来做变量名,比如lanmei_zhongliang
(蓝莓重量)也是可以的,这都比x
,更比a9k783j
要易懂,好维护。
语句和表达式
这一小节,我干脆就把这一章标题当中提到的剩下两个名词给大家讲了。第二章的标题中讲了三个名词“变量”、“表达式”和“语句”。朋友们到现在对变量应该不陌生了。说说表达式和语句。
这俩其实就纯概念,大家知道一下就行,不用死记硬背。
语句英文叫Statement。Python中的Statement包含两种类型,一种是表达式(英文叫Expression),另一种就是赋值语句(Assignment Statement)。这个赋值语句就是我们上节讲的左边未知数中间有一个等号右边是一个值(或者表达式)类似x=2
这样的东西。
所以“语句”相当于是一个大的概念集合,而“表达式”和“赋值语句”,相当于“语句”这个集合之下的两个子集。
好,下面来看我们做过的这个计算过程,哪些是表达式,哪些是赋值语句?
>>> blueberry_weight = 2
>>> cherry_weight = 6
>>> lobster_weight = 1.5
>>> 2.99 * blueberry_weight + 4.99 * cherry_weight + 8.99 * lobster_weight
49.405
显然,计算过程的头三行,都是赋值语句。
blueberry_weight = 2
cherry_weight = 6
lobster_weight = 1.5
第四行的
2.99 * blueberry_weight + 4.99 * cherry_weight + 8.99 * lobster_weight
是一个表达式。
最后第五行那个又是啥?
49.405
这是表达式运算出来的结果嘛。
运算元、运算符和运算顺序
这一节相当于讲小学的四则混合运算。所以我说这个Python小课真的很适合给小朋友做编程语言入门课,因为可以直接对接他们的日常所学。当然,咱们大朋友也可做个简要复习。
运算元 (Operand) 的意思其实就是参与运算的数或者变量。比如3 + x
里面的3
和x
就是这个表达式中的两个运算元。
运算符 (Operator) 的意思是运算符,比如加法运算中的+
号。
这一节介绍五种Python基本运算,如下:
+ 加法运算
- 减法运算
* 乘法运算
/ 除法运算
** 乘方(或者叫求幂)运算
前面四种运算跟我们用电脑键盘调用计算器程序所用的符号是一样的,就乘方运算比较特殊。比如你要计算3的平方,按电脑里的计算器APP,你会这么按键:
按键:3 ^ 2
得到结果:9
在Python解释器中个,你需要这么打:
>>> 3 ** 2
9
在你明白四则运算顺序的情况下,Python表达式的计算顺序跟四则运算基本一致,我给出了如下16字中文口诀:
括号优先
乘方次之
乘除第三
加减最后
所以,86 - (2.75 + 5.25) ** (5 - 3)
。这个运算顺序我就不多讲了,肯定难不倒你,不太确定顺序的朋友可以把这个表达式放到Python解释器里跑一跑,就能得到笔记哥的年龄~
求商与求余
Python3语言下的四则运算中,除法运算是比较特别的一点。
我们可以通过/
, //
, %
来分别实现 计算器里面常见的一般除法、专门求商的除法、专门求余数的除法。
比如:
>>> 7 / 3
2.3333333333333335 (与计算器得到的结果基本一致,最后一位为什么为5,这里先不解释)
>>> 7 // 3
2 (商为2)
>>> 7 % 3
1 (余数为1)
请注意,以上的运算结果都是在Python3语言下的。如果你使用了Python2,那么7 / 3
得到的结果为2,Python2自动给你省去小数点后的3333333333333335
。但Python2已逐步不再被Python社区维护,且我们这个小课是学习Python3,所以你只需要知道这么个情况就行。除法在Python3中的三种应用请记住👆的例子就好。
字符串的一些运算
Python除了支持数字的运算,也支持字符串的两种简单运算:+
与 *
。
在字符串的世界里,+
不交加法,而是叫concatenation,中文意思是”(字符串的)连接”。
比如:
两个数字相加的例子:
>>> first = 19
>>> second = 84
>>> print(first + second)
103
两个字符串相连接的例子:
>>> first = '19' (19由于带上了前后单引号,所以表示的是一个内容为19的字符串)
>>> second = '84' (84由于带上了前后单引号,所以表示的是一个内容为84的字符串)
>>> print(first + second)
1984
但不知道为什么,Python是不支持字符串和数字直接相连的,比如:
>>> first = '19'
>>> second = 84
>>> print(first + second)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
这个报错是说,我Python语言只能连接字符串(而不是整数)与字符串。
虽然笔记哥不太喜欢Python的这一点,比如在其他语言中,其他语言会把整数自动转化为字符串进行连接操作。但,在Python的世界里,我们还是应该遵守Python的规则。
字符串的乘法挺有趣的,就好比小朋友小时候被老师要求学写字,一个字要写上10遍。
在Python的世界里,写字写10遍可以用字符串乘以数字10来完成。比如,一些台湾朋友常常说大陆为什么要搞简化字啊?大陆朋友可以举出”乌龟”这个词手写10遍的例子让台湾朋友常常滋味
简化字版
>>> turtle = '乌龟'
>>> print(turtle * 10)
繁体字版
>>> turtle = '烏龜'
>>> print(turtle * 10)
烏龜烏龜烏龜烏龜烏龜烏龜烏龜烏龜烏龜烏龜
比比看誰寫的更快?
读取用户输入
我们所写的程序肯定希望能够贴近用户的需求。这就要求我们的程序能够从用户那里得到一些输入信息。
在Python的世界里,或许用户从键盘端的输入还是蛮简单的,只要用一个名叫input()
的函数。
在Python解释器下,我们输入一下input()
函数:
>>> input()
[光标自动移到下一行]
在光标所在的一行,我们随便打打字,比如中文我想说啥?我也不知道
>>> input()
我想说啥?我也不知道 [在原来的光标所在行打下这些字]
'我想说啥?我也不知道' [原光标的下方自动呈现出你,作为用户,打下的字]
input()
函数里可以带上你希望用户看到的提示词,string类型的提示词。而input()
函数的到的结果,也可以存到一个变量里,通过打印这个变量,你会发现input()
函数的返回结果也是属于string类型。
>>> inp = input('Enter your name please:')
Enter your name please:代码笔记哥 [“代码笔记哥”为我,作为用户,输入的]
>>> print(inp)
代码笔记哥
那,假如我们要打出通过用户输入、得到一个可以用于数学计算的整数或者浮点类型,应该怎么办呢?从上面内容我们知道,如果我们只是通过input()
函数,并且假定用户也输了一个数字,比如12.75
,我们所得到的只是一个内容为”12.75”的string类型变量。好在,Python为我们准备了int()
和float()
函数,你可以把这两个函数翻译为“整数化”和“浮点数化”。顾名思义,它们可以把input()
函数得出的结果(string型)转换为int型或float型。
>>> inp = int(input('Please enter your age:'))
Please enter your age:23
>>> print(inp + 1)
24
代码注释
注释指示代码当中用于解释或提醒程序员的文字内容,不参与代码的执行。在Python中,代码注释有两种方法。
如果注释内容是短内容,可以使用#
号,然后把你要写的注释写在后面。
# 华氏温标转为摄氏温标的计算方法
celcius = (fahrenheit - 32) * 5 / 9
如果注释内容是长内容,可以使用三个单引号'''
号开始,再来三个单引号'''
号结束的方式,把你要写的注释写在上下单引号之间。
'''
这是一段长注释,
下面这段代码
讲的是对冲基金中的风险分析的算法
'''
def risk_analysis(inp, risk_factor):
# ...
# ...
布置作业
好,讲到这里,你已经学完了Python小课第2课“变量、表达式和语句”的所有内容。
下面,请你做一点题目练练手吧。
第1题:
写一个Python程序询问用户的名字,并问候用户。程序的样例输出如下:
告诉我你的名字:王小亮
你好,王小亮
第2题:算工资。
写一个Python程序询问用户的工作时长和小时薪资,而后打印出用户得到的工资。程序的样例输出如下:
How many hours do you work: 40
What is your hourly rate: 35.85
Pay: 1,434
总结
总结一下。第二章的内容主要是让读者朋友们了解变量、表达式和语句这些Python程序的最简单的基石,并用Terminal打开Python解释器写一些简单的Python程序。
喜欢我内容的朋友可以在YouTube或微信公众号搜索“代码笔记哥”订阅我。