标签:11 10 return 函数 形参 参数 2021 print 实参
上一篇文章我们简单地介绍了python的流程控制,包括循环结构和分支结构,接下来,我们将继续学习Python函数。
我们都知道正方形的面积公式为:
s=a*a
那么,在计算不同正方形的面积时,会出现:
S1=1*1
S2=2*2
S3=3*3
......
由此,可以看出,在计算不同正方形的面积时,只需要输入不同的边长,就可以计算该正方形的面积,当有很多正方形需要计算面积时,每一个都需要执行S=a*a,是不是有更简单的方法来计算不同正方形的面积呢?
在python中,可以用函数来实现这一过程。函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。相同的代码段可以封装在函数中,需要执行相同的逻辑时,只需要调用函数即可。
函数定义
在python中,如何去定义函数呢?通常函数的定义有以下规则。
命名规则
1、函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
2、任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
3、函数的第一行语句可以选择性地使用文档字符串,用于存放函数说明。
4、函数内容以冒号 : 起始,并且缩进。
5、return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
python中用关键字 def 定义函数,其语法格式为:
def 函数名(参数列表):
函数体
函数名:即标识符,函数名最好能够体现出该函数的功能
参数列表:设置该函数可以接收多少个参数,多个参数之间用逗号( , )分隔。
[return [返回值] ]:用于设置该函数的返回值。一个函数,可以有返回值,也可以没有返回值,是否需要根据实际情况而定。
比如说我们定义一个函数判断两个数的大小,
def max(a,b):
if a>b:
return a
else:
return bgetMax=max(3,4)
print ( getMax )
在上述代码中,函数max的结构为:
比较3,4 的大小,运行结果为:
函数参数
函数中的参数包括形式参数和实际参数两种,函数参数的作用是传递数据给函数,令其对接收的数据做具体的操作处理。
1. 什么是形参
对于函数来说,形式参数简称形参,是指在定义函数时,定义的一个变量名。形参的作用:是用来接收调用函数时输入的值。
下面的代码中,x、y、z 就是形参。
#定义函数
def foo(x, y, z):
print("x=", x)
print("y=", y)
print("z=", z)
2. 什么是实参
对于函数来说,实际参数简称实参,是指在调用函数时传入的实际的数据。函数调用时,实参传递给形参,函数调用结束时,实参将不再存在于程序中。
#调用函数
foo(1,4,7) #此处的1,4,7是实参
上面我们明白了形参和实参后,在调用函数时,实参是怎么样将值传递给形参的呢 ?
在python中,根据实际参数的类型不同,函数参数的传递方式可分为 2 种,分别为值传递和引用(地址)传递:
值传递:适用于实参类型为不可变类型(字符串、数字、元组);
引用(地址)传递:适用于实参类型为可变类型(列表,字典);
值传递和引用传递之间的不同在于,函数进行值传递后,如果形参的值发生了变化,不影响实参的值;函数在引用传递之后,形参和实参的值都会发生变化。如下代码所示:
# 定义函数
def demo(obj) :
obj += obj
print("形参值为:",obj)
# 比较值传递时实参和形参的变化
print("-------值传递-----")
a = "我是一个字符串"
print("a的值为:",a)
demo(a)
print("实参值为:",a)
# 比较引用传递时形参和实参的变化
print("-----引用传递-----")
a = [1,2,3]
print("a的值为:",a)
demo(a)
print("实参值为:",a)
上述代码中,在值传递和引用传递时,形参和实参发生相应的变化,如代码运行结果所示:
从运行结果不难看出,在执行值传递时,改变形式参数的值,实际参数并不会发生改变;而在进行引用传递时,改变形式参数的值,实际参数也会发生同样的改变。
在调用函数时,会根据不同的参数类型使用不同的参数类型,常见的参数类型有:位置参数,关键字参数,默认参数,可变参数,
位置参数 调用函数时传入实际参数的数量和位置都必须和定义函数时保持一致。即形参和实参类型和数量完全一致。
关键字参数 指调用函数时,将形参名当做键名,将实参当做键值,以键名=键值的语法形式来进行调用。 用形式参数的名字来确定输入的参数值。形参和实参不要求完全一致。
默认参数 定义函数时,形参自定义默认参数,调用函数时,如果没有传递参数,则会使用默认参数。默认参数顺序必须从右向左。
可变参数 参数较多时,加入 * 实参以元组形式导入,加 ** 实参以字典形式导入
#位置参数的使用
"""
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
调用函数时,传入实际参数的位置类型,数目必须和形式参数位置一一对应,
"""
def area(upper_base,lower_bottom,height):
return (upper_base+lower_bottom)*height/2
print("正确结果为:",area(4,3,5))
print("错误结果为:",area(4,5,3))
# 关键字参数的使用
"""
关键字参数是指使用形式参数的名字来确定输入的参数值。通过此方式指定函数实参时,
不再需要与形参的位置完全一致,只要将参数名写正确即可。
"""
def printinfo ( name , age ) :
"打印任何传入的字符串"
print ( "名字: " , name )
print ( "年龄: " , age )
return
# 调用printinfo函数
printinfo ( age = 50 , name = "LYP" )
#默认参数
"""
为参数设置默认值以后,如果不传递对应的实参,那么会使用默认值进行代替。
"""
# 定义一个简单的函数,参数之后
def just_return ( x , y = 2 , z = 3 ) :
""" 参数y的默认值为2, 参数z的默认值为3 """
return x + y + z
# 下面的函数调用是合法的,没有传递对应的位置实参时,将使用参数的默认值
result = just_return ( 1)
print ( result )
# 下面的函数调用是合法的,没有传递对应的位置实参时,将使用参数的默认值
result = just_return (1,3)
print ( result )
#可变参数表示
"""
函数的可变参数,“可变”是指参数的数目是变化的,不确定的。
在Python中定义函数时,给形参加上一个"*"或"**"的修饰符,那么该形参就是一个可变形参。
用*将实参收集为元组
使用**将实参收集为字典
可变形参的收集顺序为,从可变形参的位置处开始,从左往右进行收集
"""
# 定义accumulate函数来实现累加
def accumulate ( number,*trouble,** dic) :
print ( number )
print ( trouble )
print ( dic )
return
#在下面参数中,234收集到number中,2,34,5,66,7,9900,89收集到元组中,
#a=2,b=4,f=4收集到字典中。
accumulate(234,2,34,5,66,7,9900,89,a=2,b=4,f=4)
运行结果为:
匿名函数
在python中,我们用lambda来创建匿名函数,所谓匿名函数,就是不用def来创建函数,匿名函数的语法规则如下。
匿名函数命名规则
1、lambda 函数体比 def 简单很多。
2、lambda的主体是一个表达式,在lambda表达式中封装有限的逻辑进去。
3、lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
用匿名函数实现加减乘除,结果如下,
#匿名函
sum =lambda x,y:x+y
sub =lambda x,y:x-y
mul =lambda x,y:x*y
div =lambda x,y:x/y
mod =lambda x,y:x%y
print("输入两个数之和",sum(10,20))
print("输入两个数之差",sub(10,20))
print("输入两个数之积",mul(10,20)
)print("输入两个数之商",div(10,20))
运行结果如下。
递归函数
python的函数可以调用其他函数,如果一个函数在内部调用自身函数,这样的函数称之为递归函数,递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
如何用递归实现阶乘的计算呢?
def fact(n):
if n==1:
return 1
return n*fact(n-1)
print("5的阶乘为:",fact(5))
print("10的阶乘为:",fact(10))
print("6的阶乘为:",fact(6))
用递归分别计算5,10,6的阶乘,运行结果如下。
标签:11,10,return,函数,形参,参数,2021,print,实参 来源: https://blog.csdn.net/weixin_41792162/article/details/120712503
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。