迭代器,生成器,递归

迭代器

迭代器就是迭代的工具,每一次迭代(重复)都是基于上一次的结果,计算机中的迭代开发就是基于软件的上一个版本更新

可迭代对象

python中一切皆对象,但不都是可迭代对象,可以使用__iter__方法的才是可迭代对象

可迭代对象:python内置str,list,tuple,dict,set,file都是可迭代对象

迭代器对象

可迭代对象执行__iter__方法得到的返回值就是迭代器对象

特点

  1. 内置__next__方法,执行该方法会拿到迭代器对象中的一个值
  2. 内置有__iter__方法,执行该方法会拿到迭代器本身
  3. 文件本身就是迭代器对象

缺点

  1. 取值麻烦,只能一个一个取,且只能往后取,值被取后就没了
  2. 无法使用len()方法获取长度

for循环原理

for循环称为迭代器循环,in后必须是可迭代对象

迭代器使用__iter__方法后拿到的还是迭代器自身,所以for循环不用考虑in后是迭代器对象还是可迭代对象

对可迭代对象使用__iter__方法后变成一个迭代器对象,这个迭代器对象只占用一小块内存空间,在使用__next__后才会一个一个地输出值

三元表达式

三元表达式就是将if...else...条件判断写在一行里得出一个值的形式

条件成立时的返回值 if 条件 else 条件不成立时的返回值

列表推导式

列表推导式是通过一行来构建我们需要的列表,但不推荐使用

常用写法为:[结果 for 变量 in 可迭代对象]

字典生成式

字典生成式是通过一行来构建我们需要的字典

lst1 = ['myz','yzm']
lst2 = ['gao','shuai']
dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
print(dic)
{'myz': 'gao', 'yzm': 'shuai'}

zip方法

zip方法可以像拉链一样,把两个对象一对一地作为键值对存储在字典中

res = zip('abcd',[1,2,3,4])
dic = dict()
for k,v in res:
    dic[k] = v
print(dic)
{'a': 1, 'b': 2, 'c': 3, 'd': 4}

或者可以直接写成:

print({k:v for k,v in zip('abcd',[1,2,3,4])})
{'a': 1, 'b': 2, 'c': 3, 'd': 4}

生成器

yield关键字

在函数中如果出现yield关键字,再调用函数,就不会继续执行代码,而是返回一个值,这个功能和return类似,但有区别就是yield不会终止函数

生成器表达式:

# 生成器表达式
tup = (i for i in range(10))
print(tup.__next__())
print(tup.__next__())
print(tup.__next__())
0
1
2
# 列表推导式
lis = [i for i in range(10)]
print(lis)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

生成器的好处就是不会把容器元素里的元素一下全部拿出来,用一个拿一个,极大的减少了内存的占用

递归

递归就是函数调用函数自己,类似于循环,但这个循环必须要有结束条件

def f1(i):
    print(i)
    i += 1
    if i > 5:
        return 
    f1(i)
    
f1(0)
0
1
2
3
4
5

与之前的闭包外观结构不同,闭包对函数的调用在返回值里而且在函数定义之外调用

posted @ 2019-06-03 19:38  acate  阅读(135)  评论(0编辑  收藏  举报