python 函数基本方法lambda表达式高阶函数

tech2022-08-01  128

一、函数的基本操作

① 使用方法:必须先定义再调用(和其他语言用法基本一样哈)

def add(a,b): return a+b print(add(10,8))

需要注意,函数遇到return就退出当前函数,多个返回值用逗号隔开,返回元祖格式

② 帮助文档

需要在def下面第一行,用三引号框住注释,注释的内容就可以在help(函数)进行显示咯

def add(a,b): '''简单的加法''' return a+b help(add)

输出:

add(a, b) 简单的加法

 

③参数的调用

还是和上面的例子一样,假设有这么个函数

def info(name,age): return f'你的名字是{name},你的年龄是{age}'

如果在调用info函数的时候把年龄放在第一个参数,姓名放在了第二个参数,输出结果肯定就错啦。解决办法呢,就是在传递参数的时候通过“键=值”的方式,就可以随便什么顺序都可以了:

print(info(age=20,name='xueqing'))

 

④ 默认参数

def info(name='yexueqing',age=20): return f'你的名字是{name},你的年龄是{age}'

默认参数也比较简单啦,后面加个默认值即可~调用的时候缺省了话,就会用默认值

⑤ 可变关键字参数

在最后面参数加个 ** 就可以啦

def info(name='yexueqing',age=20,**kwargs): print(f'你的名字是{name},你的年龄是{age}') for i in kwargs: print(f"你还输入了这些参数:{i}\n") info(name='叶雪青',email='123@qq.com')

输出结果:

你的名字是叶雪青,你的年龄是20 你还输入了这些参数:email

 

⑥ 局部变量 全局变量

声明在函数里面的就是局部变量咯,声明在函数外面的就是全局变量。

只需要注意一点就是,全局变量要在函数里面进行修改的话,需要用global重新声明一下,比如:

phone = 10086 def myPhone(): phone = 10010 myPhone() print(phone)

上面的情况想把全局变量的值改为10010,但是实际输出结果还是10086

phone = 10086 def myPhone(): global phone phone = 10010 myPhone() print(phone)

因为在函数里面加了global,所以就可以修改全局变量的值啦,就可以输出10010咯

⑦ 拆包

拆包呢我感觉就是把序列里的值单独拎出来。因为函数有多个返回值的话以元祖类型返回,元祖的拆包如下:

t = (100,250,400) a,b,c = t print(a) print(c)

具体到函数的话,可以像下面这样:

def f(): return 100,200,400 a,b,c = f() print(a) print(c)

其他字典啥的感觉也差不多~

⑧ 递归

还记得VBA用递归来查找整个文件夹内的所有文件:建个函数,设个文件夹的参数,执行遍历某个文件夹的时候呢,如果是文件,就输出,如果是文件夹,把文件夹作为参数传给自己。

大概知道递归的作用呢,这里就做几个python递归的小练习:

计算1+2+…n的和

sum = 0 def f(n): if n==1: return 1 sum = n + f(n-1) return sum print(f(100))

不过最多好像只能递归998次

② 同理计算 1*2*…n也一样

sum = 1 def f(n): if n==1: return 1 sum = n *f(n-1) return sum print(f(10))

因为还没学到python文件夹的相关操作,所以遍历文件夹目前还不会哈,后面再更新

 

二、lambda表达式

什么时候用lambda表达式呢?函数只有一个返回值,且只有一句代码时可以用,格式:

lambda 参数:表达式。参数可以省略~

① 比如这个函数:

def add(a,b): return a+b print (add(15,10))

可以简写成:

print((lambda a,b:a+b)(15,10))

② 所以,没有参数的可以这样写(没发现这样写有啥用):

print((lambda :'hello world')())

③有1个参数可以这样写:

print((lambda name:f'你的名字是{name}')('叶雪青'))

④ 如果有默认值的话,可以这样

print((lambda name='叶雪青',age=20:f'你的名字是{name},年龄是{age}岁')('叶雪青'))

⑤ 如有可变位置参数的话,可以这样:

print((lambda *args:args)(1,2,3,4))

⑥ 可变关键字参数的话,可以这样:

print((lambda **kwargs:kwargs)(name='xueqing',age=20))

需要注意这里的name和age没有用引号框住~

⑦ 带条件语句的lambda(三目运算)

print((lambda a,b:a if a>b else b)(20,18))

输出 20

⑧ 排序

d = [{'name':'apple','num':200},{'name':'xiaomi','num':210},{'name':'huawei','num':230}] d.sort(key = lambda x:x['name']) print (d)

输出:

[{'name': 'apple', 'num': 200}, {'name': 'huawei', 'num': 230}, {'name': 'xiaomi', 'num': 210}]

 

三、高阶函数

也就是以函数作为参数进行传递

①filter 过滤:作用就是过滤序列中不符合条件的元素

结果 = filter(函数名,列表名)

print(list(filter(lambda x:x%2,range(1,20))))

也就是等于

print(list(filter(lambda x:x%2==1,range(1,20))))

输出结果:

[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

怎么理解呢,lambda x:x%2 是一个函数,range(1,20)是列表,filter就把列表中的每个值扔进函数里计算,并过滤掉函数值为不真的值。

比如下面这个,要过滤掉apple的话:

ls = ['apple','huawei','xiaomi'] ls2 = list(filter(lambda x:x!='apple',ls)) print (ls2)

输出结果:

['huawei', 'xiaomi']

 

② map(函数名,可迭代对象)映射:就是将可迭代对象的每个元素作为函数参数进行计算

比如计算所有的平方值:

ls = [1,3,5,7,9] ls2= list(map(lambda x:x*x,ls)) print(ls2)

 

③reduce(函数名(x,y),可迭代对象) 用之前要先导入 functools 模块

函数名必须要有2个参数,每次计算的结果继续和可迭代对象的下一个元素做累积计算

所以根据这个特性,咱们也别递归了,计算1+2…+100的值直接:

import functools as fct sum= fct.reduce(lambda a,b:a+b,range(1,101)) print(sum)

计算1*2*…*10的值

import functools as fct sum= fct.reduce(lambda a,b:a*b,range(1,11)) print(sum)

 

最新回复(0)