函数(作用域,匿名函数,函数式编程,高阶函数)

banzhihuanyu 2019-11-01

一.函数作用域                                          1.函数名表示的是内存地址
def test1():
    print(‘in the test1‘)
def test():
    print(‘in the test‘)
    return test1

print(test())
打印:in the test<function test1 at 0x000001E90E452EA0>2.函数的作用域只跟函数声明时定义的作用域有关,跟函数的调用位置无任何关系
name = ‘xiaopang‘
def foo():
    name=‘fangjiyi‘
    def bar():

        print(name)
    return bar
a=foo()
a()
运行结果:fangjiyi二.匿名函数
1.定义:lambda x:x+1    形参 返回值(包含运算逻辑)2.使用方式赋函数名实现单个参数name=‘fang‘func=lambda x:x+‘sb‘func(name)print(func(name))多个参数:f=lambda x,y,z:(x+1,y+1,z+1)print(f(5,6,7))打印结果:(6,7,8)三.函数式编程函数式编程=编程语言定义的函数+数学意义的函数1.高阶函数定义(满足以下其一)*1函数接收的参数是一个函数名  *2返回值中包含函数*把函数当作参数传给另外一个函数def foo(n):    print(n)def bar(name):    print(‘my name is %s‘ %name)foo(bar)foo(bar(‘alex‘))*返回值中包含函数方式一def bar():    print(‘from bar‘)def foo():    print(‘from foo‘)    return barn=foo()n()方式二def hanle():    print(‘from handle‘)    return hanleh=hanle()h()运行结果:from handlefrom handle2.高阶函数--filterfilter()函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。需求:过滤掉带前缀的字符串1.使用正常方式(类似filter实现的过程):students=[‘sb-bcs‘,‘sb-ljf‘,‘fjy-nb‘,‘ql-nb‘,‘zsb‘]def sb_reduce(func,array):    ret=[]    for i in array:        if not func(i):            ret.append(i)    return retprint(sb_reduce(lambda x:x.startswith(‘sb‘),students) )#运行结果:[‘fjy‘, ‘ql‘, ‘zsb‘]2.使用filter函数*filter返回的是迭代器对象students=[‘sb-bcs‘,‘sb-ljf‘,‘fjy-nb‘,‘ql-nb‘,‘zsb‘]print(filter(lambda x:x.startswith(‘sb‘),students) )打印结果:<filter object at 0x000001C1CFEF4978>**通过list方法遍历取值(默认取判断正确的)students=[‘sb-bcs‘,‘sb-ljf‘,‘fjy-nb‘,‘ql-nb‘,‘zsb‘]print(list(filter(lambda x:x.startswith(‘sb‘),students)) )打印结果:[‘sb-bcs‘, ‘sb-ljf‘]***进行 判断修改 实现过滤students=[‘sb-bcs‘,‘sb-ljf‘,‘fjy-nb‘,‘ql-nb‘,‘zsb‘]print(list(filter(lambda x:not x.startswith(‘sb‘),students)) )打印结果:[‘fjy-nb‘, ‘ql-nb‘, ‘zsb‘]3.高阶函数--mapmap()函数会根据提供的函数对指定序列做映射需求:对任意数组实现加减乘除等处理*正常实现(同时也是map函数实现过程)
num_l=[1,2,10,5,3,7]
def map_test(func,array):
    ret=[]
    for i in array:
        res=func(i) #add_one(i)
        ret.append(res)
    return ret

print(map_test(lambda x:x+1,num_l))
print(map_test(lambda x:x-1,num_l))
print(map_test(lambda x:x*2,num_l))
print(map_test(lambda x:x/2,num_l))
打印结果:[2, 3, 11, 6, 4, 8][0, 1, 9, 4, 2, 6][2, 4, 20, 10, 6, 14][0.5, 1.0, 5.0, 2.5, 1.5, 3.5]**map函数map函数返回的是一种可迭代对象num_l=[1,2,10,5,3,7]print(map(lambda x:x+1,num_l))打印结果:<map object at 0x000001FE068CA048>***使用map函数需要用list取值出来num_l=[1,2,10,5,3,7]print(list(map(lambda x:x+1,num_l)))打印结果;[2, 3, 11, 6, 4, 8]4.高阶函数--reduce()直接返回一个具体的值reduce() 函数会对参数序列中元素进行累积。需求:对一个数组进行累积*正常实现(reduce实现原理)
num_l=[2,2,3,10]
def reduce_test(func,array,init=None):
    if init is None:
        res=array.pop(0)
    else:
        res=init
    for num in array:
        res=func(res,num)
    return res
print(reduce_test(lambda x,y:x*y,num_l)))
print(reduce_test(lambda x,y:x*y,num_l,10))#指定参数从他的基础上进行
打印结果:120060000**使用reduce函数需要从functols模块中引入
from functools import reduce
num_l=[3,2,2,9]
print(reduce(lambda x,y:x+y,num_l,1))
print(reduce(lambda x,y:x+y,num_l))
运行结果:1716新手可能有很多不足

相关推荐