zoukankan      html  css  js  c++  java
  • Python基础学习(第7天)

    第6课 

    1、循环对象:包括一个next方法,这个方法的目的是进行到下一个结果,结束后抛出StopInteration异常;

    当循环结构如for循环调用一个循环对象时,每次循环的时候都会调用next方法,知道最后抛出StopInteration异常,循环结构知道结束,停止调用next方法。

    如:

    1 #text.txt内容为
    2 123
    3 123
    4 123
    5 for line in open('text.txt'):
    6     print line

    open方法返回的是一个循环对象,包含next方法,for循环自动调用next方法,直至出现StopInteration异常。

    用循环对象的好处在于:不用在循环还没有开始的时候,就生成好要使用的元素。所使用的元素可以在循环过程中逐次生成。这样,节省了空间,提高了效率,编程更灵活。

    2、迭代器:

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

    3、生成器:

    构造一个用户自定义的循环对象

    1)生成器的定义方法和函数定义类似,只是在return的地方换成yield;

    2)生成器中可以有多个yield,当生成器遇到一个yield,会暂停运行生成器,返回yield后面的值;当再一次调用生成器时,会从刚才的地方继续执行,直到遇到下一个yield;

    3)生成器本身是一个循环器,每次循环返回一个yield后面的值

    下面是一个生成器:
    def gen():
        a = 100
        yield a
        a = a*8
        yield a
        yield 1000
    #该生成器有3个yield,用作循环器时,会进行3轮循环
    for i in gen():
        print i
    1 def gen():
    2     for i in range(4):
    3         yield i

    这段代码还可以写成生成器表达式(Generator Expression):G = (x for x in range(4));生成器表达式是生成器的一种简单编写方式

     4、表推导(list  comprehension):是快速生成表(list)的方法。

    假如要生成表:

    L = []
    for i in range(4):
        L.append(i**2)

    还有更简单的方法,即:表推导的方法

    1 L = [x**2 for i in range(4)]

    练习题:

    1 x1 = [1,3,5]
    2 y1 = [9,12,13]
    3 L = [x**2 for (x,y) in zip(x1,y1) if(y)>10]
    L = [9,25]
    View Code

     第7课:函数对象

    函数(function)也是一个对象,函数也有属性和方法,不仅可以赋值给其它对象名,还可以作为参数传递。

    1、lambda函数:定义1个函数

    1 func = lambda x,y:x+y
    2 print func(3,4)
    3 
    4 等价于
    5 def func(x,y):
    6     return x+y
    7 print func(3,4)

    lambda生成1个函数对象,参数为x,y,返回值为x+y,函数对象的值赋给func

    2、函数作为参数传递

    函数可以作为对象,进行参数传递,函数名即为对象

    def  test(f,a,b):

      print 'test'

      print f(a,b)

    func = lambda x,y:x+y

    test(func,1,2)

    test函数的第一个参数就是一个函数对象,将func赋值给f,也可以这样写:test((lambda x,y:x+y),1,2)

    3、map函数:格式:map( func, seq1[, seq2...] ),是Python的内置函数,第一个参数是一个函数对象,第二、第三个。。。是数列。

    map函数的作用是:将函数对象作用于后面的数列的每一个元素,将每次作用的结果存储在数列中在Python 3.X中,map()的返回值是一个循环对象。可以利用list()函数,将该循环对象转换成表。

    如下:

    re = map((lambda x:x+3),[1,2,3])
    print re
    
    def func(x,y):
        return x**2,y**2
    re = map(func,[1,2,3,4],[2,3,4,5])
    print re
    
    输出:
    [4,5,6]
    [(1,4),(4,9),(9,16),(16,25)]

     4、filter函数:第一个参数也是函数对象,将函数对象作用于后面数列的每一个元素,如果函数对象返回的是True,则该次的元素储存于返回的数列中,filter函数通过函数对象来筛选数据(同理在Python3.x中 filter返回的不是list,还是循环对象),如下例子所示:

    1 def func (x):
    2     if x>100:
    3         return True
    4     else:
    5         return False
    6 ru = filter(func,[100,104,99,101,123])
    7 输出:
    8 [104, 101, 123]

    PS:filter函数最多2个参数,1个函数对象,1个数列,不像map函数可以有多个数列参数。

    5、reduce函数:格式:reduce( func, seq[, init] )第一个参数也是函数对象,且要求它能接受2个参数,然后每次迭代,将上一次的迭代结果(第一次时为init的元素,如没有init则为seq的第一个元素)与下一个元素一同执行一个二元的func函数。在reduce函数中,init是可选的,如果使用,则作为第一次迭代的第一个元素使用。返回多次迭代后的结果,如下例子所示:

    1 m = 2
    2 n = 5
    3 print reduce(lambda x,y:x*y,range(1,n+1)) #120
    4 print reduce(lambda x,y:x*y,range(1,n+1),m) #240 相当于((((2*1)*2*3*4)*5,2为init元素

    PS:reduce()函数在3.0里面不能直接用的,它被定义在了functools包里面,需要引入包。

  • 相关阅读:
    微信小程序 选择图片 并上传到服务器
    微信小程序 setData
    python--字典排序
    python--csv文件读写
    机器学习实战笔记--AdaBoost(实例代码)
    机器学习实战笔记--朴素贝叶斯(实例代码)
    python继承 super()
    机器学习实战笔记—决策树(代码讲解)
    java的基本认识
    Delphi制作DLL
  • 原文地址:https://www.cnblogs.com/qiezizi/p/5772471.html
Copyright © 2011-2022 走看看