python中函数的参数,返回值,变量,和递归等知识讲解
函数中的参数的初级和返回值:
技术文档中[]方括号里面的东西表示可选的
参数:函数运行需要的数据 如果没有参数会提示:missing 1 required positional,
函数的两个要点,参数和返回值:
1.如果函数有参数在调用执行函数的时候要把参数写里面,如;
def show_info(name): #括号里面的参数是形参:形参可以写多参
print(“用户为:%s”%name)
show_info("李易峰"): #括号里面是实参:如果形参有多个传递实参时也必须要写多个数据,多写
少些都不对
2.如果参数有返回值,需要用返回值时要定义一个变量接收返回值,如果不接收的话返回值不会打印出来,如:
def check():
print("表演人:")
name="songanhua "
return name
a=check() #变量a用于接收函数的返回值
print("检查到的人是%s"%a)
执行到return时函数就自动结束
************************************************************************************
函数的参数由基础到进阶:
基础:
args:arguments 参数
kwargs:keyward arguments 关键字参数
形参中前面加*是指可变参数类型,实参中前面加*是解包参数
函数的参数一共有7种类型分别是:位置参数,关键字参数,默认值参数(p1,p2,oper="+"),强制关键字参数(*,p1,p2),
可变的:可变参数(*args),可变关键字参数(**kwargs),万能参数(*args,**kwargs)
1.位置参数 ,按照形参的顺序依次对照赋值
# def test1(p1,p2,p3,p4):
# print(p1,p2,p3,p4)
#
# test1(10,20,30,40)
# #2.关键字参数,提高了代码的可读性,现在开发大多用这种方法
# def test2(p1,p2,p3,p4):
# print(p1,p2,p3,p4)
#
# test2(p1=10,p2=20,p3=30,p4=40)
#3.默认值参数,默认参数值一般放在最后,放在普通参数值的后边
# def test3(n1,n2,opera="+"):
# print("该运算n1[%s]opera[%s]n2[%s]"%(n1,opera,n2))
# test3(1,2)
# test3(1,2,"/")
#4.强制关键字参数 *星号后边的参数必须强制使用关键字参数,没有限制得可以用位置参数,
# 如果*号在最前面,则所有的参数都限制必须要用关键字参数
def test4(p1,*,p2,p3,p4):
print(p1,p2,p3,p4)
test4(10,p2=20,p3=30,p4=40)
进阶:
参数又可分为:可变参数,可变关键字参数,万能参数
在形参前面如果加一个*是指可变参数,
在形参前面加两个*指的是可变的关键字参数
在实参列表前面加一个*是指解包列表,在实参字典前加两个*是指解包字典
#1.可变参数:在普通形参前面加一个*则变成可变参数,可以接收0-n个参数,以元组的形式展示出来
# def test(*args):
# print(args)
#
# test("enen")
# test(1,2,3,4)
# test("武军超","是的","嗯呢",1)
#2.可变关键字参数::就是在普通形数前面加上**该形参就变成了可变的关键字参数,
# 可以接收多个k=v数据,并自动将数据以字典的形式展示出来
# def test1(**kwargs):
# print(kwargs, kwargs.get("name"))
#
# test1(name="tom")
# test1(name="jerry",age=18)
# test1(name="wujunchao",age=18,gender="男")
#3.万能形参数:在满足规范的前提下可以接收任何参数,下列的普通参数和关键字参数顺序不能反
def test2(*args,**kwargs):
print(args,kwargs)
test2()
test2("wu")
test2(name="jerry")
test2("wujunchao",name="tom")
test2(1,2,3,"shide",name="jerry",age=18)
解包:
如果参数提供的数据是列表,元组,集合,字典这些组合数据类型,则无法直接上传,这时需要解包
实参列表名字前面添加一个*表示将列表,元组,集合解包拆分成一个一个独立的数据传递
实参字典名字前添加两个*便是将字典解包,以k-v的形式上传
*和**在形参前面表示可变参数,放在实参前面表示解包
#解包:意思是组合数据类型的拆分
def test(p1, p2):
print(p1, p2)
#正常调用
test(10, 20)
#非正常调用,列表需要解包,解包成一个一个数据上传
num = [10, 20]
test(*num) # test(*nums) -> test(10, 20)
#非正常调用,字典解包
num2 = {"p1": 10, "p2": 20}
test(**num2) # test(**nums2)-> test(p1=100, p2=200)
****************************************************************************************
函数中的变量:
variable 变量
函数中的变量分全局变量和局部变量,函数外的为全局变量,函数内的为局部变量
在函数中如果需要修改全局变量的值,需要先用global+name声明一下全局变量放在定义的函数顶部,
然后name=""重新赋值,实例如下:
name="jerry" #在函数外部定义的全局变量
def test():
global name
global msg
print("函数内部查询全局变量未修改前的:",name)
age=18
print("局部变量",age)
name="tom" #修改原来全局变量的值
msg="留言"
test()
print("修改后的全局变量:",name) #tom
print("新定义的全局变量:",msg) #留言
函数自己调用自己就是函数的递归,函数递归比循环消耗内存
在函数中尽量定义局部变量
开发一个项目一般把项目分成三个部分,分别是:
data.py(存放数据的文件)
tools.py(存放函数的文件)
main.py(存放函数执行的文件)
***************************************************************************************
函数的互相调用和递归:
定义一个函数表示 一个行为
#在一个函数中可以调用另一个函数,叫做函数的相互调用
#在函数也可以调用自己叫做函数的递归
#第一种:两个行为是相互独立的
# def movie():
# print("看电影")
#
# def snack():
# print("吃零食")
#两个函数单独执行
# movie()
# snack()
#第二种:在函数中调用另一个函数,为什么snack函数定义在后边但是在前面直接引用了并没有报错?
# 是因为定义函数并没有执行函数,而是把函数中的代码先存在内存中,当movie函数被调用的时候,
#snack函数已经在内存中了
# def movie():
# print("看电影")
# snack()
#admiad
# def snack():
# print("吃零食")
#
# movie()
#函数的递归就是函数中调用执行自己,简单的函数递归实例:
def login():
username=input("请输入登陆账号:")
if username=="admin":
print("登陆成功")
return username
login() #可以直接写login(),也可以写一个else再写login()
login()