数据类型和变量
数据类型
Python基本的数据类型有:整数、浮点数、字符串、布尔值、空值。
Python的整数没有大小限制
浮点数(也就是小数,之所以称为浮点数,是因为按照科学计数法表示时,一个浮点数的小数点位置是可变的),浮点数也没有大小限制,但是超出一定范围会直接表示为inf(无限大)
Python中整数运算永远是精确的,而浮点数运算则会有四舍五入的误差。
Python中的两种除法:
/
:计算结果是浮点数。即使是两个整数进行运算,结果仍然是浮点数。10 / 3
将返回3.3333333333333335
;而9 / 3
将返回3.0
//
:地板除,只保留除法运算结果的整数部分,不进行四舍五入。10 // 3
将返回3
%
:余数运算,可以得到两个整数相除的余数10 % 3
将返回1
字符串是用单引号
'
或双引号"
括起来的任意文本,比如'abc'
,'123'
等。如果字符串内部既包含
'
又包含"
,可以用转义字符\
来标识,比如:'I\'m \"OK\"!'
表示的字符是:I'm "OK"!'
\n
表示换行,\t
表示制表符,如果要显示字符\
本身,要进行转义,即\\
表示的字符就是\
。用
r'...'
表示引号内部的字符串全部不转义:1
print(r'\\\t\\') #用了r''之后,''中的内容将原样输出,不会进行转义
用
'''...'''
的格式可以直接用回车代替\n
显示多行内容:1 2 3
print('''第一行 第二行 第三行''')
布尔值:即
True
和False
(T和F要大写),布尔值可以用and
、or
和not
进行运算。空值:Python中的空值用
None
表示。None
不能理解为0
,因为0
是有意义的,而None
是一个特殊的空值。
变量和常量
- Python中,等号
=
是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,可以是不同数据类型的变量。 - 当我们写
a = 'ABC'
时,Python解释器干了两件事:- 在内存中创建了一个名为
'ABC'
的字符串 - 在内存中创建了一个名为
'a'
的变量,并把他指向'ABC'
。
- 在内存中创建了一个名为
当我们将变量a赋值给另一个变量b时,实际上是把变量b指向变量a所指向的数据。
1 2 3 4
a = 'ABC' b = a a = 'XYZ' print(b) #最终将显示ABC
常量就是不能变的变量,通常用全部大写的变量名表示常量:
PI = 3.14159265359
,但事实上PI
仍然是一个变量,Python根本没有任何机制保证PI
不会被改变。用全部大写的变量名表示常量只是一个约定俗成的用法。
字符串和编码
字符编码
Unicode把所有国家的语言都统一到了一套编码里。为了避免(大量使用英文时的)浪费,出现了“可变长编码”UTF-8
编码。
Python的字符串
在Python 3版本中,字符串默认以Unicode编码,所以Python的字符串支持多种语言。
ord()
函数:以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值。chr()
函数:用一个范围在 range(256)内的(就是0~255)整数作参数,返回值是当前整数对应的 ASCII 字符。1 2 3 4
ord('A') #将返回65 ord('中') #将返回20013 chr(66) #将返回'B' chr(97) #将返回'a'
len()
函数:返回对象(字符、列表、元组等)长度或项目个数。1 2 3 4 5 6 7 8
>>>len('ABC') 3 >>>len('中文') 2 >>>len('ABC'.encode('UTF-8')) 3 >>> len('中文'.encode('utf-8')) 6
1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。
格式化字符串
在Python中,采用的格式化方式和C语言是一致的,用%
实现,举例如下:
|
|
在字符串内部,%s
表示用字符串替换,%d
表示用整数替换,有几个%?
占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?
,括号可以省略。
常见的占位符有:
占位符 | 替换内容 |
---|---|
%d | 整数 |
%f | 浮点数 |
%s | 字符串 |
%x | 十六进制整数 |
格式化操作符辅助指令:
符号 | 功能 |
---|---|
* | 定义宽度或者小数点精度 |
- | 用做左对齐 |
0 | 显示的数字不足规定位数则在前面用’0’填充,而不是默认的空格 |
m.n. | m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话) |
例:
|
|
用%%
来表示一个%
:
|
|
format()
str.format
,增强了字符串格式化的功能。基本语法是通过 {}
和 :
来代替以前的 %
。
format 函数可以接受不限个参数,位置可以不按顺序。
|
|
也可以设置参数:
|
|
输出结果为:
|
|
实际应用:
|
|
结果为(.2f的格式会进行四舍五入):
|
|
Python序列
序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置/索引,第一个索引是0,第二个索引是1,依此类推。
Python有6个序列的内置类型,最常见的是列表和元组。
序列都可以进行的操作包括索引,切片,加,乘,检查成员。
Python内置确定序列的长度(len()
以及确定最大max()
和最小min()
的元素的方法。
list列表
创建列表
用列表名 = [xxx, xxx, xxx]
来创建。列表中的数据项不需要具有相同的类型。如下:
|
|
list元素可以是另一个list,比如:
|
|
要注意s
只有4个元素,其中s[2]
又是一个list:
|
|
要拿到'b'
可以写p[1]
或者s[2][1]
,因此s
可以看成是一个二维数组,类似的还有三维、四维……数组,不过很少用到。
访问列表
使用下标索引(索引是从0
开始的)来访问列表中的值,也可以使用方括号的形式截取字符,如下所示:
|
|
可以用-1
做索引,直接获取最后一个元素,以此类推,可以获取倒数第2个、倒数第3个:
|
|
更新列表
可以对列表的数据项进行修改或更新,使用append()方法来添加列表项,如下所示:
|
|
也可以把元素插入到指定的位置,比如索引号为1
的位置:
|
|
要把某个元素替换成别的元素,可以直接赋值给对应的索引位置:
|
|
删除列表元素
使用 del 语句来删除列表的元素,如下实例:
|
|
用pop()
方法删除list末尾的元素:
|
|
用pop(i)
方法(其中i
是索引位置)删除指定位置的元素:
|
|
列表截取
Python 的列表截取实例如下:
|
|
列表函数&方法
函数:
函数 | 作用 |
---|---|
len(list) | 返回列表元素个数 |
max(list) | 返回列表元素最大值 |
min(list) | 返回列表元素最小值 |
list(seq) | 将元组转换为列表 |
方法:
方法 | 作用 |
---|---|
list.append(obj) | 在列表末尾添加新的对象 |
list.count(obj) | 统计某个元素在列表中出现的次数 |
list.extend(seq) | 在列表末尾一次性追加另一个序列中的多个值 |
list.index(obj) | 从列表中找出某个值第一个匹配项的索引位置 |
list.insert(index, obj) | 将对象插入列表 |
list.pop([index=-1]) | 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值 |
list.remove(obj) | 移除列表中某个值的第一个匹配项 |
list.reverse() | 反向列表中元素 |
list.sort() | 对原列表进行排序 |
tuple元组
元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。
创建元组
用元组名= (xxx, ,xxx, xxx)
即可,如下实例:
|
|
创建空元组tup1 = ()
元组中只包含一个元素时,需要在元素后面添加逗号tup1 = (50,)
访问元组
使用下标索引来访问元组中的值,如下实例:
|
|
修改元组
元组中的元素值不允许修改,但可以对元组进行连接组合,如下实例:
|
|
删除元组
元组中的元素值不允许删除,但可以使用del语句来删除整个元组,如下实例:
|
|
元组运算符
元组之间可以使用 + 号和 * 号进行运算。运算后会生成一个新的元组。
Python 表达式 | 结果 | 描述 |
---|---|---|
len((1, 2, 3)) | 3 | 计算元素个数 |
(1, 2, 3) + (4, 5, 6) | (1, 2, 3, 4, 5, 6) | 连接 |
(‘Hi!’,) * 4 | (‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’) | 复制 |
3 in (1, 2, 3) | True | 元素是否存在 |
for x in (1, 2, 3): print x, | 1 2 3 | 迭代 |
元组索引,截取
可以访问元组中的指定位置的元素,也可以截取索引中的一段元素,如下所示:
1
|
L = ('spam', 'Spam', 'SPAM!') |
Python 表达式 | 结果 | 描述 |
---|---|---|
L[2] | ‘SPAM!’ | 读取第三个元素 |
L[-2] | ‘Spam’ | 反向读取,读取倒数第二个元素 |
L[1:] | (‘Spam’, ‘SPAM!’) | 截取元素 |
元组内置函数与列表类似(len()
, max()
, min()
, tuple()
)
dict 字典
字典(在其他语言中也称为map)是另一种可变容器模型,且可存储任意类型对象。使用键-值(key-value)存储,具有极快的查找速度。
字典的每个键值key => value
对用冒号 :
分割,每个键值对之间用逗号 ,
分割,整个字典包括在花括号 {}
中 ,格式如下所示:
|
|
键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一。
|
|
创建字典
字典的值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。
|
|
访问字典里的值
|
|
修改字典
|
|
删除字典元素
删除一个字典用del命令(可以删除字典里单一的元素也可以清空字典),如下实例:
|
|
字典键的特性
- 不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住
- 键必须不可变,可以用数字,字符串或元组充当,但是不能用列表
- dict内部存放的顺序和key放入的顺序是没有关系的
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
- dict是用空间来换取时间的一种方法。
set集合
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
要创建一个set,需要提供一个list作为输入集合:
|
|
重复元素在set中自动被过滤:
|
|
通过add(key)
方法添加元素到set中:
|
|
通过remove(key)
方法删除元素:
|
|
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
|
|
set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。
条件判断
用if
语句实现条件判断。根据Python的缩进规则,如果if
语句判断是True
,就把缩进的n行语句执行了,否则,什么也不做。
可以给if
添加一个else
语句,意思是,如果if
判断是False
,不要执行if
的内容,去把else
执行了。
注意不要少写了冒号:
!!!!
|
|
当然上面的判断完全可以用elif
做更细致的判断:
|
|
elif
是else if
的缩写,可以有多个elif
,所以if
语句的完整形式就是:
|
|
if
判断条件还可以简写,比如写:
|
|
只要x
是非零数值、非空字符串、非空list等,就判断为True
,否则为False
。
循环
for…in循环
依次把list或tuple中的每个元素迭代出来:
|
|
执行这段代码,会依次打印names
的每一个元素:
|
|
再比如计算1-10的整数之和,可以用一个sum
变量做累加:
|
|
如果要计算1-100的整数之和,从1写到100有点困难,Python提供一个range()
函数,可以生成一个整数序列,再通过list()
函数可以转换为list。比如range(5)
生成的序列是从0开始小于5的整数:
|
|
range(101)
可以生成0-100的整数序列,计算如下:
|
|
while循环
只要条件满足,就不断循环,条件不满足时退出循环。
比如计算100以内所有奇数之和,可以用while循环实现:
|
|
在循环内部变量n
不断自减,直到变为-1
时,不再满足while条件,循环退出。
|
|
上面的程序结果为:
|
|
break
在循环中,break
语句可以提前退出循环。例如,本来要循环打印1~100的数字:
|
|
上面的代码可以打印出1~100。
如果要提前结束循环,可以用break
语句:
|
|
执行上面的代码可以看到,打印出1~10后,紧接着打印END
,程序结束。
可见break
的作用是提前结束循环。
continue
在循环过程中,也可以通过continue
语句,跳过当前的这次循环,直接开始下一次循环。
|
|
上面的程序可以打印出1~10。但是,如果只打印奇数,可以用continue
语句跳过某些循环:
|
|
执行上面的代码可以看到,打印的不再是1~10,而是1,3,5,7,9。
可见continue
的作用是提前结束本轮循环,并直接开始下一轮循环。
小结
循环是让计算机做重复任务的有效的方法。
break
语句可以在循环过程中直接退出循环,而continue
语句可以提前结束本轮循环,并直接开始下一轮循环。这两个语句通常都*必须*配合if
语句使用。
不要滥用break
和continue
语句。break
和continue
会造成代码执行逻辑分叉过多,容易出错。
有些时候,如果代码写得有问题,会让程序陷入“死循环”。这时可以用Ctrl+C
退出程序,或者强制结束Python进程。