python3种数据类型:
1.数值:1,2,3
2.序列:字符串,列表,元祖
3.散列:字典,集合。⭐️内部元素是无序的。
性能排序:
从消耗时间上比较:集合<字典<元祖<列表
从占用内存上比较:字典>集合>列表>元祖
一。元组与列表
list与tuple(列表与元组)性能:
pip install ipython(ipython可以分析函数的执行时间)
ipython
对比得出,在内存中创建元组比创建列表快了很多。 所以,数据会增减变化的用列表,不会变化的尽量用元组。
命名元祖:
二。字典和集合{ }
字典和集合的原理及应用:
dict与set实现原理是一样的,都是将实际的值放入list中,唯一不同在于hash函数操作的对象;对于dict,hash函数操作的是其key;对于set,hash函数直接操作其元素,假设操作内容为x,其作为因变量放入hash函数,通过运算后取list的余数,转化为一个list的下标,此下标位置对于set而言用来放其本身,而对于dict而言,则是创建了两个list,一个list存放该下标key,另一个list存放该下标对应的value。其中,我们把实现set的方式叫做HashSet.实现dict的方式叫做Hash Map/Table(map就是指通过key来寻找value的过程)。
集合:se = set()或者se = {}.集合可自动去重
字典:dic = {'name':'chuntian'}
三。推导式:可推导出列表和字典
1.列表推导式:[ ]
list1 = [i**2 for i in range(10)]
print(list1)
输出:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
2.字典推导式:{ }
dict1 = {i: i+1 for i in range(10)}
print(dict1)
输出:
{0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}
a = ['a', 'b', 'c', 'd']
dict1 = {}
for i, j in enumerate(a):
dict1[i] = j
print(dict1)
输出:
{0: 'a', 1: 'b', 2: 'c', 3: 'd'}
list1 = ["cook_str='sdgdssgk gjkjdg'", "pstm='但是风蛋糕跟'", "adg='sfs gg"]
dict1 = {i.split('=')[0]: i.split('=')[1] for i in list1}
print(dict1)
输出:
{'cook_str': "'sdgdssgk gjkjdg'", 'pstm': "'但是风蛋糕跟'", 'adg': "'sfs gg"}
四。迭代器和生成器
迭代器:只要能通过next()从里面取值的,都叫迭代器(生成器属于迭代器的一种);只要是能够通过for循环进行遍历的,都是可迭代对象。iter()函数可以将一个可迭代对象转换成一个迭代器。
# 可以使用iter()方法将可迭代对象转化为一个迭代器
list1 = [1, 2, 3, 4]
print(next(list1)) # TypeError: 'list' object is not an iterator
输出:
TypeError: 'list' object is not an iterator
# 可以使用iter()方法将可迭代对象转化为一个迭代器
list1 = [1, 2, 3, 4]
list_iter = iter(list1)
print(next(list_iter))
print(next(list_iter))
输出:
1
2
生成器:( )节约内存,提升性能。
yield关键字只能用在函数中。
使用next()取值
# ()生成器表达式
iter1 = (i for i in range(5))
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
输出:
0
1
2
3
4
Traceback (most recent call last):
File "/Users/jeanettian/PycharmProjects/demo/dataType/生成器.py", line 8, in <module>
print(next(iter1))
StopIteration
函数内中使用yield关键字实现生成器
def func():
yield 100
print("hello,world")
yield 200
yield 300
res = func()
print(next(res)) # 100
print(next(res)) # hello,world 200
print(next(res)) # 300
print(next(res)) # 300
send()方法可往生成器内添加数据,next()方法可以从生成器中取出数据。
ge.send()示例:
def func():
for i in range(1, 5):
res = yield i
print('res的值为:', res)
ge = func() # ge是生成器对象
print(next(ge)) # 从生成器取值
print(ge.send(100)) # 往生成器中添加数据,会在yield暂停后,将值赋值给res接收
print(next(ge))
输出:
1
res的值为: 100
2
res的值为: None
3