函数

(1) 传递任意数量的实参:
                形参名*args 中的星号让Python创建一个名为args的空元组,并将收到的所有值都封装到这个元组中。
                **kwargs 让Python创建一个名为args的空字典(args和kwargs只是名称,可以自定义)
                实例:
                # 使用*args
                def test_args(*args)
                    for n in args:
                        print(n)
                    args_list = [1,2,3,4]
                    test_args(args_list)
                    #输出为1   2   3   4
                    # **args的使用
                    def test_kwargs(**kwargs):
                        for key,val in kwargs:
                            print(key + ' ' + val)
                    test_kwargs(name = 'why',age = '18')    
                    # 输出为 name why 
                                     age 182)range:惰性创建数字列表,默认连续,可指定步长,python2中立即创建
                >>> test = input('输入字符串:')
                输入字符串:wvwdvwdvwvwevev
                >>> range(len(test))
                range(0, 15)
                >>> for index in range(len(test)):
                    print(index)
                0
                1
                2
                3

 

1.高阶函数:一个函数既可以接收变量为参数,也可以接受另一个函数作为参数,这种函数称为高阶函数
例如:
    >>> def add(x,y,f):
            return f(x)+f(y)

    >>> add(-5,-6,abs)
        11    
2.map和reduce函数:
    map函数接收两个参数一个函数和一个Iterable(可迭代对象),
    map函数将Iterable中的每一元素作用于接收到的函数中,返回一个Iterator(迭代器)
    举例:
        >>> def f(x):
                return x**2
        >>> print(list(map(f,[1,2,3,4,5,6])))
        [1, 4, 9, 16, 25, 36]
    reduce函数接受两个参数一个函数和一个Iterable,并且这个函数必须接收两个参数,
    先将Iterable中的前两个元素,传入function中,返回的值接着与Iterable之后的元素继续当作实参传入function中,
    以此类推
    举例:
        """累加列表中的元素"""
        >>> from functools import reduce
        >>> def f(x,y):
            return x+y

        >>> reduce(f,[1,2,3,4,5,6,7,8,9])
        45
    将map函数和reduce函数结合可以写出str转换为int的函数,代码如下
    >>> from functools import reduce
    >>> def syr2num(s):
            def fn(x,y):
                return x*10 + y
            def char2list(s):
                return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]
            return reduce(fn,map(char2list,s))
    >>> syr2num('1234')
    1234
3.filter函数
    filter接收一个函数和一个Iterable,根据函数返回的是True还是False筛选Iterable中的元素
    例1:
        """
        使用埃氏筛法筛选素数
        """
        def creat_list():
            """列出从3开始的奇数"""
            n = 1
            while True:
                n = n+2
                yield n
        def filter_list(n):
            """筛选函数"""
            return lambda x: x%n>0
        def su():
            yield 2
            it = creat_list()
            while True:
                n = next(it)
                yield n
                it = filter(filter_list(n),it)
        for n in su():
            if n < 100:
                print(n)
            else:
                break
    例2:
        def is_palindrome(n):
            """筛选回文数"""
            if n<10:
                return True
            elif n>=10:
                s = str(n)
                i = int(len(s) / 2)
                m = 0
                while i>=0:
                    if s[i]==s[-(i+1)]:
                        m += 1
                    i-=1
                if m == int(len(s) / 2)+1:
                    return True
                else:
                    return False
        output = filter(is_palindrome, range(1, 10000))
        print(list(output))
4.sorted
    sorted函数是排序函数
    >>> sorted([1,6,4,2,5,7,8,6,5,3,5,7,8])
    [1, 2, 3, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8]
    # 默认使用元素对应的ASCLL码进行排序
    >>> sorted(['a','c','b','B'])
    ['B', 'a', 'b', 'c']
    # key函数将作用于每一个元素
    >>> sorted(['a','c','b','B'],key = str.lower)
    ['a', 'b', 'B', 'c']
    # 倒序排序
    >>> sorted(['a','c','b','B'],key = str.lower,reverse = True)
    ['c', 'b', 'B', 'a']
    # 对元组进行排序会返回一个列表,因为元组不可变
    >>> sorted(('a','c','b','B'))
    ['B', 'a', 'b', 'c']
    >>> 
    举例:
        """
        假设我们用一组 tuple 表示学生名字和成绩:
        L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
        请用 sorted()对上述列表分别按名字排序:
        """
        # -*- coding: utf-8 -*-
        L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
        def by_name(t):
            return t[0]
        L2 = sorted(L, key=by_name)
        print(L2)
        """
        再按成绩从高到低排序:
        """
        # -*- coding: utf-8 -*-
        L1 = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
        def by_score(t):
            return t[1]
        L2 = sorted(L1,key=by_score)
        print(L2)
