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

Posted snowony

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数(作用域,匿名函数,函数式编程,高阶函数)相关的知识,希望对你有一定的参考价值。

一.函数作用域                                          
1.函数名表示的是内存地址
1 def test1():
2     print(in the test1)
3 def test():
4     print(in the test)
5     return test1
6 
7 print(test())
打印:
in the test
<function test1 at 0x000001E90E452EA0>

2.函数的作用域只跟函数声明时定义的作用域有关,跟函数的调用位置无任何关系
1 name = xiaopang
2 def foo():
3     name=fangjiyi
4     def bar():
5 
6         print(name)
7     return bar
8 a=foo()
9 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 bar
n=foo()
n()
方式二
def hanle():
print(‘from handle‘)
return hanle
h=hanle()
h()
运行结果:
from handle
from handle
2.高阶函数--filter

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

需求:过滤掉带前缀的字符串
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 ret

print(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.高阶函数--map
map()函数会根据提供的函数对指定序列做映射
需求:对任意数组实现加减乘除等处理
*正常实现(同时也是map函数实现过程)
 1 num_l=[1,2,10,5,3,7]
 2 def map_test(func,array):
 3     ret=[]
 4     for i in array:
 5         res=func(i) #add_one(i)
 6         ret.append(res)
 7     return ret
 8 
 9 print(map_test(lambda x:x+1,num_l))
10 print(map_test(lambda x:x-1,num_l))
11 print(map_test(lambda x:x*2,num_l))
12 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实现原理)
 1 num_l=[2,2,3,10]
 2 def reduce_test(func,array,init=None):
 3     if init is None:
 4         res=array.pop(0)
 5     else:
 6         res=init
 7     for num in array:
 8         res=func(res,num)
 9     return res
10 print(reduce_test(lambda x,y:x*y,num_l)))
11 print(reduce_test(lambda x,y:x*y,num_l,10))#指定参数从他的基础上进行
打印结果:
1200
60000
**使用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))

运行结果:
17
16

新手可能有很多不足

以上是关于函数(作用域,匿名函数,函数式编程,高阶函数)的主要内容,如果未能解决你的问题,请参考以下文章

python学习-day16:函数作用域匿名函数函数式编程mapfilterreduce函数内置函数r

11.高阶函数(匿名/*递归/函数式)对象编程基础

Python基础笔记:函数式编程:高阶函数返回函数匿名函数装饰器偏函数

python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))

Python 函数式编程: 匿名函数高阶函数装饰器

python函数(全局变量,局部变量,作用域,递归函数,高阶函数,匿名函数)