迭代器
双下方法:很少直接调用的方法,一般情况下,是通过其他语法触发的
1. 可迭代的 --> 可迭代协议:含有__iter__的方法( '__iter__' in dir(数据) )
可迭代的一定可以被for循环
2. 迭代器协议:含有__iter__、__next__的方法
迭代器一定可迭代,可迭代的通过调用iter()方法就能得到一个迭代器
迭代器的特点:
很方便使用,且只能取所有的数据取一次
节省内存空间
for 循环其实就是在使用迭代器
判断是不是迭代器,其实是为了使用for循环
当我们遇到一个新的变量,不确定能不能for循环时,就判断它是否可迭代
生成器
生成器的表现形式
1. 生成器函数
2. 生成器表达式
生成器函数:
含有yield关键字的函数就是生成器函数
特点:
调用函数之后函数不执行,返回一个生成器
调用next方法的时候会取到一个值
直到取完最后一个,再执行next会报错
从生成器中取值的几个方法
1. next
2. for
3. 数据类型的强制转换:占用内存
关于send()
其实next()和send()在一定意义上作用是相似的
区别是send()可以传递yield表达式的值进去,而next()不能传递特定的值,只能传递None进去
因此,我们可以看做c.next() 和 c.send(None) 作用是一样的
需要提醒的是,第一次调用时,请使用next()语句或是send(None),不能使用send发送一个非None的值,否则会出错
最后一个yield不能接受外部的值
生成器的表达式和列表推导式以及其他推导式
1. 生成器表达式:
g = (i for i in range(10)) # g是一个生成器
for i in g:
print(i)
2. 列表推导式
[每一个元素或是和元素相关的操作 for 元素 in 可迭代数据类型] # 遍历之后挨个处理
[满足条件才进行操作的元素 for 元素 in 可迭代数据类型 if 元素相关的条件 ] # 筛选功能
egg_list = ['鸡蛋%s'%i for i in range(10)] # 列表推导式
print(egg_list)
3. 字典推导式
将一个字典的key和value对调
mcase = {'a': 10, 'b': 34}
dic = {mcase[k]:k for k in mcase}
print(dic)
4. 集合推导式
计算列表中每个值的平方,自带去重功能
squared = {x*x for x in [1, -1, 2]}
print(squared)
没有元组推导式
内置函数
在此仅列出几个重要的内置函数:
其他:input,print,type,hash,open,import,dir
str类型代码执行:eval,exec
数字:bool,int,float,abs,divmod,min,max,sum,round,pow
序列——列表和元组相关的:list和tuple
序列——字符串相关的:str,bytes,repr
序列:reversed,slice
数据集合——字典和集合:dict,set,frozenset
数据集合:len,sorted,enumerate,zip,filter,map
匿名函数
为了解决那些功能很简单的需求而设计的一句话函数
函数名 = lambda 参数 :返回值
匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
返回值和正常的函数一样可以是任意数据类型
看到匿名函数,就要想到肯定会带着考内置函数,而和匿名函数相关的内置函数只有5个:min max filter map sorted
例题:现有两元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]
没用匿名函数:
tu1 =(('a'),('b'))
tu2 =(('c'),('d'))
res = zip(tu1,tu2)
def func(tup):
return {tup[0]:tup[1]}
ret = map(func,res)
# for i in ret:
# print(i)
list(ret)
用匿名函数:
tu1 =(('a'),('b'))
tu2 =(('c'),('d'))
res = zip(tu1,tu2)
# def func(tup):
# return {tup[0]:tup[1]}
ret = map(lambda tup:{tup[0]:tup[1]},res)
# for i in ret:
# print(i)
print(list(ret))
简化后一行:
print(list(map(lambda tup:{tup[0]:tup[1]},zip((('a'),('b')),(('c'),('d'))))))
来源:oschina
链接:https://my.oschina.net/u/4266737/blog/3897337