函数的作用域、匿名函数和函数式编程

一、作用域

LEGB原则

 

L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内建作用域

 

python按照LEGB原则搜索变量,即优先级L>E>G>B

1.

def test1():
    print("in the test1")
def test():
    print("in the test")
    return test1      #返回函数名

test()
res = test()
print(res())
#也可以使用test()()

 输出结果:

in the test  #输出1
in the test   #输出2
in the test1   #输出3
None            #输出4

分析:

输出1即为test()函数print打印出来的结果

输出2res为test函数的返回值test1【函数名】

输出3为打印test1函数的print的内容

输出4是由于test1函数没有return返回值,即输出None

2.

 1 name = "alex"
 2 def foo():
 3     name = "xiaoshagua"
 4     def bar():
 5         name = "hxq"
 6         def tt():
 7             print(name)
 8         return tt
 9     return bar
10 
11 a = foo()
12 print(a)
13 b = a()
14 print(b)
15 b()

输出结果:

1 <function foo.<locals>.bar at 0x00000172973F4EA0>
2 <function foo.<locals>.bar.<locals>.tt at 0x00000172973F4F28>
3 hxq

分析:

第一个输出为bar函数的内存地址,调用foo函数,返回bar的地址再赋值给a

第二个输出为tt函数的内存地址,调用bar函数,返回tt的地址再赋值给b

第三个输出是调用tt函数,打印name的值“hxq”

二、匿名函数

当需要使用一些简单的函数时,不需要显式地定义函数,直接传入匿名函数更方便。

python中有lambda关键字表示匿名函数

lambda x:x + 1

 

lambda为关键字,代表这是一个匿名函数,冒号前的x是形参,冒号后的表达式是匿名函数的返回值 ,类似于定义函数的return

例如:

func = lambda x:x + 1
print(func(10))

 

结果:

11

由此可见lambda匿名函数和定义式函数功能是一样的,不过匿名函数较为简洁

匿名函数一般与函数连用

 三、函数式编程

形参传入的是函数,或者返回值为函数。只要输入是确定的,那么输出也是确定的。

函数式内部不用变量

 

 1 #函数作为参数
 2 def test1(name):
 3     print("my name is %s"%name)
 4 
 5 def test2(s):
 6     print(s)
 7 
 8 test2(test1("Mary"))
 9 
10 #函数作为返回值
11 def test3():
12     print("test3")
13     return test4()
14 
15 def test4():
16     print("test4")
17 
18 test3()

 

 

 

 结果:

1 my name is Mary
2 None
3 test3
4 test4

 

这两种函数称为高阶函数

尾调用:在函数的最后一步调用另一个函数

最后一步不一定是最后一行

例如:

 1 def test1():
 2     print("hello")
 3 
 4 def test2():
 5     print("world")
 6 
 7 def test3(x):
 8     if type(x) is str:
 9         return test1()
10     else:
11         return test2()
12     

 

一定要是最后一步:有的函数的返回值可能是两步,一定要注意

1 def test1():
2    return "hello, world!"
3 
4 def test2(x):
5     return test1() + x
6 
7 #这个并不是在最后一步调用了另一个函数,它其实是两步,一步运行test1,一步拼接x

map函数

map() 会根据提供的函数对指定序列做映射。

 

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

 

1 s = [1, 5, 7, 9, 2, 10]
2 def square(x):
3     return x**2
4 
5 print(list(map(square, s)))

 

结果:

1 [1, 25, 49, 81, 4, 100]

 

filter函数

 

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

 

该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

 

date = [1, 2, 3, 4, 5, 6, 7, 8, 9]

def de(s):
    return s % 2 == 1

print(list(filter(de, date)))

 

结果:

[1, 3, 5, 7, 9]

 

reduce函数

reduce() 函数会对参数序列中元素进行累积。

函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

1 num = [1, 2, 3, 4, 5]
2 
3 def add(x, y):
4     return x + y
5 
6 print(reduce(add, num))

 

结果:

1 15

 

posted @ 2018-07-20 15:23  超级宇宙无敌乖宝宝  阅读(307)  评论(0编辑  收藏  举报