5.返回函数:
    一个函数既可以接收一个函数作为参数,也可以返回一个函数
    例1:
        def lazy_add(*args):
            def add():
                sum = 0
                for n in args:
                    sum = sum +n
                return sum
            return add
        >>> ff = lazy_add(1,2,3,4,5,6,7,8,9)
        >>> ff
        <function lazy_add.<locals>.add at 0x0000012773E4C1E0>
        >>> ff()
        45
    返回的函数中包含了局部变量args,可见当一个函数返回一个函数时,函数中定义的局部变量,
    也包含在了被返回的函数当中了(即新函数)
    需要注意的是返回的新函数并不是立即执行,而是等到调用时才会被执行
    例2:
    >>> def count():
            fs = []
            for i in range(1,4):
                def f():
                    return i*i
                fs.append(f)
            return fs

        >>> f1,f2,f3 = count()
        >>> f1()
        9
        >>> f2()
        9
        >>> f3()
        9
    上面这个函数并没有得到我们想要的结果,即f1() 输出1,f2() 输出 4,f3() 输出9
    这是因为调用函数时返回的新函数并没有被马上执行,而是等到调用新函数时才执行
    调用时变量i已经变为3,所以最后的输出均为9,返回闭包时牢记的一点就是:
    返回函数不要引用任何循环变量,或者后续会发生变化的变量。
    上面这个例子如果必须要使用循环变量,就再增加一个函数将变量绑定
    例2:
    >>> def count():
            def f(j):
                def g():
                    return j*j
                return g
            fs = []
            for i in range(1,4):
                fs.append(f(i))
            return fs

        >>> f1,f2,f3 = count()
        >>> f1()
        1
        >>> f2()
        4
        >>> f3()
        9
    这样就得到了想要得到的返回结果
6.匿名函数:
    格式:lambda 参数: 表达式
    相当于:
        def func(参数):
            return 表达式
    注意匿名函数只能有一个表达式
    匿名函数可以当作参数传递给函数,如map函数
    例1:
        list(map(lambda x: x*x,[1,2,3,4,5,6,7,8,9]))
        >>>[1,4,9,16,25,36,49,64,81]
    匿名函数还可以作为一个变量
    例2:
        >>> f = lambda x: x*x
        >>> f(5)
        25
    匿名函数还可以当作函数的返回值
    例3        
        >>> def f():
            return lambda x: x*x

        >>> ff = f()
        >>> ff(5)
        25
7.decorator装饰器
    #装饰器:本质就是函数,装饰其他函数(为其他函数添加其他功能),不修改被装饰函数的源代码和调用方式
    装饰器的作用是在代码运行期间动态的增加功能
    我们写一个打印时间的函数:
    def now():
        print('2019-05-29')
    >>>2019-05-29
    如果我们想添加一个函数执行日志,就需要写一个装饰器:
    def log(func):
        """"一个打印函数执行日志装饰器"""
        def f(*args,**kw):
            print("%s():",func.__name__)
            return func(*args,**kw)
        return f
    这个装饰器的使用方法是:
    @log()
    def now():
        print('2019-05-29')
    >>> now()
    date,now():
    2019-05-29
    上面的使用方法相当于执行了
    now = log(now)
    这样做会出现一个问题,现在now()函数指向的是装饰器返回的函数,也就是一个新函数,
    此时函数名发生了改变
    >>> now.__name__
        'f'
    函数名变成了f(),要解决这个问题,python中有专门的解决方法
    import functools
    def log(text):
        def decorate(func):
            @functools.wraps(func)  # 经过装饰的函数,函数名会改变,该行语句使函数名不发生变化
            def f(*args,**kw):
                print('%s,%s():' % (text,func.__name__))
                return func(*args,**kw) # 这里直接返回的是函数执行结果,不是返回函数名
            return f
        return decorate
    @log('date')
    def now():
        print('2019-05-29')

    now()
    print(now.__name__)
    这时的输出为:
    """
    D:\python37\python.exe E:/资源/python/DOME.C/LIAOXUEFENG2/decorate.py
    date,now():
    2019-05-29
    now
    """
8.偏函数
    int()函数可以将字符串变量转换为整数,默认情况下按十进制转换
    如:
        int('1234')
        >>>1234
    但也可以传入参数N,即将字符串按N进制转换、
    如:
        >>> int('1234',base = 8) # 将'1234'按八进制转换为十进制的整数
        668
    但是每次调用时都需要传入参数,非常麻烦,偏函数就可以解决这个问题
    import functools
    int2 = functools.partial(int,base = 2)
    这样我们就把int2()函数变成了一个按二进制转化字符串的函数
    >>>int2('10101')
    21
    相当于执行了:
    def int2(x,base = 2):
        return int(x,base)
    偏函数的作用就是固定函数中的参数,使调用更方便

 

posted @ 2020-06-13 17:32  pywhy  阅读(102)  评论(0编辑  收藏  举报