运算、变量
2.1计算机会算术
1.数值运算
+
-
*
/
**
% 取余数 10%3 10除以3的余数
除了常见的数值运算,字符串也能进行加法乘法运算。
2.逻辑运算
在Python中,我们使用True和False两个关键字来表示真假。True和False 这样的数据被称为布尔值(Boolean)。
用“而且”连接起来的两个命题分别为真,那么整体命题就是真。这就是“与”运算,两个子命题必须都为真时,用“与”连接起来的复合命题才是真。在Python中,我们用and来表示“与”。
>>>True and True #结果为True
>>>False and True #结果为False
>>>False and False #结果为False
Python用or来进行“或”的逻辑运算。
>>>True or True # 结果为 True
>>>True or False # 结果为 True
>>>False or False # 结果为 False
最后,还有一种称为非的逻辑运算,其实就是对一个命题求反。Python 使用not表示。
>>>not True # 结果为 False
3.判断表达式
>>>1 == 1 #结果为True
符号==表示了相等的关系。此外,还有其他的判断运算符:
>>>8.0 != 8.0 # !=,不等于
>>>4 < 5 # <, 小于
>>>3 <= 3 # <=, 小于或等于
>>>4 > 5 # >, 大于
>>>4 >= 0 # >=, 大于等于
综合运用:房产价格86万元,税 率15%,首付20%。假如我手里有40万元的现金。出于税务原因,我还希望自己付的税款低于13万元,那么是否还可以买这套房子?这个问题可以借用Python进行计算。
>>>860000*(0.15 + 0.2) <= 400000 and 860000*0.15 < 130000
答案是True,可以买房!
4.运算优先级
如果一个表达式中出现多个运算符,就要考虑运算优先级的问题。 不同的运算符号优先级不同:
乘方:**
乘除:* /
加减:+ -
判断:== > >= < <=
逻辑:! and or
()括号可以打破优先级
2.2 计算机记性好
1.变量革命
新建变量时,计算机在空闲的内存中开辟存储空间,用来存储数据。和内存地址不同的是,根据变量的类型,分配的存储空间会有大小变化。程序员给变量起一个变量名,在程序中作为该变量空间的索引。数据交给变量,然后在需要的时候通 过变量的名字来提取数据。
把数值交给变量保存,这个过程称为赋值(Assignment)。Python中用等号=来表示赋值。从硬件的角度来看,给变量赋值的过程,就是把数据存入内存的过程。变量就像能装数据的小房间,变量名是门牌号。赋值操作是让某个客人前往该房间。
变量名直接参与运算,这是迈向抽象思维的第一步。
变量提供的符号化表达方式,是实现代码复用的第一步。
#之前的代码可以写成
total = 860000
requirement = total*(0.15 + 0.2)
print(requirement) # 打印结果 301000.0
#每次在使用程序时,只需更改860000这个数值就可以了
2.变量类型
后赋予给变量的值替换了变量原来的值。Python能自由改变变量类型的特征被称为动态类型(Dynamic Typing)
在静态类型(Static Typing)的语言中,变量有事先说明好的类型。特定类型的数据必须存入特定类型的变量。
静态类型语言中,新建变量必须说明类型,动态类型的语言看起来不需要说明类型,但其实是把区分类型的工作交给解释器。
Python解释器贴心的服务让编程更加方便,但也把计算机的一部分能力用于支持动态类型上。这也是Python 的速度不如C语言等静态类型语言的一个原因
Python的变量本身还是有类型的。我们可以用type()这一函数来查看变量的类型。
>>>a = 100 # 整型
>>>a = 100.0 # 浮点型
>>>a = 'abc' # 字符串。也可以使用双引号“abc”标记字符串。
>>>a = True # 布尔值
计算机需要用不同的方式来存储不同的类型。每种数据所需的存储空间也不同。计算机的存储空间以位(bit)为单位,每一位能存储一个0或1的数字。为了记录一个布尔值,我们只需让1代表真值,0代表假值就可以。所以布尔值的存储只需要1位。对于整数4来说,变换成 二进制位100。为了存储它,存储空间至少要有3位,分别记录1、0、0。
3.序列
Python中一些类型的变量,能像一个容器一样,收纳多个数据。序列(Sequence)和词典(Dictionary)都是容器型变量。
序列包含的一个数据被称为序列的一个元素(element),序列有两种,元组(Tuple)和列表(List)。两者的主要区别在于,一旦建立,元组(定值表)的各个元素不可再变更,而列表元素可以变更。
>>>example_tuple = (2, 1.3, "love", 5.6, 9, 12, False) # 一个元组
>>>example_list = [True, 5, "smile"] # 一个列表
>>>type(example_tuple) # 结果为’tuple'
>>>type(example list) # 结果为'list'
#还可以在列表中嵌套另一个列表 或者 空列表
>>>nest_list = [1,[3,4,5]]
>>>empty_list = []
序列元素的位置索引称为下标(Index)。Python中序列的下标从0 开始。
>>>example_tuple[0] #结果为2
>>>example_list[2] #结果为’smile'
>>>nest_list[1][2] #结果为5
表的数据可变更,因此可以对单个元素进行赋值。元组不能赋值。
对于序列来说,除了可以用下标来找到单个元素外,还可以通过范围引用的方式,来找到多个元素。范围引用的基本样式是:序列名[下限:上限:步长]
4.词典
词典不是以位置来作为索引的。词典允许用自定义的方式来建立数据的索引。词典的元素包含两部分,键(Key)和值(Value)。键是数据的索引,值是数据本身。键和值一一对应。
>>>example_dict = ("tom":ll,"sam":57,"lily":100}
>>>type(example dict) # 结果为'diet'
>>>example_dict["tom"] # 结果为 11
在词典中修改或增添一个元素的值:
>>>example_dict["tom"] = 30
>>>example_dict["lilei"] = 99
»>example_dict # 结果为{”tom”: 30, "lily": 100, "lilei": 99, "sam": 57}
#构建一个新的空的词典:
>>>example_dict = {}
>>>example dict # 结果为{}
#词典不具备序列那样的连续有序性,所以适于存储结构松散的一组数据。
#比如首付比例和税率可以存在同一个词典中:
rate = {"premium": 0.2, "tax": 0.15}
明早再见友友们