数据类型
进制转换
- 十进制
- 基数0~9,逢10进1
- 示例:123 = 1* 10^2 + 2 * 10^1 + 3 * 10^0 = 100 + 20 + 3 = 123
- 转二进制:除2取余,倒序书写
- 22 = 0b10110
- 二进制
- 基数0和1,逢2进1
- 示例:0b110100 = 2^5 + 2^4 + 2^2 = 32 + 16 + 4 = 52
- 八进制
- 基数0~7,逢8进1
- 示例:0o123 = 1 * 8^2 + 2 * 8^1 + 3 * 8^0 = 64 + 16 + 3 = 83
- 转二进制:八进制的1位可以表示3位二进制数
- 0o123 = 0b 001 010 011
- 十六进制
- 基数09、AF,逢16进1
- 示例:0xAB = 10 * 16^1 + 11 * 16^0 = 160 + 11 = 171
- 转二进制:十六进制的1位可以表示4位二进制数
- 0xAB = 0b 1010 1011
- 计算机中的数据是以哪种进制存储的,为什么?
- 二进制,因为计算机设计时就只能识别二进制。具体原因:
- 成本低(技术上容易实现)、稳定性高(只有两种状态)、与生活中的真假逻辑相对应
- 计算机设计的优化
- 拿掉减法器,负数如何表示?
- 最高位作为符号位:0表示正数,1表示负数
- 虽然牺牲了最高,但是解决了负数的表示问题,简化了硬件设计,降低了成本
- 原码、反码、补码:都是为了解决负数问题而出现的,正数的三码一致
- 负数的反码等于原码的符号位不变,其余位取反
- 负数的补码等于对应的反码加1
- 计算机中是以补码的形式存储数据的
- 拿掉减法器,负数如何表示?
数据类型
-
说明:编程语言的数据类型都是为了解决实际问题而出现的。
-
python中常见数据类型:整型、浮点、布尔、字符串、列表、元组、集合、字典等
-
数值类型:
# 整型 a = 250 print(a) # type可以获取变量的数据类型 print(type(a)) # 浮点 b = 3.14 print(b, type(b)) # 科学计数法 c = 3.1415926e-3 print(c) # 复数 d = 3 + 4j print(d, type(d))
-
特殊类型:
# 布尔:bool,只有两个值:True/False a = True print(a, type(a)) # 空:NoneType,只有一个值 None b = None print(b, type(b))
-
字符串类型:
# 字符串:str # 单行字符串 # s1 = 'hello' # s1 = "hello" # 多行字符串 # s1 = '''hello''' s1 = """hello world""" print(s1, type(s1)) # 转义:让特殊字符失去意义,变为普通 s2 = 'I\'am good man' print(s2) # 特殊字符:\n换行、\r回到开头、\t制表 s3 = 'hello\\nworld' print(s3) # 字符串前面加一个'r',其中的所有字符都是普通字符 s4 = r'hello\nworld' print(s4)
-
元组与列表
# 列表:list,可以存储一系列的任意类型的数据 lt = [100, 200, 300] print(lt, type(lt)) # 元素访问:通过下标访问,从0开始 print(lt[0]) # 存在越界问题,会报IndexError错 # print(lt[3]) # 元组:tuple,元组是不可更改的 # tp = (10, 20, 30) tp = 10, 20, 30 print(tp, type(tp)) print(tp[1]) # 定义只有一个元素的元组时,末尾需要添加一个逗号 tp2 = (10,) print(type(tp2))
-
集合类型
# 集合:set,元素是无序的且不能重复 s1 = {'小马', '小乔', '小方', '小周', '小马'} s2 = {'小杜', '小马', '小王'} print(s1, type(s1)) # 交集 print(s1 & s2) # 并集 print(s1 | s2) # 差集 print(s1 - s2) print(s2 - s1) # 定义空集合不能使用{},这是给定义空字典使用的 # s3 = {} # 这样可以定义空集合 s3 = set() print(type(s3))
-
字典类型:是一种映射类型
- 元素是由键值对构成的
- 键值之间使用
:
进行连接 - 键是唯一的,值是任意的
- 字典是可以更改的
- 示例:
# 字典:dict d1 = {'name': 'dahua', 'age': 18} print(d1, type(d1)) # 获取元素:根据键获取值 print(d1['name']) # 当键不存在时,会报KeyError错 # print(d1['weight']) # 根据键返回值,键存在时返回对应的值,不存在则返回None # 可以指定默认值 print(d1.get('weight', '90')) # 统计元素个数,字典统计的是键值对的个数 print(len(d1)) print(len([1, 2, 3])) print(len('hello'))
类型转换
-
隐式类型转换:混合运算、条件判断
-
强制类型转换:使用专门的函数
- 示例:
# 转换为整数 # a = int(3.84) # base:指定需要转换的参数的进制类型 a = int('123', base=8) # 转换为浮点数 a = float(250) # 转换为bool类型 a = bool(0) print(int(False)) # 转字符串 a = str(123) print(a, type(a)) # 容器转换 b = list('hello') b = list((1, 2, 3)) b = list({1, 2, 3}) # 字典也可以转换,得到的内容只有键 b = list({'name': 'dahua', 'age': 18}) print(b) # 转换为字典:特定格式的数据 lt = [('name', 'dahua'), ('age', 18)] c = dict(lt) print(c, type(c))
字符串操作
-
常规操作
s1 = 'hello' s2 = 'world' # '+':可以进行字符串的拼接 print(s1 + s2) # '*':可以将指定内容重复指定次数 print(s1 * 3) # 统计字符串中的字符个数 print(len(s1)) # 从开头提取元素,下标从0开始 print(s1[0]) # 从末尾提取元素,下标从-1开始 print(s1[-1]) # 切片操作:s[起始:结束:步进] # 提取的内容,包括起始下标,不包括结束下标 s = '1234567890' print(s[3:5]) # 省略边界将会提取到该边边界 print(s[:5]) print(s[3:]) print(s[:]) # 步进值默认为1 print(s[::2]) # 结合使用 print(s[2:-2]) # 逆序 print(s[::-1]) # 步进值为负数代表提取数据的方向 print(s[-1:2:-1])
-
格式化操作
name = 'dahua' age = 18 like = 'ergou' ''' %s:字符串 %d:整数 %f:浮点数 %c:单个字符 ''' s = '俺叫%s,喜欢%s,今年%d' % (name, like, age) print(s, type(s)) # 推荐方式 print('俺叫{},喜欢{},今年{}'.format(name, like, age)) # 可以通过序号该边顺序 print('俺叫{1},喜欢{0},今年{2}'.format(name, like, age)) # 可以给参数起名字,通过名字设置顺序 print('俺叫{n},喜欢{l},今年{a}'.format(n=name, l=like, a=age)) s = 'hello' # 填充与对齐 # 左对齐 print('{0:<8}'.format(s) + 'AAAAAA') # 右对齐 print('{:>8}'.format(s)) # 指定填充,默认填充空格 print('{0:0<8}'.format(s)) print('{0:A<8}'.format(s)) print('{:b}'.format(123)) print('{:o}'.format(123)) print('{:x}'.format(123)) print('{:#x}'.format(123)) print('{:#X}'.format(123)) # 转换函数 print(bin(123)) print(oct(123)) print(hex(123))