测试开发-晋级之路1(python数据类型比较解析)

python的数据类型可以分为三种:
数值:
序列:字符串 元祖 列表
散列:字典、集合 #特征 内部元素是无序的
(特别注意:python3.7之后字典不再无序,字典变成了有序的)

元祖和列表的比较:

占用内容方面:
列表为可变的序列,在分配时,会先预分配一个空间,当数值超过一定数量时,会进行扩容。

元祖在分配空间时为定值,占用内容空间更小。

速度方面:
可以通过ipython来进行耗时的测试
deafaulttimer默认跑一千万次

list = ['1','2','3','4','5']
import timeit
res = timeit.Timer('list').timeit(1000)
print(res)
res1 = timeit.timeit('list')
print(res1)

命名元祖

让元祖像字典一样可以通过名称获取

Python的元组不能为元组内部的数据进行命名,而 collections.namedtuple 可以来构造一个含有字段名称的元组类,命名元组可以通过逗号+字段名来获取元素值:


collections.namedtuple(typename, field_names)

返回一个命名元组类 typename,其中参数的意义如下:
typename:类名称
field_names: 元组中元素的名称

如何定义命名元祖

from collections import namedtuple
#方法一
test_tuple = namedtuple('test_tuple',['name','age','sex'])
#方法二
test_tuple1 = namedtuple('test_tuple1','name age sex')

命名元组的属性和方法

1,命名元组类的属性和方法类属性

_fields:包含这个类所有字段名的元组类方法
_make(iterable):接受一个可迭代对象来生产这个类的实例


# 通过类方法 _make() 和一个list创建一个User对象
user = User._make(['joker', 'male', 12])
User._fields
2,命名元组实例的方法实例方法

_asdict():把具名元组以 collections.OrdereDict 的形式返回,可以利用它来把元组里的信息友好的展示出来实例方法_replace():用于修改实例的属性

# 获取实例的属性:
print( user.name, user.sex, user.age)

# 使用 _replace() 修改对象属性
user = user._replace(age=22)# User(name='user1', sex='male', age=22)

# 使用 _asdict()函数把 User对象转换成字典
print( user._asdict() )
# OrderedDict([('name', 'Runoob'), ('sex', 'male'), ('age', 22)])

把字典或列表转换为命名元组

1,把字典转换为命名元组
可以把Python的字典转换为命名元组:

>>> dt={'name':'b', 'age':2, 'id':135}
>>> ut=User(**dt)
## User(name='b', age=2, id=135)

2,把列表转换为命名元组
使用map函数,调用命名元组类的_make函数,把列表转换为命名元组的列表

User = namedtuple('User', 'name age id')
list_users=map(User._make,[('u1',23,1001),('u2',21,1002),('u3',25,1003),])

3,把命名元组转换为列表也可以把命名元组转换为list,列表中只有值,而没有字段名称:

>>> list(ut)
['b', '2', 135]

访问命名元组

通过逗号运算符和属性名来访问元组字段的值,例如,ut是命名元组的对象,name是对象的属性,可以通过以下方式访问元组的name属性:

ut.name

命名元组的用途

命名元组在存储csv或者sqlite3返回数据的时候特别有用

EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')

import csv
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
    print(emp.name, emp.title)

import sqlite3
conn = sqlite3.connect('/companydata')
cursor = conn.cursor()
cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
for emp in map(EmployeeRecord._make, cursor.fetchall()):
    print(emp.name, emp.title)

字典和集合的原理和应用

原理

dict与set实现原理是一样的,都是将实际的值放到list中,唯一不同的在于hash函数操作的对象,对于dict,hash函数操作的是其key,而对于set是直接操作的它的元素,假设操作内容为x,其作为因变量,放入hash函数,通过运算后取list的余数,转化为一个list的下标,此下标位置对于set而言用来放其本身,而对于dict则是创建了两个list,一个list表放置key,另一个list中该下标方对应的value。其中,我们把实现set的方式叫做Hash Set,实现dict的方式叫做Hash Map/Table(注: map指的就是通过key来寻找value的过程)

散列类型的存储过程

在这里插入图片描述

当存在重复值时,会引起散列冲突,解决冲突的方法有两种:
一、扩容
二、在该位置新建一个链表,把值存入链表中

字典查找值的过程

在这里插入图片描述

性能分析:

从时间上比较(快到慢):集合 字典 元祖 列表
占用内存比较(多到少):字典 集合 列表 元祖

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值