一、函数的基本操作
① 使用方法:必须先定义再调用(和其他语言用法基本一样哈)
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)