zoukankan      html  css  js  c++  java
  • 函数迭代器、生成器、递归

    迭代器

    只要拥有__iter__方法的都是可迭代对象

    迭代器对象:拥有 iter 和__next__方法的就是迭代器对象

    字符串/列表/元组/字典/集合/文件都是可迭代对象

    __next__遍历可迭代对象中的元素

    文件本身就是迭代器对象

    迭代器对象使用__iter__方法后还是迭代器本身

    # 以下都是可迭代对象
    
    name = 'nick'.__iter__
    lis = [1,2].__iter__
    tup = (1,2).__iter__
    dic = {'name':'nick'}.__iter__
    s1 = {'a','b'}.__iter__
    f = open('text.txt','w',encoding='utf-8')
    f.__iter__
    f.close
    
    s = 'hello'
    iter_s = s.__iter__()
    
    while True:
        try:
            print(iter_s.__next__())
        except StopIteration:
            break
    

    h

    e

    l

    l

    o

    三元表达式和列表推导式

    三元表达式

    name='xiaogou'
    if name=='fenggou':
        print('远离他')
    else:
        print('盘他')
    

    三元表达式表示:

    print('远离他') if name=='fenggou' else print('盘他')
    

    列表推导式

    lis=[]
    for i in range(100):
        lis.append(i)
        print(lis)
    

    列表推导式表示:

    [print(i) for i in lis if i>50]
    

    字典生成式

    字典生成式

    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()方法

    keys = ['name','age','gender']
    values = ['nick',19,'male']
    res = zip(keys,values)
    info_dict = {k: v for k,v in res}
    print(info_dict)
    

    {'name':'nick','age':19,'sex':'male'}

    生成器

    yield关键字

    def func():
        print(1)
        yield
        print(2)
        yield
    g = func()
    for i in g:
        print(i)
    

    1

    None

    2

    None

    yield和return

    相同点:两者都是在函数内部使用,都可以返回值,并且返回值没有类型和个数的限制

    不同点:return只能返回一次值,yield可以返回多次值

    生成器表达式

    • 把列表推导式的[]换成()就是生成器表达式
    • 优点:省内存,一次只产生一个值在内存中
    tup = (i for i in range(10))
    print(tup)
    

    递归

    函数自己调用函数自己,类似于循环,但是必须得有结束条件

    直接调用

    直接在函数内部调用函数自身

    def f1(x):
        print(x)
        x += 1
        if x == 10:
            return
        f1(x)
    f1(0)
    

    间接调用

    不在原函数体内调用函数自身,而是通过其他的方法间接调用函数自身

    def bar():
        print('from bar')
        foo()
        
    def foo():
        print('from foo')
        bar()
        
    bar()
    

    二分法的应用

    有一个从小到大排列的整型数字列表,判断某一个数字是不是在这个列表里面。

    动图二分法查找数字23:

    53递归-二分23.gif

    动图二分法查找数字1:

    53递归-二分1.gif

    from random import randint
    nums = [randint(1,100) for i in range(100)]
    nums = sorted(nums)
    print(nums)
    

    [1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21, 21, 23, 24, 26, 26, 27, 28, 28, 31, 33, 33, 34, 35, 38, 38, 39, 40, 42, 43, 45, 45, 46, 46, 47, 47, 51, 52, 52, 53, 53, 55, 55, 56, 56, 57, 57, 57, 58, 59, 61, 62, 64, 66, 66, 67, 68, 69, 69, 71, 72, 72, 74, 74, 75, 76, 78, 78, 79, 79, 79, 79, 80, 82, 85, 88, 89, 90, 90, 91, 91, 91, 94, 99, 99, 100]

    def search(search_num,nums):
        mid_index = len(nums)//2
        print(nums)
        if not nums:
            print('not exists')
            return
        if search_num > nums[mid_index]:
            # in the right
            nums = nums[mid_index+1:]
            search(search_num,nums)
        elif search_num < nums[mid_index]:
            # in the left
            nums = nums[:mid_index]
            search(search_num,nums)
        else:
            print('find it')
    
    search(7,nums)
    

    [1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21, 21, 23, 24, 26, 26, 27, 28, 28, 31, 33, 33, 34, 35, 38, 38, 39, 40, 42, 43, 45, 45, 46, 46, 47, 47, 51, 52, 52, 53, 53, 55, 55, 56, 56, 57, 57, 57, 58, 59, 61, 62, 64, 66, 66, 67, 68, 69, 69, 71, 72, 72, 74, 74, 75, 76, 78, 78, 79, 79, 79, 79, 80, 82, 85, 88, 89, 90, 90, 91, 91, 91, 94, 99, 99, 100]
    [1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21, 21, 23, 24, 26, 26, 27, 28, 28, 31, 33, 33, 34, 35, 38, 38, 39, 40, 42, 43, 45, 45, 46, 46, 47, 47]
    [1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21]
    [1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7]
    [6, 6, 7, 7, 7]
    find it

  • 相关阅读:
    微信小程序の模板
    微信小程序の条件渲染
    微信小程序のwxml列表渲染
    769. Max Chunks To Make Sorted
    766. Toeplitz Matrix
    747. Largest Number At Least Twice of Others
    746. Min Cost Climbing Stairs
    729. My Calendar I
    724. Find Pivot Index
    718. Maximum Length of Repeated Subarray
  • 原文地址:https://www.cnblogs.com/gaohuayan/p/10969787.html
Copyright © 2011-2022 走看看