2.1 变量和简单数据类型
数据具有不同的类型,计算机可以处理各种类型的数据,如数值、字符、图形、音频、视频和网页等,不同类型的数据支持不同的运算操作。计算机处理的数据通常存放于内存单元中,机器语言和汇编语言通过内存单元地址访问内存单元,而高级语言则通过内存单元命名访问内存单元,命名的内存单元一般称为变量。本节主要介绍Python语言中的标识符、常量和变量、基本数据类型、运算符和表达式等基础知识。
2.1.1 标识符和变量
1.标识符
标识符在不同的应用环境下有不同的含义,一般用于标识某个实体。在计算机编程语言中,标识符是命名变量和函数等名字的有效字符集合。在Python语言中,包、模块、类、函数和变量等的名称必须为合法有效的标识符。
(1)合法的标识符
在Python中,标识符包括英文字母、数字及下画线,但要符合以下规则。
● 标识符必须以字母或下画线开始,不能以数字开始。
● 标识符区分英文字母的大小写。
● 标识符中不能出现分隔符、标点符号或运算符。
● 标识符不能使用关键字。
● 最好不要使用内置模块名、类型名、函数名、已经导入的模块名及其成员名作为标识符。
例如,a_int、c_float和_strname为正确的标识符;而100int、yes=no和or为错误的标识符。
Python 3对包、模块、类、函数和变量等命名所遵循的一般规则主要如下。
● 包名和模块名全部采用小写字母,应简单或有意义,可以使用下画线以增加可读性,如math、sys。
● 函数名全部采用小写字母,可以使用下画线以增加可读性,如my_function()、swap()。
● 类名每个单词首字母为大写,其余均为小写,如MyClass、Student。
● 变量名全部为小写字母,应简单或有意义,可以使用下画线以增加可读性,如n、age、number。
● 常量名全部为大写字母,应简单或有意义,可以使用下画线以增加可读性,如MIN、MAX。
(2)关键字
关键字是预定义的保留标识符。关键字有特殊的固定语法含义,不能在程序中被用户定义为普通标识符,否则将会产生编译错误。Python 3的关键字如表2-1所示。
表2-1 Python 3关键字
(3)下画线标识符
通常以下画线起始的标识符具有特殊意义。
● 以单下画线起始(_xxx)的标识符代表不能直接访问的类属性,需要通过类提供的接口进行访问,不能用“from xxx import ∗”导入。
● 以双下画线起始(__xxx)的标识符代表类的私有成员。
● 以双下画线起始和结尾(__xxx__)的标识符代表Python中特殊方法专用的标识,如__init__代表类的构造函数。
2.常量和变量
Python 3的对象可分为不可变对象(immutable)和可变对象(mutable)。不可变对象一旦创建,其值在运行中不能修改,可变对象的值在运行中可以修改。Python程序中表示数据的量可以分为两种:常量(不可变对象)和变量(可变对象)。
(1)常量
常量是指在程序执行过程中,其值不能发生改变的量,如3、-6、35.8和"xyz"等。但Python语言不支持常量,即没有语法规则限制改变一个常量的值,Python语言只是使用约定,声明在程序运行中不会改变的量即为常量,通常使用全部大写字母(也可使用下画线增加可读性)表示常量名。例如,定义PI为常量的语句:>>>PI=3.14。
(2)变量
变量是指在程序执行过程中,其值可以发生改变的量。变量用变量名标识,如x、a1和n等为合法的变量名。
在Python中,不需要事先声明变量名及其类型,直接赋值使用即可根据变量的值自动创建各种类型的变量。例如,语句“n=5”,Python根据整数对象5自动创建了整型变量n,n指向整型对象5,即n赋值为5。
Python中的变量可指向某一个对象的引用,多个变量可以指向同一个对象。例如,语句“x=y=3”表示变量x和y指向整型对象3。
当给变量重新赋值时,并不改变原始对象的值,只是创建一个新对象,并由该变量指向新对象。例如,语句“n=10”表示新建一个整型对象10,并由变量n指向新的整型对象10,即变量值变为10。
2.1.2 基本数据类型
Python语言中提供了几种数据类型,包括数字(Number)、字符串(String)、列表(List)、元组(Tuple)、集合(Set)、字典(Dictionary)和序列(Sequence)等,下面分别进行介绍。
1.数字类型
数字属于Python不可变对象,即修改变量值时并不是真的修改变量的值,而是先把值存放到内存单元中,然后修改变量使其指向新的内存单元地址。Python中有4种数字类型,分别是int(整型)、float(浮点型)、bool(布尔型)和complex(复数型)。
(1)整型
整型数字就是没有小数部分的数值,包括正整数、0和负整数,且无大小限制。整数可以使用不同的进制来表示。
● 十进制整数。没有前缀,其数码为0~9,如12、9810和-167。
● 八进制整数。以0o作为前缀,其数码为0~7,八进制整数通常为无符号数,如0o13、0o100和0o2007,其对应的十进制数分别为11、64和1031。
● 十六进制整数。以0X或0x作为前缀,其数码为0~9,A~F或a~f(代表10~15),如0XB4、0xF0和0x34D,其对应的十进制数分别为180、240和845。
(2)浮点型
浮点型数字就是包含小数点的实数,如123.04、0.6789、-9.0909、56.3-e2、3.141e+18和-133.4e78等。
(3)布尔型
布尔型是用来表示逻辑“是”和“非”的一种类型,只有两个值,True和False。关于布尔值,Python中规定任何对象都可以用来判断其真假而用于条件、循环语句或逻辑运算中。对象判断中None、False、0值(0、0.0、0j)、空的序列值(''、[]、()),和空的映射值{}都为False;其他对象的值都为True。
(4)复数型
复数由两部分组成:实部和虚部。复数的基本形式为a+bj、a+bJ或complex(a,b)。其中,a是实部,b是虚部。如3.33j、-23-1.12j、-812. j、.156j、(9.19+3e-27j)、-3.12+0J和1.9+e-1j等。
2.字符串类型
字符串是Python中最常用的数据类型,可以使用单引号、双引号或三引号来创建字符串。如'Hello World'、"Python"、'''Yes123'''等。
3.其他类型
1)序列:序列是Python中一种最基本的数据结构,序列中每个元素都有一个与位置相关的序号,称为索引。通过索引可以访问序列元素,从而进行各种处理。
2)列表:列表是一种序列类型。用一对方括号“[]”将元素括起来,以逗号进行分隔。列表中元素的类型可以不相同,如[3,5,7.9]、['gkh', 'yuv',4]和[True,5,7, 'cde']等。
3)元组:元组也是一种序列类型。用一对圆括号“()”将元素括起来,以逗号隔开,元素类型可相同也可不同,如(2,4,6)、(False, 'abc',2)和('gkh', 'yuv',3.7)等。
4)集合:集合是无序但不重复元素的序列。用一对花括号“{}”将元素括起来,以逗号隔开,如{'Tom','Jim','Jack','Luse'}。
5)字典:字典是Python中唯一内建的映射类型,是一个无序的“键:值”对集合,可用来实现通过数据查找关联数据的功能。字典用大括号“{}”来表示,键和值之间用冒号隔开,如{'Jack':1134,'Tom':2310,'Luse':6617}。
列表、元组、集合和字典的使用详见第3章。
2.1.3 运算符和表达式
在计算机程序中,运算符是表示实现某种运算的符号。表达式是由运算符(操作符)和运算数(操作数)组成的式子,即操作数、运算符和圆括号按照一定规则连接起来组成表达式。运算符是表示对操作数进行何种运算的符号,如+、-、∗、/等运算。操作数包含常量、变量和函数等。表达式通过运算产生运算结果,返回结果对象,运算结果对象的类型由操作数和运算符共同决定。下面分别介绍运算符、表达式及其相关知识。
1.运算符
Python语言支持以下类型的运算符:算术运算符、关系(比较)运算符、赋值运算符、逻辑运算符、位运算符、成员运算符和身份运算符。
(1)算术运算符
算术运算符实现数学运算,其运算对象通常是数值型数据。Python中的算术运算符如表2-2所示,假设变量x为10,变量y为3。
表2-2 算术运算符
(2)关系运算符
关系运算符用于对两个值进行比较,即对两个操作数对象的大小关系进行判断,运算结果为True(真)或False(假)。Python中的关系运算符如表2-3所示,假设变量x为10,变量y为20。
表2-3 比较运算符
(3)赋值运算符
赋值运算要求左操作数对象必须是值可以修改的变量。Python中的赋值运算符如表2-4所示。
表2-4 赋值运算符
(4)逻辑运算符
逻辑运算符可以将多个关系运算连接起来,形成更复杂的条件判断。逻辑运算的运算结果为True(真)或False(假)。Python中的逻辑运算符如表2-5所示。如变量值为数值型,则0被认为是False,其余值均被认为是True。
表2-5 逻辑运算符
(5)位运算符
位运算符只适用于整数,运算规则是将整数转换为二进制形式(注意采用补码表示),按最低位对齐,缺少的高位补0,然后对二进制数进行逐位运算,最后将得到的二进制数据再转换为十进制数。Python中的位运算符如表2-6所示。假设变量x为0000 0001,变量y为0011 1101。
表2-6 位运算符
注意:按位取反时最高位(通常为符号位)也一起变反,因此,正数按位取反后变成了负数(符号位0变为1),而负数按位取反后变成了正数(符号位1变为0)。因此,按位取反的运算规则是:~0=1,~1=0,对于一个整数x来说,~x=-(x+1)。
例如,以8位二进制位为例计算~5。其计算过程如下。
● 变换为二进制数:(5)10=(00000101)2。
● 按位取反:~5=~(00000101)2=(11111010)2,最高位为1,因此它是一个负数的二进制补码形式。
● 转换为十进数:(11111010)2其对应的原码是(00000110)2(转换原则:除符号位外其余各位变反,然后整体加1,得到该整数的原码),其对应的十进制整数为-6。
(6)成员运算符
成员运算符用于判断一个可迭代对象(序列、集合或字典)中是否包含某个元素(成员)。Python中的成员运算符如表2-7所示。
表2-7 成员运算符
(7)身份运算符
身份运算符用于比较两个对象的存储单元是否相同。Python中的身份运算符如表2-8所示。
表2-8 身份运算符
2.表达式
表达式是将不同类型的数据(常量、变量或函数)用运算符按照一定的规则连接起来的式子。因此,表达式由值、变量和运算符等组成。
在一个表达式中,Python会根据运算符的优先级和结合性进行运算。对于具有不同优先级的运算符,会先完成高优先级的运算,再完成低优先级的运算;对于具有相同优先级的运算符,其运算顺序由结合性来决定。结合性包括左结合和右结合两种,左结合是按照从左向右的顺序完成计算,如1+2+5被计算成(1+2)+5;而右结合是按照从右向左的顺序完成计算,如赋值运算符,即x=y=z被处理为x=(y=z)。
前面所介绍的各运算符的优先级如表2-9所示。优先级值越小,表示优先级越高。
表2-9 运算符优先级
(续)
如果不确定运算符的优先级和结合性,或希望不按优先级和结合性规定的顺序完成计算,可以使用圆括号改变计算顺序。