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')

 

posted @ 2020-01-30 14:17  青域  阅读(212)  评论(0编辑  收藏  举报