Python机器学习
上QQ阅读APP看书,第一时间看更新

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 运算符优先级

(续)

如果不确定运算符的优先级和结合性,或希望不按优先级和结合性规定的顺序完成计算,可以使用圆括号改变计算顺序。