基础数据类型
- 不需要声明,只有被赋值后才会创建变量。
- 变量本身没有类型,“类型”指的是所存值的类型。
类型判断
type(x) 和 isinstance(x, int)
前者不会认为子类是一种他的父类类型
后者会认为子类是父类类型
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> isinstance(A(), A)
True
>>> type(A()) == A
True
>>> isinstance(B(), A)
True
>>> type(B()) == A
False
类型转换
隐式类型转换
较低级往较高级转换,不会丢失数据
显式类型转换
一些内置函数
数字 Number
类型
- int 长整型
- float 浮点型
- bool 布尔(是int的子类,True1,False0,可以做加减)
- complex 复数
计算
>>> 5 + 4 # 加法
9
>>> 4.3 - 2 # 减法
2.3
>>> 3 * 7 # 乘法
21
>>> 2 / 4 # 除法,得到一个浮点数
0.5
>>> 2 // 4.0 # 除法,得到一个整数;得到的并不一定是整数类型的数,它与分母分子的数据类型有关系
0.0
>>> 17 % 3.0 # 取余;得到的并不一定是整数类型的数,它与分母分子的数据类型有关系
2.0
>>> 2 ** 5 # 乘方
32
>>> 17%3.0
2.0
>>> _
2.0
>>> price = 1500
>>> price+_
1502.0
>>> 2//4.0
0.0
>>> _
0.0
>>>
常数
常量 | 描述 |
---|---|
pi | 数学常量 pi(圆周率,一般以π来表示) |
e | 数学常量 e,e即自然常数(自然常数)。 |
字符串 String
- 单引号
'
或者双引号"
成对括起来的 - 使用
\
进行字符串转义,字符串整体前面加r
或者R
则不会转义 - 使用
+
进行字符串拼接,*
进行字符串重复 - 没有字符类型(char),只有长度为1的字符串
- 赋值后不能被改变,即
str='hello' str[0]='m'
会报错
多行
>>> var1 = ''' this is
... a drama
... about something
... ok~ '''
>>> var1
' this is \na drama\nabout something\nok~ '
>>>
'''
这里是代码注释
'''
截取
- 索引值
从左到右
0~length-1从右到左
-length ~ -1 - 包含左边,不包含右边
变量[头下标:尾下标]
格式化
#!/usr/bin/python3
print ("我叫 %s 今年 %d 岁!" % ('小明', 10))
# 输出:我叫 小明 今年 10 岁!
布尔 bool
- 在与其他数据类型进行比较时,会被转换为1/0
- 运算符:and、or、not
注意: 在 Python 中,所有非零的数字和非空的字符串、列表、元组等数据类型都被视为 True,只有 0、空字符串、空列表、空元组等被视为 False。
列表 List
- 列表中元素的类型可以各不相同
- 中括号
[]
- 列表可以嵌套列表
- 索引值
从左到右
0~length-1从右到左
-length ~ -1 - 列表中的元素可以改变(不同于字符串)
- 有很多内置函数
#!/usr/bin/python3
list = ['Google', 'Runoob', 1997, 2000]
print ("第三个元素为 : ", list[2]) #1997
list[2] = 2001
print ("更新后的第三个元素为 : ", list[2]) #2001
list1 = ['Google', 'Runoob', 'Taobao']
list1.append('Baidu')
print ("更新后的列表 : ", list1) # ['Google', 'Runoob', 'Taobao', 'Baidu']
del list1[2]
print ("更新后的列表 : ", list1) # ['Google', 'Runoob', 'Baidu']
嵌套
>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'
比较
列表比较需要引入 operator 模块的 eq 方法
# 导入 operator 模块
import operator
a = [1, 2]
b = [2, 3]
c = [2, 3]
print("operator.eq(a,b): ", operator.eq(a,b)) #False
print("operator.eq(c,b): ", operator.eq(c,b)) #True
遍历
# 索引+值
>>> for i, v in enumerate(['tic', 'tac', 'toe']):
... print(i, v)
...
0 tic
1 tac
2 toe
# 多个数组
>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
... print('What is your {0}? It is {1}.'.format(q, a))
...
What is your name? It is lancelot.
What is your quest? It is the holy grail.
What is your favorite color? It is blue.
# 反向
>>> for i in reversed(range(1, 10, 2)):
... print(i)
...
9
7
5
3
1
# 顺序
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
... print(f)
...
apple
banana
orange
pear
元组 Tuple
- 与List类似,但元组内元素不能修改
- 小括号
()
- 能够包含可变的元素
tup1 = () # 空元组
tup2 = (20,) # 一个元素,需要在元素后添加逗号
# 区别于
tup_int = (20)
可变?不可变?
元组内的元素是不可变的,但元组变量所指的内存可以变;绑定到新的对象
>>> tup = ('r', 'u', 'n', 'o', 'o', 'b')
>>> tup[0] = 'g' # 不支持修改元素
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> id(tup) # 查看内存地址
4440687904
>>> tup = (1,2,3) # 重新赋值
>>> id(tup)
4441088800 # 内存地址不一样了
集合 Set
- 无序、可变、元素唯一的列表
- 能够进行交并差等集合运算
- 大括号
{}
创建
set1 = {1, 2, 3, 4} # 直接使用大括号创建集合
set2 = set([4, 5, 6, 7]) # 使用 set() 函数从列表创建集合
empSet = set()
注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
运算
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b # 集合a中包含而集合b中不包含的元素
{'r', 'd', 'b'}
>>> a | b # 集合a或b中包含的所有元素
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b # 集合a和b中都包含了的元素
{'a', 'c'}
>>> a ^ b # 不同时包含于a和b的元素
{'r', 'd', 'b', 'm', 'z', 'l'}
操作
>>> strSet = {1,2,3,4,5,6}
>>> strSet.add(7)
>>> strSet
{1, 2, 3, 4, 5, 6, 7}
>>> strSet.update(8)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>>> strSet.update([8,9])
>>> strSet
{1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> strSet.remove(3)
>>> strSet
{1, 2, 4, 5, 6, 7, 8, 9}
>>> strSet.discard({9}) # 不会报错
>>> strSet
{1, 2, 4, 5, 6, 7, 8, 9}
# set 集合的 pop 方法会对集合进行无序的排列,然后将这个无序排列集合的左面第一个元素进行删除。
>>> strSet.pop()
1
>>> strSet
{2, 4, 5, 6, 7, 8, 9}
>>> strSet.pop()
2
>>> strSet
{4, 5, 6, 7, 8, 9}
>>> strSet.pop()
4
>>> strSet
{5, 6, 7, 8, 9}
>>> strSet.clear() # 清空
>>> strSet
set()
字典 Dictionary
- 无序
- 通过
键
进行存取:key:value - 大括号
{}
- key必须不可变、且唯一,所以不能用列表
创建
# 使用大括号 {} 来创建空字典
emptyDict = {}
# 使用内建函数
emptyDict = dict()
取值
>>> strDict = {'key1':1, 'key2':'2', 3:'123'}
>>> strDict['key1']
1
# 不存在的key访问会报错
清除
tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
del tinydict['Name'] # 删除键 'Name'
tinydict.clear() # 清空字典
del tinydict # 删除字典
print ("tinydict['Age']: ", tinydict['Age']) # 报错
遍历
>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
... print(k, v)
...
gallahad the pure
robin the brave
二进制序列 bytes
- 元素是0~255间的整数值
- 常用于处理二进制数据
b前缀
/bytes() 函数
x = b"hello"
if x[0] == ord("h"):
print("The first element is 'h'")
运算符
逻辑运算符
and > or
位运算符
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 | (a & b) 输出结果 12 ,二进制解释: 0000 1100 |
| | 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 | (a | b) 输出结果 61 ,二进制解释: 0011 1101 |
^ | 按位异或运算符:当两对应的二进位相异时,结果为1 | (a ^ b) 输出结果 49 ,二进制解释: 0011 0001 |
~ | 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1。~x 类似于 -x-1 | (~a ) 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。 |
<< | 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 | a << 2 输出结果 240 ,二进制解释: 1111 0000 |
>> | 右移动运算符:把">>“左边的运算数的各二进位全部右移若干位,”>>"右边的数指定移动的位数 | a >> 2 输出结果 15 ,二进制解释: 0000 1111 |
身份运算符
is
和is not
用于判断两个变量引用的是不是同一个地址- 效果和
id(x) == id(y)
一样:id() 用于获取对象内存地址