zoukankan      html  css  js  c++  java
  • Title

    一、内置高阶函数

      map函数:接收两个数据 函数和序列,map()将函数调用'映射'到序列身上,并返回一个含有所有返回值的一个列表

      

    num1 = [1,2,3,4,5]
    num2 = [5,4,3,2,1]
    
    def add_one(x): #加
        return x+1
    
    def reduce_one(x): #减
        return x-1
    
    def pow(x):  #平方
        return x**2
    
    def map_test(func,array):
        res = []
        for i in array:
            res.append(func(i))
        return res
    
    res1 = map_test(pow,num1)
    print(res1)
    res2 = map_test(lambda x:x+1,num1)
    print(res2)
    
    #内置函数map
    res3 = map(reduce_one,num2)
    print(list(res3))
    

      reduce函数:接收两个数据 函数和序列,reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做相应计算

    num1 = [1,2,3,4,100,200]
    def reduce_test(func,array,init=None):
    
        if init==None:
            res=array.pop(0)
        else:
            res=init
        for i in array:
            res=func(res,i)
        return res
    print(reduce_test(lambda x,y:x*y,num1,10))
    
    #内置reduce函数
    from functools import reduce
    print(reduce(lambda x,y:x+y,num1))
    

      filter函数:接收两个数据 函数和序列,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素

    num1 = [1,5,20,30,100,200]
    def filter_test(func,array):
        res = []
        for i in array:
            res.append(func(i))
        return res
    
    res1 = filter_test(lambda x:x>99,num1)
    print(res1)
    
    #内置filter函数
    res2 = filter(lambda n:n>99,num1)
    print(list(res2))
    

    二、其它内置函数

     

    eval()把字符串中的数据结构提取出来
    a = "{'a':23,'b':43,'book':'english'}"
    print(eval(a))
    
    hash()可以hash的数据类型是不可变数据类型
    a = 'alex'
    b = hash(a)
    print(b)
    zip 函数(组成一一对应的元组)(如果外面不加一个lis那没得到的就是一个zip对象)
    print(list(zip(('a','b','c'),(1,2,3))))
    print(list(zip(('a','b','c'),(1,2,3,4))))
    print(list(zip(('a','b','c','d'),(1,2,3))))
    
    p = {'name':'alex','age':23,'gender':'male'}
    print(list(zip(p.keys(),p.values())))
    输出结果为:
    [('a', 1), ('b', 2), ('c', 3)]
    [('a', 1), ('b', 2), ('c', 3)]
    [('a', 1), ('b', 2), ('c', 3)]
    [('name', 'alex'), ('age', 23), ('gender', 'male')]
    
    max 和 min 函数
     l = [
         (5,'e'),
         (2,'b'),
         (3,'c'),
         (6,'d')
     ]
    
     print(list(max(l)))
     max 函数的两点说明:
    1.max处理的是可以迭代的对象,相当于for循环取出每个元素进行比较,不同数据类型之间不可以比较
    2.每个元素之间的比较是从每个元素的第一个位置依次比较,如果此位置可以区分出大小,后面就不需要比较了,直接得出这两个元素的大小
    
    
    sorted函数的使用(都是按照从小到大的顺序进行排列)
    
     name_dict ={
         'yuanhao':80,
         'alex':99,
         'wupeiqi':700
     }
     print(sorted(name_dict))
     print(sorted(name_dict,key = lambda key:name_dict[key]))
    1.对数据的进制转化
    a = hex(12)#十进制转十六进制
    b = bin(12) #十进制转二进制
    c = oct(12) #十进制转八进制
    print(a)
    print(b)
    print(c)
    
    输出结果为:
    0xc
    0b1100
    0o14
    
    2.数字转字母,字母转数字(ASCII表)
    a = ord('A')
    b = chr(99)
    print(a,b)
    输出结果:65 c
    
    3.divmod 取余函数(用在做网页的文章分页)
    c = divmod(10,3)
    print(c)
    输出结果:(3, 1)  #3余数为1
    
    4.求次方函数
    d = pow(2,3)
    e = pow(2,3,4)
    print(d,e) #d:2的3次方;e:2的3次方对4取余
    
    5.reversed函数取翻转
    
    6.round() #四舍五入函数
    7.abs()
    # print(abs(-10))
    输出 10
    
    8.all()函数 判断列表内是否都为真
      >>> print(all([1,2,'1','']))
      False
    
    
      9.any()函数 有一真则为真
    
      >>>print(any([0,'',1]))
    
      >>>True
    
      10.bytes()函数
    
      name='你好'
      print(bytes(name,encoding='utf-8'))
      print(bytes(name,encoding='utf-8').decode('utf-8'))
    
    
      print(bytes(name,encoding='gbk'))
      print(bytes(name,encoding='gbk').decode('gbk'))
    
      print(bytes(name,encoding='ascii'))#ascii不能编码中文
    
      11.isinstance()函数 判断数据类型 
    
      print(isinstance(1,int))
      print(isinstance('abc',str))
      print(isinstance([],list))
      print(isinstance({},dict))
      print(isinstance({1,2},set))

    三、迭代器和生成器

      我们已经知道,可以直接作用于for循环的数据类型有以下几种:

      一类是集合数据类型,如listtupledictsetstr等;

      一类是generator,包括生成器和带yield的generator function。

      这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

      可以使用isinstance()判断一个对象是否是Iterable对象:

    >>> from collections import Iterable
    >>> isinstance([], Iterable)
    True
    >>> isinstance({}, Iterable)
    True
    >>> isinstance('abc', Iterable)
    True
    >>> isinstance((x for x in range(10)), Iterable)
    True
    >>> isinstance(100, Iterable)
    False

      而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

      可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

      可以使用isinstance()判断一个对象是否是Iterator对象:

    >>> from collections import Iterator
    >>> isinstance((x for x in range(10)), Iterator)
    True
    >>> isinstance([], Iterator)
    False
    >>> isinstance({}, Iterator)
    False
    >>> isinstance('abc', Iterator)
    False

      生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

      把listdictstrIterable变成Iterator可以使用iter()函数:

      

    >>> isinstance(iter([]), Iterator)
    True
    >>> isinstance(iter('abc'), Iterator)
    True

      你可能会问,为什么listdictstr等数据类型不是Iterator

      这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

      Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。  

      迭代器小结

      凡是可作用于for循环的对象都是Iterable类型;

      凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

      集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

      Python的for循环本质上就是通过不断调用next()函数实现的,例如:

    for x in [1, 2, 3, 4, 5]:
        pass
    
    实际上完全等价于:
    
    # 首先获得Iterator对象:
    it = iter([1, 2, 3, 4, 5])
    # 循环:
    while True:
        try:
            # 获得下一个值:
            x = next(it)
        except StopIteration:
            # 遇到StopIteration就退出循环
            break

      生成器

      1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

      2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表,把列表解析式的中括号改为小括号

      生成器小结:

      1.是可迭代对象

      2.实现了延迟计算,省内存

      3.生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处,其余的可迭代对象可没有这点好处.

      4.只能遍历一次

      

    生成器表达式:
    >>> L = [x * x for x in range(10)]
    >>> L
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    >>> g = (x * x for x in range(10))
    >>> g
    <generator object <genexpr> at 0x1022ef630>
    
    生成器函数:裴波拉契数列
    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield b
            a, b = b, a + b
            n = n + 1
        return 'done'

     闭包问题示例:

    def multipliers():
        gs = []
        for i in (0, 1, 2, 3):
            def g(x):
                return i * x
            gs.append(g)
        return gs  # 即4个g(x) gs = [g(x),g(x),g(x),g(x),g(x)]
    print([m(2) for m in multipliers()])
    # [m(2) for m in multipliers()] 相当于 [m(2) for m in [g(x),g(x),g(x),g(x),g(x)]] 这里的个g(x)就是 def g(x):
    #                                                                                                      return i * x
    # m(2) for m in multipliers()即m是multipliers的一个返回值,即g(x)。 m(2)即g(2),2*3 = 6
    # 故结果是【6,6,6,6】
    
    #解决方法一: 使用map函数先生成一个序列(i for i in range(4)) 然后传入lambda表达式i * x 进行计算
    def multipliers(x):
        return map(lambda i :i * x ,(i for i in range(4)))
    print(list(multipliers(2)))
    
    # 解决方法二: 在循环的时候就把每次的i值当默认参数传进去
    def multipliers():
        return [lambda x, i=i : i * x for i in range(4)]
    print([m(2) for m in multipliers()])
    
    def multiplier():
        gs = []
        for i in (0, 1, 2, 3):
            def g(x,i=i):  # 在循环的时候就把每次的i值当默认参数传进去
                return i * x
            gs.append(g)
        return gs  #  gs = [ return 0*x , return 1*x , return 2*x , return 3*x ]
    print([m(2) for m in multiplier()])
    # [m(2) for m in multiplier()] 相当于 [m(2) for m in [ return 0*x , return 1*x , return 2*x , return 3*x ] ]
    

      

    菜鸟教程:内置函数详解

    资料来源:廖雪峰迭代器说明   林海峰迭代器生成器说明

     

      

  • 相关阅读:
    如何使用 vimdiff 来 git diff /svn diff
    nginx https ssl 设置受信任证书[原创]
    Nginx配置proxy_pass转发的/路径问题
    116、Android获取Manifest中<meta-data>元素的值
    Android Studio系列教程四--Gradle基础(转载)
    Android Studio系列教程六--Gradle多渠道打包(转载)
    1、Android Studio集成极光推送(Jpush) 报错 java.lang.UnsatisfiedLinkError: cn.jpush.android.service.PushProtoco
    Java数组转成list,list转数组
    115、定时器(TimerTask+Timer+Handler)
    114、Android禁止ViewPager的左右滑动
  • 原文地址:https://www.cnblogs.com/guotianbao/p/6790167.html
Copyright © 2011-2022 走看看