迭代器

迭代器

"""
1 什么是迭代器
    迭代器就是用来迭代取值的工具

    什么是迭代?
        迭代就是一个重复的过程,但是每次重复都是基于上一次的结果进行的

        # 单纯的重复不叫迭代
        while True:
            1+1

        # 下面才是迭代的过程
        count = 1
        while count < 5:
            print(count)
            count += 1

2、为何要用迭代器
    优点
    (1) 找到一种通用的迭代取值方案->for循环
    (2)惰性计算,节省内存

    缺点:
        1、不能取指定的值,只能往后next
        2、迭代器对象是一次性的:一个迭代器对象值取干净了,不能继续取了

3、如何用迭代器

"""
可迭代对象
  1、内置有__iter__方法的对象都是可迭代对象

"abc".__iter__()
[1, 2, 3].__iter__()
(1, 2, 3).__iter__()
{"x": 1, "y": 2}.__iter__()
{1, 2, 3, 4}.__iter__()
# open('a.txt', mode='r').__iter__()
# open('a.txt', mode='r').__next__()


# 调用可迭代对象的__iter__()会得到一个返回值,该返回值是迭代器对象
# 迭代对象对象的特点:
#           1、内置有__next__()方法
#           2、内置有__iter__()方法


# names = ['egon', 'tom', 'jack', 'lili', 'ttt']
# names = {"x":1,"y":2,'z':3}

# iter_names = iter(names)
# while True:
#     try:
#         print(next(iter_names))
#     except StopIteration:
#         break

# for工作原理
# 1、调用in后那个对象的__iter__方法,得到一个迭代器对象iter_names
# 2、x=next(iter_names),然后运行循环体代码
# 3、重复步骤2,直到取完值,抛出异常,for循环会帮我们捕捉异常结束循环
# for x in names:
#     print(x)



可以简写
l = [1,2,3]
res = iter(l)
print(next(res))

生成器

 函数内但凡出现yield关键字,再调用函数不会立即执行函数体代码,而会返回一个
 生成器对象,生成器对象本质就是一个自定义的迭代器对象
yield 对比 return
# 相同点:都可以返回任意类型、任意个数的值
# 不同点:return只能返回值一次值,函数就立即结束
#        yield可以返回多次值,yield可以暂停函数的运行
def func():
    print('111')
    yield 222
    print('333')
    yield 444
    print('555')
    yield 666


g = func()
print(next(g))
print(next(g))
print(next(g))
无限叠加数字

def func():
    res = 0
    while True:
        yield res
        res += 1


g = func()
for i in g:
    print(i)

函数递归

"""
1、什么是函数递归
     函数递归是函数嵌套调用的一种特殊格式
     即在调用一个函数时,在其内部又调用了自己
    # def foo():
    #     print('from foo')
    #     foo()
    #
    #
    # foo()

    import sys
    print(sys.getrecursionlimit())
    sys.setrecursionlimit(2000)

    递归应该分为两个阶段
    1、回溯:一层一层往下调用
    2、递推:一层一层向上推出结果


# 2、为何要用函数递归
    函数递归提供了一种基于函数实现的新的循环机制



# 3、如何用函数递归
"""
# def age(n):
#     if n == 1:
#         return 18
#     else:
#         return age(n-1)+10
#
# res = age(5)
# print(res)
# 例1:
# l = [11, [22, [33, [44, [55, [66, [77, [88, [99]]]]]]]]]
#
#
# def func(l):
#     for item in l:
#         if type(item) is list:
#             func(item)
#         else:
#             print(item)
#
# func(l)
# 例2:递归实现二分法

nums = [3, 7, 9, 13, 21, 33, 57, 63, 78, 99]

def search(nums,find_num):
    print(nums)
    if len(nums) == 0:
        print('not exists')
        return
    mid = len(nums) // 2
    if find_num > nums[mid]:
        # 找右半部分
        search(nums[mid+1:],find_num)

    elif find_num < nums[mid]:
        # 找左半部分
        search(nums[:mid],find_num)
    else:
        print('find it')

# search(nums,63)
search(nums,64)

三元表达式

def max2(x,y):
    if x > y:
        return x
    else:
        return y


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

x = 10
y = 20

# res = x if x > y else y
res = "ok" if 'a' != "a" else "no"
print(res)

生成式

列表生成式
l = [i for i in range(10) if i > 3]
# print(l)

# names = ['egon', "lxx_sb", "hxx_sb", "wxx_sb", "lxx_sb"]
# res = [name for name in names if name.endswith('sb')]
# print(res)

# names = ["lxx", "hxx", "wxx", "lxx"]
# print([name+"_sb" for name in names])
 字典生成式
# print({"k%s" %i:i for i in range(3)})
# 集合生成式
# print({i for i in range(3)})
# 生成器表达式
# res = (i for i in range(5))
# print(res)
# print(next(res))
# print(next(res))
# with open('a.txt', mode='rt', encoding='utf-8') as f:
    # res = f.read()
    # print(len(res))  # 23个字符

    # res = 0
    # for line in f:
    #     res += len(line)

    # res = sum((len(line) for line in f))
    # res = sum(len(line) for line in f)
    # print(res)
上一篇:PM自我修炼之——产品学习方法论


下一篇:深度学习优化算法