大家在上一章中已经可以自己敲出一个猜数字小游戏了,先不要删掉它,以后我们慢慢来改进它。接下来呢,我们再继续学习一些必学的基础知识。
上一章我们简单提到过一次变量,我们称它为一个“容器”,可以存放“任意”东西的“容器”。
变量从字面意思来看就是可以变化的量;它并不是一个值,而是内存中的一个地址。什么意思?通俗点讲,当你定义一个e = 3的时候,我们会把数字“3”放到一个贴着标签“e”的罐子里,并且这个罐子是放置在壁橱的“第三层第二列”的格子里;我简单画了一张图示:
上面只是个比喻,实际上在我们定义“e = 3”时,系统在内存中会给“e”一个地址,这个地址可以比喻成“e”这个罐子所在的位置,而这个“e”只是代表一个标签(或者说是一个名字),然后数字“3”被放置在里面,“3”才是罐子“e”里面的内容;从而“e = 3”这样一个代码的执行就完成了。
看下面的例子:
a = 4
b = 5
print(a)
print(b)
结果:
结果显而易见,a和b分别存储了4和5,那怎么体现它是可变的呢?看下面的例子:
a = 4
b = 5
print(a+b)
a = "Li"
b = 'Wang'
print(a)
print(b)
结果:
结果很明显吧,第一次给a和b分别赋值4和5,然后print了一个a+b,结果是9,也说明print内是可以写一个运算式的;第二次我们给a和b分别赋值了两个字符串,然后打印出来的就是这两个字符串,从而说明这是个变量而不是常量。你想问既然数字可以加,那字符串可以加吗?当然可以,不信你可以自己运行一下下面的代码:
a = "Li"
b = "Wang"
print(a + b)
结果:
LiWang
结果很显然,那字符串之间是怎么进行“加法”的?其实就是把两个字符串拼接起来,所以更准确的说,字符串之间的“加法”其实就是字符串的拼接;再试试看下面的代码:
print(1 + 2)
print("Li" + "Wang")
print(1 + "Li")
前两行代码我们肯定都知道输出分别使用了数学运算和字符串的拼接,结果分别为“3”和“LiWang”;但是第三行会成功输出“1Li”吗?答案是不会的,它会报错:
TypeError: unsupported operand type(s) for +: 'int' and 'str'
我们还没有讲过关于“报错”的知识,这里出现了一个名为“TypeError”的报错,“Type”是英文单词“种类,类型”的意思,所以这里也意味着“类型错误”,当然后面也有详细的解释:不支持将“int”类型与“str”类型使用“+”进行相加;这表示我们不能将两个不同类型的元素进行相加,不过这也是理所当然的,毕竟马和驴能生出骡子的事情在编程语言中是不可能存在的。
整型非整形,而是表示【整数类型】,这种类型在任何一门计算机语言中基本都是最常用的,整型是有大小范围的,做不到像数学中的无限大和无限小,python中的整型相当于C中的长整型(不清楚什么是长整型也没关系),它的大小只受限于系统的位数(位数肯定知道吧,常用的电脑分为32位和64位操作系统),32位机器上的整型是32位大小,64位机器上的整型是64位大小;之前在学C的时候,整型的范围多是-32768~32767,实际上是-2^16 ~ 2^16 - 1(“尖角号”代表幂次方),相当于是16位的大小,那在32位系统以及64位系统中,整型的范围也自然变化为:-2^32 ~ 2^32 - 1 和 -2^64 ~ 2^64 -1 这两个范围,这些数字不必太刻意的背,先记住整型肯定是整数就对了。
浮点型就是我们平时说的小数,因为小数都有一个小数点,所以称为“浮点型”,类似于C中的双精度浮点型(double),其精度信息和内部表示可以从sys.float_info中获得;同样受系统位数影响,浮点型字面值可以用十进制或科学计数法表示,在科学计数法中,e或E代表10,+(可以省略)或 - 表示指数的正负,关于浮点型简单一说就可以。
我们都知道像“1、2、3”这样的类型叫做int类型(整型),那像“a、b、c”这样的字母及一些特殊字符“%、*、@”呢?他们被统称为字符串类型,使用“str”表示,那怎么才能在代码中知道我们赋值的这个变量是什么类型呢?因为像“1、2、3”这样的既可以是数字也可以是字符,python的BIF里给了我们一个type()方法来获得类型名;等等,BIF是什么,好高级的样子。
BIF 是Built-in Functions的缩写,也就是内置函数的意思,像Python里的很多内置函数都是可以直接调用的,方便了程序员快速编写脚本。比如print就是一个内置函数,用来打印。input()也是一个内置函数,用来提示用户输入。
好,继续来说怎样使用type()这个BIF来获取数据类型信息,请看下面的代码:
a = 2
b = "Li"
print(type(a),type(b))
结果:
看到没有,第一个a的类型显示的为int,第二个b的类型显示为str字符类型
继续看下一个代码:
a = "Li"
print("大家好,我叫%s" % a)
b = 18
print("我今年%d岁了" % b,"(真年轻,啊哈哈)")
结果:
这里用了一个奇怪的字符,%s和%d是用来干嘛的,说明一下,我们在“大家好,我叫%s”中使用的“%s”表示这里需要填入一个字符串,然后在引号外面使用%a,表示将变量a中的字符串填入“%s”的位置,因此就会输出“大家好,我叫Li”;同理在“我今年%d岁了"”中,“%d”代表要填入一个整型,因此就输出了“我今年18岁了”,但细心的人发现了,为什么“%b”的后面有一个逗号,这是因为我们在这里使用print输出的是两个字符串,之间需要用逗号隔开。
扩展一下,除了用%号来格式化还有其他的方法吗?有的,python还给了我们一个叫format的方法,代码如下:
a = "Li"
b = 18
print("大家好,我叫{name},今年{age}岁了".format(name=a, age=b))
结果:
结果如出一辙吧,这里我们在输出字符串后使用了format内置函数,并且在括号内定义了name和age两个位置应该显示的结果;另外其实还有一种更简洁的方式,如下:
name = "Li"
age = 18
print(f"大家好,我叫{name},今年{age}岁了")
结果同样可观,而且足够简洁,简洁到“变态”,“变态”到足够“优雅”;我们只需要在整个需要输出的字符串前加一个“f”,然后字符串中的{ }会找到同名的变量并且输出。
什么是原始字符串?它并不是代表原始人使用的字符串,像甲骨文等,它只是代表我们想要将字符串一模一样、原封不动的输出的“诉求”,为什么会有这种“诉求”?下面有一行代码,我们看看输出和想象中一样吗?
print("\time \home \name")
没有看错,输出的是不是很奇怪?是不是第一个t没了,而变成了一个Tab缩进,name的n也没了,变成了换行。没错,在python中,\t 为制表符,代表一个缩进,\n为换行符,表示要换行输出,这些我们都称之为转义字符,当然还有其他很多种转义字符,用于表示字母及常用符号无法表示的操作,比如换行和锁进等;是不是有点伤脑筋了,那这样我怎么才能输出我想要的结果呢?没关系,python肯定已经想到了这样的问题,所以我们可以在"\n"前面再加一个"\"用来格式化转义字符;它的意义就是将“\t”、“\n”等字符当成字符串正常输出;代码如下:
print("\\time \home \\name")
这样的输出就会变成我们需要的输出,那还有没有更简单的方式呢,每个’\‘前面都要加一个’\’,那岂不是很麻烦。答案是有的,这时就需要我们将要打印的字符转换成原始字符串,怎么转换呢,看代码:
print(r"\time \home \name")
有没有看到一个细微的变化,没错,我们在引号外加了一个"r",代表我们要将后边要打印的字符转换成原始字符串,这样就可以随心所欲的打印了。
我说 你是人间的四月天;
笑响点亮了四面风;
轻灵在春的光艳中交舞着变。
你是四月早天里的云烟,
黄昏吹着风的软,
星子在无意中闪,
细雨点洒在花前。
那轻,那娉婷,你是,
鲜妍百花的冠冕你戴着,
你是天真,庄严,
你是夜夜的月圆。
雪化后那片鹅黄,你像;
新鲜初放芽的绿,你是;
柔嫩喜悦,
水光浮动着你梦期待中白莲。
你是一树一树的花开,
是燕在梁间呢喃,
——你是爱,是暖,是希望,
你是人间的四月天
哇,好有诗意的感觉,为啥要用这首当代诗开头呢,因为这整首诗就是我们的长字符串,我们要想把这首诗按照这个排版打印出来,按照我们学过的知识,是不是要这样打印:
print("我说 你是人间的四月天;\n 笑响点亮了四面风;\n 轻灵在春的光艳中交舞着变。\n 你是四月早天里的云烟,\n。。。")
是不是要在每个换行之前加一个换行符"\n",那这工程量可就大了去了,那有没有什么好方法呢,答案还是有的,我们可以这样:
a = """
我说 你是人间的四月天;
笑响点亮了四面风;
轻灵在春的光艳中交舞着变。
你是四月早天里的云烟,
黄昏吹着风的软,
星子在无意中闪,
细雨点洒在花前。
那轻,那娉婷,你是,
鲜妍百花的冠冕你戴着,
你是天真,庄严,
你是夜夜的月圆。
雪化后那片鹅黄,你像;
新鲜初放芽的绿,你是;
柔嫩喜悦,
水光浮动着你梦期待中白莲。
你是一树一树的花开,
是燕在梁间呢喃,
——你是爱,是暖,是希望,
你是人间的四月天
"""
print(a)
结果:
我说 你是人间的四月天;
笑响点亮了四面风;
轻灵在春的光艳中交舞着变。
你是四月早天里的云烟,
黄昏吹着风的软,
星子在无意中闪,
细雨点洒在花前。
那轻,那娉婷,你是,
鲜妍百花的冠冕你戴着,
你是天真,庄严,
你是夜夜的月圆。
雪化后那片鹅黄,你像;
新鲜初放芽的绿,你是;
柔嫩喜悦,
水光浮动着你梦期待中白莲。
你是一树一树的花开,
是燕在梁间呢喃,
——你是爱,是暖,是希望,
你是人间的四月天
Process finished with exit code 0
前后各三个引号来表明这是一个长字符串,这样就会原封不动的打印出来了,这样确实很方便。
下面是常用的运算及关系字符:
+ :加法
- :减法
* :乘法
* * :幂运算
/ :除法
// :整除
% :余除
< :小于
> :大于
<= :小于等于
>= :大于等于
== :判断等于
!= :判断不等于
加法,减法和乘法应该不需要再说了,毕竟都是上过学的人。
我们先将下面的几行代码敲下来,注意从中观察"/", “//”, "%"都是除法,但是有什么不同。
print(3 ** 3)
print(9 / 2)
print(9 // 2)
print(9 % 2)
输出是不是这样的:
27
4.5
4
1
现在可以解释一下了,我们接触最多的就是这个’/‘最普通的除法,这和我们平时的运算是最合乎常理的,9除以2本来就是4.5嘛,然而这个’//'呢,被称为取整,也就是我们只取除过后的整数部分,所以"%"这个取余就是取余数部分了,像是我们小时候学过的(9 除以 2 = 4 ······1)
然后我们再敲一下下面的代码:
print(3 > 5)
print(5 >= 5)
print(6 < 8)
print(4 == 4)
print(4 != 5)
结果
False
True
True
True
True
怎么我输入的是数字,但打印的是一串字符呢,因为<,>号本来就是关系判断符,既然是判断,那就有对有错,False和True正好是英文中的对与错的意思,“==”就是判断两边数值是否相等,“!=”则判断两边数值是否不等,接下来就来了解一下python中的布尔类型。
其实在python中布尔类型中的False和True分别被当做0和1来对待的,即假和真。包括下面这样的计算也是可以的。
print(True + True)
print(False + True)
结果
2
1
有没有发现,在Python中True和False确实是被当成了1 和 0.
但如果你真想把这两个布尔类型放到数学计算中去用,那可真是不合逻辑了,为啥丢了西瓜捡芝麻。
既然牵扯到了运算的问题,那肯定就会有优先级的问题,那么在python中,数值运算的优先级是怎样的呢?大家在上小学的时候都背过“先乘除,后加减”吧,没错,在Python中数值运算也是一样的,如果要先进行加减运算呢,那就用一个小括号把要先进行计算的括起来。
还有其实像下面的两个式子是一样的,不用担心
-5 * 7 + 7 * -9
(-5) * 7 + 7 * (-9)
在python中负数即使不用括号括起来也是没问题的。
python中的逻辑操作符有:
and
or
not
and也就是并且的意思,其要求两边的式子同时为真则为真。
or也就是或者的意思,要求两边一边为真则为真。
not也就是取反的意思,not真则为假,not假则为真。
看下面的代码
print( True and True)
print(True or False)
print(not True)
结果
True
True
False
很好理解吧。
其实在python中还会有这样的式子
2 < 3 < 5
这其实是被解释成
2 < 3 and 3 < 5
这个做法在python中是被认可的,其他语言几乎都会报错,要记住。
在学习python之前,我们可能已经听说过在python中的变量是没有“类型”的,的确,变量在python中更像是一张“标签”,想怎么贴就怎么贴,我们可以直接通过“标签”来找到变量在内存中的位置;但也不能说python中绝对没有“数据类型”这一说,很纠结对不对?其实没必要纠结,有没有“数据类型”是理论上的疑问,并不会妨碍我们对python运用的掌握,所以我们不妨相信“python是有数据类型的”。
我们已经学习了字符串类型和布尔类型,那我们知道数字的类型都有哪些吗,我们今天先来了解一下数字中的整型和浮点型
整型,见字如面,也就是意味着整型就是整数的类型,也就是int型,没什么可说的了
那么浮点型呢,其实也就是相当于小数类型,在这里顺便引进一个科学计数法,毕竟小数点后有很多数的例子见多了。
a = 0.000000009
b = 9e-9
print(type(a),type(b))
print(a == b)
结果:
True
看到没有,float也就是我们所说的浮点型,并且这里运用了一个用“e”表示的科学计数法,如果想要表示很大的数呢,那就把“e”后面的“-”号去掉。是不是方便了很多。
然后再看一下下面的例子了解一下类型转换
a = 4
b = 3.87
c = "Li"
d = "5"
print(type(a),str(a),type(str(a)))
print(type(b),int(b),type(int(b)))
print(type(d),int(d),type(int(d)))
结果:
4
3
5
从上面我们可以看出将一个浮点数转换成整数之后,它会自动把小数点后的数给去掉;我们也可以把一个数字转换成字符串,也可以把由数字组成的字符串转换成int型,但可以把由多个字符组成的字符串转换成int型吗,答案是不能,如果强制转换就会报错。