函数式编程和内置函数:python学习之路第7天

Posted Linux云计算与Python干货及行情

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数式编程和内置函数:python学习之路第7天相关的知识,希望对你有一定的参考价值。

函数式编程和内置函数

 

一、上节回顾

 

全局函数和局部变量

 

name = ‘alex’

def change_name():

    global name  ---调用全局变量

    name = ‘hujianwei’  --修改全局变量

    print(name)   --打印出:hujianwei

 

    def foo():    ---定义一个内置函数

        name = ‘wu’  -----局部变量

        print(name)  ---打印出:name

 

    foo()

 

change_name()

 

---------------------------------------------------

 

name = ‘alex’

def change_name():

    #global name  ---调用全局变量

    #name = ‘hujianwei’  --修改全局变量

    #print(name)   --打印出:hujianwei

 

    name = ‘aaaa’

    def foo():    ---定义一个内置函数

        #name = ‘wu’  -----局部变量

        nonlocal name  ---调用上一级变量

        name = ‘bbbb’  ---把上一级变量aaaa修改成bbbb

        print(name)      ---打印出:bbbb

    print(name)      -----打印aaaa

    foo()

 

change_name()


------------------------------------------------ 

 

二、作用域

 

name = ‘alex’

def foo():

    name = ‘hehe’

    def bar():

        print(name)

    bar()

foo()

 

或者:

name = ‘alex’

def foo():

    name = ‘hehe’

    def bar():

        print(name)

    return bar

foo()

 

-----------------------------------------------------

 

name = ‘alex’

def foo():

    name = ‘hehe’

    def bar():

        name = ‘wuhaifa’

        def tt()

            print(name)

        return tt

    return bar

 

bar = foo()

 

r1 = foo()

r2 = r1()      ---r2 = r1() = foo()()

r3 = r2()


----------------------------------------------------- 

 

三、匿名函数

 

lambda x:x+1 ,lambda关键字

 

-------------------------

def calc(x):

return x+1

                        ------上面两句相当于:lambda x:x+1

res = calc(10)       -----lambda被称为匿名函数

print(res)

 

输出结果:10

--------------------------------------------------

匿名函数:

func = lambda x:x+1

print(func(10))

 

输出结果:11

 

f = lambda x,y,z:x+y-z+5

print(f(1,2,3))

 

输出结果:5

------------------------------------------------- 

 

四、函数式编程

 

(一)介绍


编程方法论:

面向过程(华山派)

面向函数式(武当派)

面向对象(峨嵋派)

 

 

面向过程:

找到解决问题的入口,按照固定的流程去模拟解决问题的流程

 

1.搜索目标--用户输入(配偶要求),按要求到数据结构(字典)内检索合适的人物

2.表白,表白成功进入3,否则进入1

3.恋爱,恋爱成功进入4,否则返回1

4.见家长,家长同意进入5,否则返回1

5.结婚

 

 

函数式:

函数式=编程语言定义的函数+数学意义的函数

 

数学函数:y=2*x+1

函数式:def calc(x):

              return 2*x+1

 

 

(二)函数式编程尾递归调用优化


例1:不可改变:不可用变量保持状态,不修改变量

 

#非函数式

a = 1

def inre_test1():

    global a

    a+=1

    return a

inre_test1()

print(a)

----------------------------------------------------

#函数式

n = 1

def inre_test2():

return n+1

 

print inre_test2(2)

print n


---------------------------------------------------- 

 

高阶函数↓,函数即变量

例2:把函数当作参数传给另外一个函数

(函数接收的参数是一个函数名)


def foo(n):

    print(n)

 

def bar(name):

    print(‘my name is %s’ %name)

 

foo(bar(‘alex’))

#相当于把bar赋值给foo函数变量n。bar函数的值为alex

---------------------------------------------------


尾递归、尾调用:在函数的最后一步调用

 

def bar():

    return n

def foo(x):

    bar()

--------------------------------------------------


五、map函数

 

def map_test(func,array):   --#func=lambda x:x+1 arrary=                      [12,3,4,5,6,8,10]

    ret=[]

    for i in arrary:

        res = func(i)

        ret.append(res)

rerurn ret

 

print(map_test(lambda x:x_1,num_l))

print(‘内置函数map,处理结果:’,map_test(lambda x:x_1,num_l))


----------------------------------------------------


map使用:简单的例子

 

msg = ‘abcdefghijk’

re = map(lambda x:x.upper(),msg)

            -----把msg参数传给lambda函数的x,然后转换成大写

list (re)  ----把re结果转换成列表

print(re)


----------------------------------------------------


@@ filter函数  :帅选列表值,遍历序列中的每个元素,判断每个元素得到布尔值,如果事True,则留下来

 

people = [

    {‘name’:’wangxs’,’age’:1000},

    {‘name’:’lixs’,’age’:3000},

    {‘name’:’zhangxs’,’age’:30},

    {‘name’:’maxs’,’age’:12},

]

 

#把年纪大于100的过滤到;

 

print(list(filter(lambda p:p[‘age’]<=100,people)))

 

----------------------------------------------------


@@ reduce函数

 

python2直接用,python3集合到一个模块中

 

#from functools onport reduce

 

num_l = [1,2,3,4,5,6]

def reduce_test(arrary):

    res = 0

    for num in arrary:

        res = num

    return res

 

print(reduce_test(num_l))

 

--------------------------------------------------

 

六、内置函数

 

#abs,取绝对值函数

#all,计算布尔值,空值,0,none记为False

print(all[1,2,3,0,’fre’,’the’, ,none])

 

#any,只要有一个为真,则是真

#bin

#bool

#chr,字节类型

#dir

#divmod(10,3)  ---代表有多少台记录,3表示放多少记录

#dic

#hash(),哈希,可哈希的数据类型,结果为布尔值空。

 

 

总结:

map():处理序列中每个元素,得到的结果是一个列表,该列表元素的位置和个数与原来对应

filter():遍历序列中的每个元素,判断每个元素得到布尔值,如果是True则留下来,得到的结果是一个列表。

reduce():处理一个序列,然后把序列进行合并操作

from functools import reduce

print(reduce(lamdba x,y:x+y,range(100),100))

print(reduce(lamdba x,y:x+y,range(1,100)))



以上是关于函数式编程和内置函数:python学习之路第7天的主要内容,如果未能解决你的问题,请参考以下文章

Python学习之路:函数式编程介绍&高阶函数

python之路第五天

python学习之路 五:函数式编程

python之路-Day4

王亟亟的Python学习之路-函数式编程,map(),reduce(),filter()

python3的学习之路九函数式编程