数据类型和变量
数据类型
整数
- 十六进制用
0x
前缀和0-9,a-f表示。 - 允许在数字中间以
_
分隔,如10_000_000_000、0xa1b2_c3d4。 - 整数运算永远是精确。
//
地板除,只取结果的整数部分,两个整数的除法仍然是整数。- %余数运算,可以得到两个整数相除的余数。
浮点数
- 因为按照科学记数法表示时,一个浮点数的小数点位置是可变的。
- 浮点数运算则可能会有四舍五入的误差。
/
除法计算结果是浮点数,两个整数恰好整除,也是浮点数。
字符串
- 以单引号'或双引号
"
括起来的任意文本,如'abc'
,"xyz"。
- 如果
'
本身也是一个字符,那就可以用""
括起来,如"I'm OK"。
- 字符串内部既包含
'
又包含",
可以用转义字符\
来标识。 - 转义字符
\
可以转义很多字符,如\n
:换行,\t
:制表符,\\
:\
本身。 r''
表示''
内部的字符串默认不转义。- 内部有很多换行,用
\n
写在一行或'''...'''
的格式表示多行内容。
布尔值
空值
- 用
None
表示,不能理解为0
,0
有意义,而None
是一个特殊的空值。
列表list
- 有序的集合,可以随时添加和删除其中的元素。
len()
可获得list元素的个数。- 索引来访问list每一个位置元素,从
0
开始;-1
直接获取最后一个元素。 - 索引超出范围,报
IndexError
错误
# list 可变有序表
classmates = ['Michael', 'Bob', 'Tracy']
# 索引从0开始;-1直接获取最后的元素
classmates[0]
classmates[-1]
# 追加元素到末尾
classmates.append('Adam')
# 指定位置插入元素
classmates.insert(1, 'Jack')
# 删除末尾元素
classmates.pop()
# 删除指定位置元素
classmates.pop(1)
# 某元素替换成别的元素,赋值对应索引位置
classmates[1] = 'Sarah'
- 元素数据类型不限,可以是list
- 空list:L=[]
tuple
- 不可变有序表。
- tuple只有1个元素,定义时必加一个逗号
,
消除歧义。 - tuple中可放list,list的内容可变。
字典dict
- 键-值(key-value)存储,具有极快的查找速度。
- key不存在,dict报错。
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
# 通过in判断key是否存在
'Thomas' in d
# 通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value
d.get('Thomas')
d.get('Thomas', -1)
- 删除一个key,用
pop(key)
方法。 - dict内部存放顺序和key放入顺序是无关。
- 与list比:查找和插入的速度极快,不会随着key的增加而变慢;占用大量的内存,内存浪费多。
- 通过key计算位置的算法称为哈希算法(Hash)。key必须是不可变对象。
set
- 一组key的集合,但不存储value。无序无重复元素集合。key必须是不可变对象。
- 创建一个set,需要提供一个list作为输入集合。
add(key)
方法可以添加元素到set。remove(key)
方法可以删除元素。- & 交集,| 并集
- 不变对象调用对象自身的任意方法不会改变该对象自身内容,会创建新的对象并返回保证不可变对象不可变。
变量
- 变量名必须是大小写英文、数字和
_
的组合,且不能用数字开头。 - 等号
=
是赋值语句,可把任意数据类型赋值给变量,同一变量可反复赋值不同类型的数据。 - 变量本身类型不固定的语言——动态语言;定义变量时必须指定变量类型——静态语言。
a = 'ABC'
#Python解释器干了两件事情:
#在内存中创建了一个'ABC'的字符串;
#在内存中创建了一个名为a的变量,并把它指向'ABC'。
常量
小结
- 任何数据都看成一个“对象”,变量指向数据对象的,赋值是把数据和变量关联。
x = y
是把变量x
指向是变量y
指向的对象。随后对y
的赋值不影响变量x
的指向。- Python整数没有大小限制。
- Python浮点数没有大小限制,超出一定范围直接表示为
inf
(无限大)。
字符串和编码
- 8个比特(bit)=一个字节(byte),一个字节能表示的最大整数255(二进制11111111)
ASCII
编码,比如大写字母A
的编码是65
,小写字母z
的编码是122
。
- Unicode把所有语言都统一到一套编码,UCS-16编码,用两个字节表示一个字符。
- “可变长编码”的
UTF-8
编码,节省空间,支持ASCII编码。
![](https://i-blog.csdnimg.cn/blog_migrate/73d22df17adfc74f1916ebb22d6023f8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/587c3337b08442a5329409ec837c9f4c.png)
Python的字符串
ord()
函数获取字符的整数表示,chr()
函数把编码转换为对应的字符。- 知道字符的整数编码,可用十六进制写
str
。
- 在网络上传输或保存到磁盘上,要把
str
变为以字节为单位的bytes
。
bytes
类型的数据用带b
前缀的单引号或双引号表示,每个字符都只占用一个字节。str
通过encode()
方法可以编码为指定的bytes。
str
用ASCII
编码为bytes
,内容一样;中文的str
可以用UTF-8
编码为bytes
。
bytes
中,无法显示为ASCII字符的字节,用\x##
显示。- 从网络或磁盘上读取了字节流,数据
bytes
。把bytes
转str
,用decode()
方法。 bytes
包含无法解码的字节,decode()
方法报错;传入errors='ignore'
忽略错误的字节。
'ABC'.encode('ascii')
'中文'.encode('utf-8')
b'ABC'.decode('ascii')
b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
- len()可用于计算
str
包含字符数,bytes
包含
字节数。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
# 第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则源代码中写的中文输出可能会有乱码。
格式化
占位符 | 替换内容 |
---|
%d | 整数 |
%f | 浮点数 |
%s | 字符串 |
%x | 十六进制整数 |
%s
永远起作用,它会把任何数据类型转换为字符串。%%
:%
本身
- 字符串
format()
方法,它会用传入的参数依次替换字符串内的占位符{0}
、{1}
…… - 用以
f
开头的字符串:f-string
,
字符串包含{xxx}
,就会以对应的变量替换。
# 格式化
print('%2d-%02d' % (3, 1))
print('%.2f' % 3.1415926)
# 字符串格式化形式
'Age: %s. Gender: %s' % (25, True)
# format方法
'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
# f-string
r = 2.5
s = 3.14 * r ** 2
print(f'The area of a circle with radius {r} is {s:.2f}')
条件判断
# 注意冒号
# 从上往下判断,对应的语句执行后,忽略剩下的elif和else
if <条件判断1>:
<执行1>
elif <条件判断2>:
<执行2>
elif <条件判断3>:
<执行3>
else:
<执行4>
input()
读取用户的输入,返回的数据类型是str
。
int()
把str
转换成整数。
循环
for x in ...
循环:依次把list或tuple中的每个元素代入变量x
,然后执行缩进块的语句。range()
可生成一个整数序列,list()
可将其转换为list。- while循环,条件满足,不断循环。
break
:提前结束循环,必须配合if
语句。continue
:提前结束本轮循环,并直接开始下一轮循环,必须配合if
语句。