一.什么是函数
- 函数可重用的代码块,在java中又称为
方法
- 函数分为内置函数,即Python自带的如数,比如 input() 、print()、range()、len() 函数等等,这些都是 Python 的内置函数,可以直接使用。
- 也可以自己创建函数,即将一段有规律的、可重复使用的代码定义成函数,从而达到一次编写、多次调用的目的。这被叫做
用户自定义函数
。
- 也可以自己创建函数,即将一段有规律的、可重复使用的代码定义成函数,从而达到一次编写、多次调用的目的。这被叫做
二.如何定义函数
在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,
- 以
def
关键词开头,后接函名称和圆括号 () ,括号中的参数和 冒号:
。 - 函数的返回值用
return语句
返回。,没有return默认返回 None。def 函数名(参数列表): 函数体
实例:比较两个数,并返回较大的数:
def max(a, b):
if a > b:
return a
else:
return b
a = 4
b = 5
print(max(a, b))
三.函数调用
- 正常调用
# 定义函数
def printme( str ):
# 打印任何传入的字符串
print (str)
return
# 调用函数
printme("我要调用用户自定义函数!")
printme("再次调用同一函数")
参数类型
- 在 python 中,
变量是没有类型的
- 必需参数
- 关键字参数
- 默认参数
- 不定长参数
必需参数
- 须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
- 调用 printme() 函数,你必须传入一个参数,不然会出现语法错误:
#可写函数说明
def printme( str ):
"打印任何传入的字符串"
print (str)
return
# 调用 printme 函数,不加参数会报错
printme()
报错
Traceback (most recent call last):
File "test.py", line 10, in <module>
printme()
TypeError: printme() missing 1 required positional argument: 'str'
关键字参数
- 使用关键字参数允许函数调用时参数的
顺序与声明
时不一致,因为 Python 解释器能够用参数名匹配参数值。
def printinfo( name, age ):
"打印任何传入的字符串"
print ("名字: ", name)
print ("年龄: ", age)
return
#调用printinfo函数
printinfo( age=50, name="runoob" )
默认参数
调用函数时,如果没有传递参数,则会使用默认参数
。以下实例中如果没有传入 age 参数,则使用默认值:
#可写函数说明
def printinfo( name, age = 35 ):
"打印任何传入的字符串"
print ("名字: ", name)
print ("年龄: ", age)
return
#调用printinfo函数
printinfo( age=50, name="runoob" )
print ("------------------------")
printinfo( name="runoob" )
不定长参数
需要能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。
-
基本语法如下:
def functionname([formal_args,] *var_args_tuple ): "函数_文档字符串" function_suite return [expression]
-
加了
星号 * 的参数会以元组(tuple)
的形式导入,存放所有未命名的变量参数。 -
结果:
输出: 70 (60, 50)
如果在函数调用时没有指定参数,它就是一个空元组
。我们也可以不向函数传递未命名的变量
。
-
实例:
# 可写函数说明 def printinfo( arg1, *vartuple ): "打印任何传入的参数" print ("输出: ") print (arg1) for var in vartuple: print (var) return # 调用printinfo 函数 printinfo( 10 ) printinfo( 70, 60, 50 )
-
结果
输出: 10 输出: 70 60 50
还有一种就是参数带两个星号 **
基本语法如下:
-
加了两个星号 ** 的参数会以
字典dict
的形式导入。def functionname([formal_args,] **var_args_dict ): "函数_文档字符串" function_suite return [expression]
-
实例
# 可写函数说明 def printinfo( arg1, **vardict ): "打印任何传入的参数" print ("输出: ") print (arg1) print (vardict) # 调用printinfo 函数 printinfo(1, a=2,b=3)
-
结果
输出: 1 {'a': 2, 'b': 3}
声明函数时,参数中星号 * 可以单独出现,例如:
def f(a,b,*,c):
return a+b+c
如果单独出现星号 *
,则星号 *
后的参数必须用关键字
传入:
>>> def f(a,b,*,c):
... return a+b+c
...
>>> f(1,2,3) # 报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() takes 2 positional arguments but 3 were given
>>> f(1,2,c=3) # 正常
6
>>>
四.匿名函数
Python 使用 lambda
来创建匿名函数。
- 所谓匿名,意即不再使用
def 语句
这样标准的形式定义一个函数。 - lambda 函数拥有自己的命名空间,且
不能访问自己参数列表之外或全局命名空间里的参数
。
语法 lambda 函数的语法只包含一个语句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
实例:设置参数 a 加上 10:
x = lambda a : a + 10
print(x(5))
实例 匿名函数设置两个参数
# 可写函数说明
sum = lambda arg1, arg2: arg1 + arg2
# 调用sum函数
print ("相加后的值为 : ", sum( 10, 20 ))
print ("相加后的值为 : ", sum( 20, 20 ))
可以将匿名函数封装在一个函数内,这样可以使用同样的代码来创建多个匿名函数。
-
实例:将匿名函数封装在
myfunc 函数
中,通过传入不同的参数来创建不同的匿名函数:def myfunc(n): return lambda a : a * n mydoubler = myfunc(2) mytripler = myfunc(3) print(mydoubler(11)) print(mytripler(11))