python基础-函数
一、参数
示例
def fun(a,b=0,*args,**kwargs):
"""
指定收集参数的固定形式,*+指定的位置参数名,惯例*args,自定义*position都行,**+指定的关键字参数名,惯例**kwargs,
需要注意的是,在函数体内调用时不要混淆*的含义,*+数据序列,指展开序列,取其中的值,而想使用传入的位置实参或关键字实参,
则通过调用指定的参数名args或kwargs来实现,args是所有位置参数组成的元组,通过下标调用,kwargs是关键字参数组成的字典,通过键值调用
"""
print(a,b)
print(*args)
print(args[0])
print(*kwargs) #**是不对的,*的用法是展开数据序列,取出所有元素
print(kwargs['name'])
fun(1,2,3,4,name='孙悟空')
参数:
位置参数:在定义函数时,参数的名字和位置已经确定
关键字传参:传入实参时,明确形参的变量名,参数之间的位置不存在先后顺序,函数调用时,通过‘‘键=值’’的形式加以指定,清除了参数的顺序问题
注意:函数调用时,如果位置传参,位置参数要在关键字传参之前
默认参数(缺省参数):参数可以在定义时指定默认值,调用时不传实参就会使用默认值,单默认参数在定义时要放在最后位置
可变参数(收集参数):
位置可变参数args,接收所有位置参数,返回一个元组,元组的变量名就是args,在执行代码中,使用args展开元组,取出其中所有元素,args则是由位置参数组成的元组,可以通过下标调用其中的某个
关键字可变参数**kwargs,接收所有关键字参数,返回一个字典,字典的变量名是kwargs,通过关键字调用,如kwargs['name']
二、变量
局部变量:定义在函数内部的变量,只在函数内部生效
全局变量:定义在函数外部的变量,在函数内部和外部都生效,函数内可直接调用
函数内修改全局变量:对于不可变类型如字符串、数值、元组的修改,需要使用global关键字先声明,之后再修改,这样外面的全局变量也跟着修改了,对于可变类型的列表、字典、集合,不需要该关键字进行声明(声明也不报错),函数内修改后,全局的也会被修改
局部变量与全局变量重名时:函数内定义了和全局变量相同的变量名,函数会默认将改变量视为局部变量,对该变量操作,不影响全局变量
三、返回值
return后面可以是列表、元组、字典形式,其元素为任意类型,也可以直接返回多个数据,用逗号隔开,也可直接写return,无返回值,不写return时,代码执行完毕自动返回
函数执行到return会退出当前函数
四、拆包、解构
元组拆包:a,b=(1,2)
字典拆包:默认取来的是键,k1,k2={'姓名':"lyc","年龄":20} ==》k1=‘姓名’,k2='年龄' ,.items()取来的是元组,.values()取来的是值
五、函数
递归函数:切记一定要设计好出口,即当某个条件满足时,返回,不在递归
lambda函数: 语法 函数名=lambda 形参 :表达式 ==》返回的是一个待执行的函数
形参的写法与普通函数完全一直,只是不用放在()中,当不需要传参时,可以省略
lambda函数能够接收任意数量的参数,但只能返回一个表达式的值
使用时机,当函数有一个返回值,且只有一句代码时,可以用lambda函数简写
高阶函数:就是基于已有的函数,以函数做为参数,定义一个新的函数
内置高阶函数:
1、filter( 函数名, 可迭代对象 ) 作用:过滤序列中不符合条件的元素
示例
将可迭代对象的元素,传入第一个参数指定的函数,如果函数的返回值为非0或者True,则该元素会被保留,如果函数返回值为0或者False,则该元素会被舍弃,
综上,保留使第一个参数指定的函数结果为非0或者True的可迭代对象中的元素,所以第一个函数多维逻辑判断的代码,返回值一般是True或False,
最终得到一个可迭代的filter对象,是原可迭代对象的子集,可用list()转换为列表
列表名 = [1,2,3,4,5,6,7,8,9,10]
def 函数名(x):
return x % 2 == 0
结果 = filter(函数名,列表名)
print(结果) # 打印的是对象地址
print(list(结果))
2、map( 函数名,迭代对象 ) 作用:将可迭代对象的每一个元素作为函数的参数进行运算加工,直到可迭代序列每个元素都加工完毕。
示例
将每一个地带对象的元素,代入第一个参数指定的函数,得到计算后的结果,最终将所有结果组成一个可迭代的map类型对象,得到的map对象
与原迭代对象长度一致,可转换为列表,所以第一函数一般是对元素进行计算、变换等处理的代码,如果函数代码为逻辑判断时,则返回结果是
由True、False组成的可迭代对象
计算列表序列中各数字的2次方
列表名 = [1,2,3,4]
def 函数名(x):
return x ** 2
结果 = map(函数名,列表名)
使用lambda函数:
结果=list( map( lambda x : x ** 2 , 列表名 ) )
print(结果) # 打印出来的是对象的地址
print(list(结果)) # 使用类型转换
3、reduce( 函数名(x,y) , 可迭代对象 ) 作用:函数中必需有2个参数,每次函数计算的结果继续和序列的下一个元素做累积计算。
示例
reduce函数其实是迭代,举例说明,将可迭代对象的第一个和第二个元素代入“函数名(x,y)”,得到第一次的结果result1,之后将result1作为x,将第三个元素作为y
代入函数得到result2,之后将result2当做x,第四个元素当做y,代入函数得到result3,直到所有元素取完得到最终累计的结果result
简单的应用累加和累积
计算 下面列表数据之和
import functools # 导入模块
列表名 = [1,2,3,4]
def 函数名(a,b):
return a + b
结果 = functools.reduce(函数名,列表名)
使用lambda函数:
结果=functools.reduce( lambda x , y : x + y , range( 1,101 ) ) #累加
结果=functools.reduce( lambda x , y : x * y , range( 1,101 ) ) #累积
print(结果)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!