python学习-day16:函数作用域、匿名函数、函数式编程、map、filter、reduce函数、内置函数r

时间:2022-06-21 18:40:03

一、作用域

作用域在定义函数时就已经固定住了,不会随着调用位置的改变而改变

 

 

二、匿名函数

lambda:正常和其他函数进行配合使用。正常无需把匿名函数赋值给一个变量。

f=lambda x:x*x
print(f) #打印指向该函数的内存地址
print(f(5)) #内存地址(5) 调用运行该函数

def cala(x):
y
=x*x
return y
z
=cala(5)
print(z)
>>>
<function <lambda> at 0x10137d950>
25
100
#name=alex  #修改为:name=alex_sb
f=lambda x:x+'_sb'
print(f('alex'))
f=lambda x,y,z=10:x+y+z  #可以存在默认数值
print(f(3,3))
>>>>
16
f=lambda x,y,z=10:(x+1,y+1,z+1)  #如果需要对函数进行返回多个值,需要加括号
print(f(3,3))
>>>
(
4, 4, 11)

 

#这段代码
def calc(n):
return n**n
print(calc(10))

#换成匿名函数
calc = lambda n:n**n
print(calc(10))

 

 

三、函数式编程

 

先过

 

四、常见的函数式编程

4.1、map函数:

 

  通过为了灵活实现多个字符串的多种变化,进行两次函数化的程序设计:

def pf(x):
return x**2

def add_one(x):
return x+1

def reduce_one(x):
return x-1

def num_pin(fanfa,array):
new_num
=[]
for i in array:
new_num.append(fanfa(i))
return new_num
new_num
=num_pin(pf,num_1)
print(new_num)
new_num2
=num_pin(add_one,num_1)
print(new_num2)

[
1, 4, 100, 25, 9, 49]
[
2, 3, 11, 6, 4, 8]
num=[13,46,5,46,5,7]
def pf(x):
return x*x

def jisuan(fuan,array):
new_num
=[]
for i in array:
new_num.append(fuan(i))
return new_num

print(jisuan(pf,num))
f
=lambda x:x*x
print(f)
print(lambda x:x*x)
print(jisuan(f,num))
print(jisuan(lambda x:x*x,num))
>>>>
[
169, 2116, 25, 2116, 25, 49]
<function <lambda> at 0x101b7da60>
<function <lambda> at 0x101b7dae8>
[
169, 2116, 25, 2116, 25, 49]
[
169, 2116, 25, 2116, 25, 49]

 

#终极版本
def map_test(func,array): #func=lambda x:x+1 arrary=[1,2,10,5,3,7]
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))
res
=map(lambda x:x+1,num_l)
print('内置函数map,处理结果',res)
# for i in res:
#
print(i)
print(list(res))
print('传的是有名函数',list(map(reduce_one,num_l)))


msg
='linhaifeng'
print(list(map(lambda x:x.upper(),msg)))

>>>
[
2, 3, 11, 6, 4, 8]
内置函数map,处理结果
<map object at 0x101b862e8>
[
2, 3, 11, 6, 4, 8]
传的是有名函数 [0,
1, 9, 4, 2, 6]
[
'L', 'I', 'N', 'H', 'A', 'I', 'F', 'E', 'N', 'G']

 

总结:

对可迭代对象的每一个元素进行逻辑运算:可以使用匿名函数:lambda或者自定义函数

①、print(list(map(lambda x:x**2,num)))

②、

num
=[13,46,5,46,5,7]
def pf(x):
return x*x
print(list(map(pf,num)))

 

4.2、filter函数
a=list(filter(lambda x: x.endswith('sb'),movie_people))
print(a)
>>>
[
'sb_wupeiqisb', 'linghaifensb']
指定筛选列表、字符串、元祖(movie_peopl)中以sb结尾的元素。如果要不以sb结尾的话:x:not x.endswith('sb')
迭代:movie_people里面的元素,for循环依次遍历一次,执行前面的匿名函数,如果是true的话保留元素,生成一个迭代器 。
指向一个内存地址。如果需要打印出来的话,则需要用list现实出来
4.3 reduce