For loops (novice)

前端 未结 5 769

I recently started learning Python, and the concept of for loops is still a little confusing for me. I understand that it generally follows the format for x in y

5条回答
  •  执念已碎
    2021-01-18 03:38

    Just for an alternative, how about generalizing the iterate/increment operation to a lambda function so you can do something like this:

    for i in seq(1, 9, lambda x: x*2):
        print i
    ...
    1
    2
    4
    8
    

    Where seq is defined below:

    #!/bin/python
    from timeit import timeit
    
    def seq(a, b, f):
        x = a;
        while x < b:
            yield x
            x = f(x)
    
    def testSeq():
        l = tuple(seq(1, 100000000, lambda x: x*2))
        #print l
    
    def testGen():
        l = tuple((2**x for x in range(27)))
        #print l
    
    testSeq();
    testGen();
    
    print "seq", timeit('testSeq()', 'from __main__ import testSeq', number = 1000000)
    print "gen", timeit('testGen()', 'from __main__ import testGen', number = 1000000)
    

    The difference in performance isn't that much:

    seq 7.98655080795
    gen 6.19856786728
    

    [EDIT]

    To support reverse iteration and with a default argument...

    def seq(a, b, f = None):
        x = a;
        if b > a:
            if f == None:
                f = lambda x: x+1
            while x < b:
                yield x
                x = f(x)
        else:
            if f == None:
                f = lambda x: x-1
            while x > b:
                yield x
                x = f(x)
    
    for i in seq(8, 0, lambda x: x/2):
        print i
    

    Note: This behaves differently to range/xrange in which the direction </> test is chosen by the iterator sign, rather than the difference between start and end values.

提交回复
热议问题