Python----函数详解(下篇)
**_上篇文章我们讲了Python中的内置函数,今天我们来讲一下Python中的自定义函数。
顾名思义,所谓自定义函数就是我们为了解决某一具体问题,由程序员自己编写的函数,为了准确地定义函数解决问题,提高程序的运行效率,我们需要准确把握以下几点:
自定义函数的格式:
① 函数代码块以**def**关键字开头**后面接函数名称** 和**圆括号**
②任何传入参数和自变量必须在圆括号内
③在函数内部的第一行语句可使用**文档字符串对函数的功能加以说明**
④函数体从冒号开始,遵守缩进规则
举栗:
#自定义一个问好函数
def say_hello():
print("hello, welcome to our school!")
'''
函数定义格式:
def 函数名(参数列表) :
函数体
'''
自定义函数的调用:
定义好函数后,只需调用就可以用来解决问题
#定义一个求解圆的面积的函数
def Circle_area(radiu):
area = 3.14*radiu**2
print("半径为%s的圆的面积为:%f"%(str(radiu), area ))
return area
Circle_area(2)#函数的调用
'''
运行效果:
半径为2的圆的面积为:12.5600
'''
函数的参数传递
再说参数传递之前,我们先来讲一下Python中的可变对象与不可变对象
注意:在python中,只有对象才有类型,变量没有类型,它仅仅是对象的一个引用(指针)
实例说明:
x = (1, 2, 3,4)
x = 99
'''
(1, 2, 3, 4)是元组类型
99数数值类型(int)
x是变量,它没有类型,它仅仅是对象的一个引用(指针),可以指向某一类型的对象,就好比是一个标签,当x = 99时,就是将x这个标签拴在了99上了,通过这个x,就顺延看到了99,于是在交互模式中,>>> x输出的结果就是99,给人的感觉似乎是x就是99,事实是x这个标签贴在数值99上面。同样的道理,当x = (1,2,3,4)时,标签就换位置了,贴到元组上面。
所以,作用等同于标签的变量x没有类型之说,它不仅可以贴在整数类型的对象上,还能贴在其它类型的对象上,
故在python中,只有对象才有类型,变量没有类型
'''
不可变对象:
python中的不可变对象有,字符串(string)、元组(tuple)、数值类型(number)。
可变对象:
python中可变对象有列表(list)、字典(dict)等等。
不可变对象与可变对象在函数参数传递过程中的区别:
在python的函数参数传递过程中,【不可变对象传递】与C语言中的【值传递类似】,(即在函数内部进行的一些操作不会影响对象本身),实际上,在函数内部修改的只是传递的不可变对象的一个副本。
在python函数的参数传递过程中,【可变对象的传递】与C语言中的【引用传递类似】,即将对象本身传递过去,修改后函数外部的该对象的值也会被改变。实际上,在函数内部修改的是传递的可变对象的一个原本。
注意:在python中一切皆是对象,严格来讲不能说是值传递或引用传递,应该说传的是 可变对象或不可变对象
实例演示:
def fun(x, lists):
x+=2
lists.append("change")
return
a = 2
lis= [ ]
fun(a, lis)
print("函数调用后\n不可变对象 a= %d\n可变对象lis = %s" % (a, str(lis)))
'''运行结果
函数调用后
不可变对象 a= 2
可变对象lis = ['change']
进程已结束,退出代码0
'''
函数的参数类型:
调用函数时有4种参数类型
必需位置参数:
必需位置参数要求必须以正确的顺序传入参数,并且调用时的数量必须和声明时的一样。
实例说明:
#定义函数打印指定个数的字符
def fun(str, count):
print(str*count)
return
fun("%",9)#调用函数打印9个%
fun("#")#会报错少了一个必需位置参数
'''
Traceback (most recent call last):
File "C:\Users\yuanfang\Desktop\刷题\刷题2", line 4, in <module>
fun("#")
TypeError: fun() missing 1 required positional argument: 'count'
进程已结束,退出代码1
'''
关键字参数:
关键字参数和函数调用关系密切,函数调用使用关键字参数来确定传入的参数值。需要注意的是,使用关键字参数允许函数调用时参数的顺序与声明时不一致,python解释器会使用参数名与参数值进行匹配
#定义函数打印指定个数的字符
def fun(str, count):
print(str*count)
return
fun(str = "%",count = 9)#使用关键字参数调用函数打印9个%
默认参数:
调用函数时,如果没有传递参数进来,就会使用默认参数。#注意:如果函数的参数列表中既有默认参数又有非默认参数,那么非默认参数必须位于默认参数前
#定义函数打印指定个数的字符
def fun(str , count = 9):
print(str*count)
return
fun(str = '$')#调用函数打印9个%
不定长参数:
有时需要一个函数能处理比当初声明时更多的参数,这些参数就叫做不定长参数。加了星号的变量名会存放所有未命名的变量参数,如果在函数调用时没有指定参数,那他就是一个空元组。
def fun(arg1, *valtuple):
print("必需参数的值: ", arg1)
if len(valtuple)==0:
print("未传入可变长参数")
else:
for val in valtuple:
print("可变参数为:" ,val)
return
fun(88)#第一次调用
print("".ljust(50,"#"))
fun(12,12,23,3,4546,666)#第二次调用
'''
运行结果
必需参数的值: 88
未传入可变长参数
##################################################
必需参数的值: 12
可变参数为: 12
可变参数为: 23
可变参数为: 3
可变参数为: 4546
可变参数为: 666
进程已结束,退出代码0
'''
·
匿名函数、
匿名函数就是不再使用def语句这样的标准形式来定义一个函数。在python中使用lambda来创建匿名函数。
匿名函数具有以下几个特点:
1)lambda的主体是一个表达式,而不是一个代码块。只能在lambda表达式中封装有限的逻辑。
2)lambda函数有自己的命名空间,且不能访问自己的参数列表之外或全局命名空间里的参数。
3)lambda函数的语法只包含一个语句。
举例说明:
mylambda = lambda a1, a2, a3 : a1*a2*a3
print("调用匿名函数,并返回结果:",mylambda(2,3,4))