• python学习笔记-Day4(1)


    迭代器

    迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件

    特点:

    1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
    2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问
    3. 访问到一半时不能往回退
    4. 便于循环比较大的数据集合,节省内存

    生成迭代器:

    a = iter(['john','teddy','tony','nina'])
    print(a)


    访问列表内容:

    a = iter(['john','teddy','tony','nina'])
    print(a)
    print(a.__next__())
    print(a.__next__())
    print(a.__next__())
    print(a.__next__())



    执行结果:

    <list_iterator object at 0x006CA2B0>
    john
    teddy
    tony
    nina

    生成器generator

    定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器 

    def cash_money(amount):
    while amount >0:
            amount -=100
    yield 100
    print("又来取钱了")
    
    ATM =cash_money(500)
    print(ATM.__next__())
    print(ATM.__next__())
    print(ATM.__next__())
    print("中断")
    print(ATM.__next__())

     作用:

    这个yield的主要效果呢,就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。

    异步应用

    还可通过yield实现在单线程的情况下实现并发运算的效果。

    import time
    def consumer(name):
        print("%s 准备吃包子啦!" %name)
        while True:
           baozi = yield
           print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
    def producer(name):
        c = consumer('A')
        c2 = consumer('B')
        c.__next__()
        c2.__next__()
        print("老子开始准备做包子啦!")
        for i in range(10):
            time.sleep(1)
            print("做了2个包子!")
            c.send(i)
            c2.send(i)
    producer('Candy')

    装饰器由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。

    >>> def welcome():
    ...     print('welcome to visit my home page!')
    ...
    >>> f = welcome
    >>> f()
    welcome to visit my home page!
    def login(func):
        def iner(*args,**kwargs):
            print("passed user verification....")
            func(*args,**kwargs) #func = tv
        return iner
    def home(name):
        print("Welcome [%s] to home page" %name)
    # def tv(name):
    @login # = tv login(tv) perform the function "login"
    def tv(name):
        print("Welcome [%s] to Tv page" %name)
    def movie(name,pwd="123"):
        print("Welcome [%s] to movie page" %name)
    
    
    # tv = login(tv)
    tv("Alex")
    movie("Mikey",pwd="123")

    递归

    特点

    递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
    递归算法解决问题的特点:
    (1) 递归就是在过程或函数里调用自身。
    (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
    (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
    (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

    要求

    递归算法所体现的“重复”一般有三个要求:
    一是每次调用在规模上都有所缩小(通常是减半);
    二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
    三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。
     
    实现:
    def cal(n):
        print(n)
        if n/2>1:
            res = cal(n/2)
            print('res:',res)
        print("N:",n)
        return n
    
    cal(100)
    斐波那契算法应用:

    def func(arg1,arg2,stop):
        if arg1 == 0:
            print(arg1,arg2)
        arg3 = arg1 + arg2
        print(arg3)
        if arg3<stop:
            func(arg2,arg3,stop)
    
    func(0,1,30)
    折半查找 /二分查找:
    def binary_search(data_source,find_n):
    
        mid = int(len(data_source)/2)
    
        if (len(data_source)) >= 1:
    
            if data_source[mid] > find_n: # data in left
    
               print("data in left of [%s]" %data_source[mid])
               binary_search(data_source[0:mid],find_n)
    
            elif data_source[mid] < find_n:
                  print("data in right of[%s]" %data_source[mid])
                  binary_search(data_source[mid:],find_n)
            else:
                print("found find_s,",data_source[mid])
        else:
            print("cannot find....")
    if __name__ == '__main__':
        data = list(range(1,6000000,3))
    
        binary_search(data,400)
     


  • 相关阅读:
    欧拉回路一个定理的证明
    NOIP2018 初赛数学第二题解析
    linux 减少Terminal路径的方法
    网络挖坑
    linux 记录
    河南游记 Day0

    NOI2018 Day 1 你的名字
    大佬的几行fastIO
    Codeforces 781B. Innokenty and a Football League
  • 原文地址:https://www.cnblogs.com/luoye00/p/5185418.html
Copyright © 2020-2023  润新知