欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python中函数的参数,返回值,变量,和递归等知识讲解

程序员文章站 2022-05-02 23:04:19
函数中的参数的初级和返回值: 技术文档中[]方括号里面的东西表示可选的 参数:函数运行需要的数据 如果没有参数会提示:missing 1 required positional, 函数的两个要点,参...

函数中的参数的初级和返回值:

技术文档中[]方括号里面的东西表示可选的

参数:函数运行需要的数据 如果没有参数会提示: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()