python3中有很多比较别致的函数定义方式,让没有见过的同学总是很头痛,这一堆表达式到底是想干什么呀ヽ(#`Д´)ノ,本篇就总结一下python中出现的别致函数定义
定义:创建一个匿名函数对象,不提供函数名
lambda [参数1,,参数2,...]:表达式
让给定的参数执行表达式的操作然后返回操作结果
表达式的调用与函数的调用相同
myadd = lambda a,b:a+b
# 等同于
def myadd (a,b):
return a+b
注意:
lambda只是一个表达式,用来创建一个函数对象,当表达式调用时首先执行冒号后的表达式,然后返回结果
lambda表达式中冒号后只能包含一条表达式
再举一个栗子ヽ(・ω・´メ)
# 判断一个数的2次方+1能否被5整除,如果能被整除返回True,否则返回False
fx = lambda n: [True if (n**2+1)%5==0 else False]#创建lambda表达式
fx(3) #调用表达式
定义:把一个字符串当成一个表达式来执行,并返回表达式执行的结果
eval(source,globals = None,locals = None)
source:一定要是一个表达式
globals和locals确定表达式应用的作用域
其中locals优先于globals
s = '100+200*300'
v = eval(s)
print(v)
# eval中关于作用域的吐血应用
x = 100
y = 200
v = eval('x+y')
print(v)
dict_local = {'x':1,'y':2}
v = eval('x+y',None,dict_local)
print(v)
dict_global = {'x':10,'y':20}
v = eval('x+y',dict_global,dict_local)
print(v)
v = eval('x+y',None,{'y':2})
print(v)
v = eval('x+y',{'x':1})
print(v)
将字符串当成程序来执行,是上面eval的升级版,产生的变量创建在指定的作用域内
exec(source,globals =None,locals =None)
x = 100
y = 200
s = '''
z = x+y
print('z=',z)
print("hi python")
'''
dict_local = {'x':1}
exec(s,None,dict_local)
print(dict_local)
map(func,*iterable)
作用:将iterable内的值作为func的输入参数
,func函数的返回值在map的组织下生成新的可迭代对象
def power(x):
return x**2
L = map(power,range(1,10)) #求1-9自然数的平方
for x in L:
print(x)
filter(func,iterable)
作用:按照func定义的规则对iterable的数据进行筛选,满足条件的保留
注意:一般func的定义的判断标准都是返回True或False
def is_prime(x):
if x< 2:
return False
for i in range(2,x):
if x%i == 0:
return False
return True
for x in filter(is_prime,range(100,150)):
print(x,end = '')
a = sum(filter(is_prime,range(100,150)))
L = filter(is_prime,range(100,150))
for x in L:
print(x,end = ' ')
注意:filter筛选出来的不能直接打印,需要转化成相应的列表或者字典才能打印,但是可以使用内建函数进行计算
sorted(iterable ,key =None,reverse =False)
作用:将可迭代对象按照key的规则排序
names = ['Tom', 'Jerry', 'Spike', 'Tyke']
def get_key(n): #用来绑定每个参数中的每个元素,此函数需要返回一个能比较大小的依据
print("get_key")
return n[::-1]
L = sorted(names,key=get_key)