• python语法笔记(二)


    1. 循环对象

    循环对象是一类特殊的对象,它包含一个next()方法(在python3中是 __next__()方法),该方法的目的是进行到下一个结果,而在结束一系列结果之后,举出 StopIteration错误。

      当一个循环结构(比如for)调用循环对象的时候,它就会每次循环的时候调用 next()方法,直到 StopIteration出现,for循环接收到 StopIteration,就知道循环结束,停止调用next().比如:

    f = open('1.txt')
    f.next()
    f.next()
    ...
    open()实际返回一个循环对象,不断输入 f.next(),直到遇到 StopIteration
    
    以上使用next()方法手动循环对象,可以自动的进行:
    for lin in open('1.txt')
        print line
    
    for循环结构自动调用 next()方法,将该方法的返回值赋予给line。循环知道出现 StopIteration的时候结束。
    
    相对于序列,使用循环对象的好处在于:不用在循环还没开始的时候,就生成好要使用的元素。所使用元素
    可以在循环的过程中逐渐生成,类似 迭代器。
    

    2. 迭代器

      从技术上来说,循环对象和for循环调用之间还有一个中间层,就是要将循环对象转换成迭代器。这一转换是通过iter()函数实现的,在逻辑层面上常常忽略这一点,所以循环独享和迭代器常常相互指代。

    3.生成器

      生成器可以构造一个用户自定义的循环对象。生成器的编写方法和函数定义类似,只是在return的地方改为 yield。生成器中可以有多个yield,当生成器遇到一个yield时,会暂停运行生成器,返回yield后面的值。当再次调用生成器的时候,会从刚才暂停的地方继续运行,直到下一次yield。生成器自身构成一个循环器,每次循环使用一个yield返回的值。

    def gen():
        a = 100
        yield a
        a = a*8
        yield a
        yield 1000
    
    for i in gen():
        print i
    
    def gen():
        for i in range(4):
            yield i
    
    或者可以写成生成器表达式
    G = (x for x in range(4))
    

    4.表推导

    表推导是快速生成表的方法,它的语法简单,很有实用价值。

    假设我们生成表L:

    L = []
    for x in range(10):
        L.append(x**2)
    
    使用表推导表达式可以很方便的写为:
    L = [x**2 for x in range(10) ]
    这和生成器表达式类似,只不过使用的是中括号。
    

     注意生成器表达式和表推导的区别,圆括号 vs 中括号:

    #生成器表达式
    G = (x for x in range(4))
    
    #表推导
    L = [x**2 for x in range(10)]
    

    5. lambda函数

    func = lambda x, y: x+ y
    print func(3,4)
    

      lambda 函数是一种匿名函数,可以在代码中封装一些常用的操作代码,而不需要显式的定义函数。

    6. 函数作为参数传递

    函数可以作为一个对象,进行参数传递。函数名即为该对象,比如说:

    def test(f, a, b):
        print 'test'
        f(a, b)
    
    test(func, 3, 4)
    #func为一个函数,作为一个参数,传递给函数test
    
    也可以将一个lambda表达式作为参数传递给函数:
    test((lambda x, y: x**2 + y), 6, 9)
    

     7. map函数

    map()是python的内置函数,它的第一个参数是一个函数对象。

    re = map((lambda x:x + 3), [1,3,4,5])

    这里参数1为lambda定义的函数对象,参数2为一个包含多个元素的表。map()的功能是将函数对象依次作用于表的每一个元素,每次作用的结果存储于返回的表re中。map是通过读入的函数来操作数据。

    如果作为参数的函数对象有多个参数,可以使用下面的方式,向map()传递函数参数的多个参数:

    re = map((lambda x, y: x + y), [1,2,3], [6,7,8])

    map()将每次从两个表中分别取出一个元素,带入lambda所定义的函数。

    在python3中,map()返回值不是一个表,而是一个循环对象。

    8. filter函数

    filter()和map()类似,将作为参数的函数对象作用于多个元素。如果函数对象返回的为True,则该次的元素被存储于返回的表中。filter通过读入的函数来筛选数据。在python3中,filter返回的不是表,而是循环对象。

    def func(a):
        if a > 100:
            return True
        else:
            return False
    
    print fileter(func, [10, 56, 101, 100])
    

    9. reduce函数

    reduce函数的第一个参数也是函数对象,但是该函数自身能接受两个参数。reduce可以累进的将函数作用于各个参数。如:

    print reduce((lambda x, y: x + y), [1,2,3,4])

    第一个参数为lambda表达式,接受两个参数x,y,返回x+y

    reduce将表中的前两个元素1,2传递给lambda函数,得到3。该返回值3将作为lambda函数的第一个参数,而表中得下一个元素3作为lambda函数的第二个参数,进行下一次对lambda函数的调用,得到6,最后得到10.直到表中没有剩余的元素。

    参考:

    http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html

  • 相关阅读:
    用__new__ 创建单例模式
    函数的列表作为默认参数
    循环闭包函数打印列表
    斐波那契函数和回调函数
    类的共享属性
    字典和format用法
    python 面试大全: 01_类变量在内部是作为字典处理的
    git 学习删除某次提交
    mysql调优
    re模块
  • 原文地址:https://www.cnblogs.com/gtarcoder/p/5027475.html
Copyright © 2020-2023  润新知