迭代器生成器

迭代器

1.迭代器就是迭代的工具,迭代也可以说成是重复,并且每一次重复都是基于上一次的结果而来的,在python中一切皆对象.
2.可迭代对象:只要拥有__iter__方法的对象都是可迭代对象.
3.可迭代的对象有:python内置的str list tuplie dict set file 都是可迭代对象

  • 特点:内置有__iter__方法的都叫可迭代的对象

迭代器对象

1.迭代器对象的概念

  • 可迭代的对象执行__iter__方法得到的返回值,并且可以迭代对象会有一个__next__方法,并且 文件本身就是迭代器对象
    总结
    1.可迭代对象:拥有iter方法的对象就是可迭代对象 推导:可迭代对象不一定是迭代器对象
    2.迭代器对象:拥有iter方法和next方法的就是可以迭代对象, 推导:迭代器对象一定是可迭代对象
    3.文件即是可迭代对象,也是迭代器对象
    缺点:取值麻烦,只能一个一个取,并且只能往后取,值取了就没了
    无法使用len()方法获取长度

for 循环原理

  • for 循环称为迭代器循环,in后必须是可迭代的对象
    解释:因为迭代器使用 __ iter__后还是迭代器本身,因此for循环不用考虑in后的对象是可迭代对象还是迭代器对象,

三元表达式

条件成立时返回值if条件else条件不成立时的返回值
x=10
y=20
x if x>y else y

列表推导式

[i for i in range(10)]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

字典生成式

print({i: i**2 for i in range(10)})

{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

zip方法

res = zip('abcd',[1,2,3,4])
dic = dict()
for k,v in res:
    dic[k] = v

print(dic)
# 方法二
print({k:v for k,v in zip('abcd',[1,2,3,4])})

生成器表达式

  • 把列表推导式的[]换成(),就是生成器表达式
  • 优点:省内存,一次只产生一个值在内存中
  • 列表推导式相当于直接给你一筐鸡蛋,而生成器表达式相当于给你一只老母鸡
# 列表推导式
with open('52.txt', 'r', encoding='utf8') as f:
    nums = [len(line) for line in f]

print(max(nums))

# 生成器表达式
with open('52.txt','r',encoding='utf8') as f:
    nums = (len(line) for line in f)

print(max(nums)) # ValueError: I/O operation on closed file.

yield

yield的英文单词意思是生产,在函数中但凡出现yield关键字,再调用函数,就不会继续执行函数体代码,而是会返回一个值。

def func():
    print('from 1')
    yield
    print('from 2')
    yield

函数递归

函数的嵌套调用时:函数嵌套函数,函数的递归调用:它是一种特殊的嵌套调用,但是它在调用一个函数的过程中,又直接或间接的调用了它本身
def foo():
    print('from foo')
    foo()

foo()  # 进入死循环
如果递归函数不断的调用函数自身,那么这个递归函数将会进入一个死循环,因此我们应该给递归函数一个明确的结束条件

1.直接调用:直接在函数内部调用函数自身
2.间接调用:不在原函数体内调用函数自身,而是通过其他的方法间接的调用函数自身

  • 递归必须要有的两个明确阶段
    1.递推:一层一层递归调用下去,进入下一层递归的问题规模都将会减小
    2.回溯:递归碧玺要有一个明确的结束条件,找满足该条件开始一层一层回溯
    3.递归的精髓在于通过不断的重复逼近一个最终的结果
posted @ 2019-06-03 19:23  『侠客行』  阅读(129)  评论(0编辑  收藏  举报