python进阶(一)~~~数据类型拓展
基础数据类型:
数值: 整数、浮点 、布尔类型
序列:字符串、元祖、列表 --有序
散列:字典、集合 ----无序
拓展数据类型:
一、命名元组
示例:
from collections import namedtuple
tu=('lele',18,'男') print(tu[0]) # 取数据 student= namedtuple('Student',['name','age','gender']) # 创建一个命名元祖,第一个参数为类名,第二个为参数名列表 s1 = student('lele',18,'男') print(s1.name,s1[0]) # 可以根据字段名取值,也可以按下标取值,用起来更方便
元祖和列表的区别:
元组定义后,有几个参数就有几个内存位置,数量不会变化。因此性能较好。
列表定义后,会预留一些位置,当向列表中追加数据至全部使用后,自动进行扩容,因此性能略差。
二、推导式
列表推导式:
# 使用前 url='http://...?page={}' urls= [] for i in range(0,100,10) urls.append(url.format(i)) print(urls) # 使用后,效果等同 urls= [url.fomat(i) for i in range(0,100,10)] print(urls)
三目运算符
a=10 res='ttrue' if a>5 else 'ffalse' # 如果a大于5,输出 ttrue,反之输出 ffalse print(res)
res2='ttrue' if a>5 else ('equal' if a=5 else 'smaller') # 组合使用
列表推导式与三目运算符 综合使用
urls= [i for i in range(0,10) if i%2==0] # 返回[0,2,4,6,8]
字典推导式:
list1=['name','age','gender'] dict={i:1 for i in list1} print(dict) # 输出 {'name':1,'age':1,'gender':1}
可迭代对象和迭代器:
可迭代对象:对象内部实现了迭代协议(即__iter__方法)的称之为可迭代对象;可迭代对象均可使用for循环遍历;
迭代器:对象实现了迭代协议;内部还要实现__next__()方法,可以通过next()去取值;可通过iter()方法讲可迭代对象转化为迭代器;
生成器是一种特殊的迭代器。
#可迭代对象 li=[11,22,33] for i in li: print(i) #迭代器 item=iter(li) print(item) # 返回 list_iterator object at *** print(next(item))
生成器:当我们需要存储大量数据时,使用生成器可以节约内存
创建生成器的两种方式:
方式一:生成器表达式:
iter = (i for i in range(10))
方式二:yield关键字。yield只能用于函数中,当函数中出现yield关键字时,这个函数就是一个生成器函数。
def gen(): for i in range(10): yield i
res= gen()
print(next(res))
生成器与迭代器的区别:
生成器比迭代器多3种方法:send() 、throw()、 close() ,与生成器内部交互,使之可以实现内部元素的变动,而迭代器内部元素不可变动。
def gen(): i = 0 while i<10: j=yield i
#print(j)
if j is not None:
i = j i + = 1 #send() 与生成器进行交互,发送数据; send 必须在next()执行后使用 g=gen() print(next(g)) print(g.send(100)) # send的数据在 yield i 行接收,yield默认返回值为None, 插入数据在print(j)打印出来
#print(j) 控制台输出结果:0 100 1 ; 不使用print, 改为if 语句修改后,控制台输出结果: 0 101
#close() 关闭生成器
g.close()
print(next(g))
#throw() 在生成器内部主动引发一个异常,参数:异常类型,异常信息
g.throw(ValueError,'hello ,python')