在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回,请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。return None可以简写为return。
定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号 : 起始,并且缩进。
return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
自定义错误输出
我们自己定义的函数错误与内置函数输出错误不一样
比如下面定义一个my_abs
等于abs
,输出错误看下
自定义求绝对值函数:
def my_abs(x): if x > 0: return x else: return -x print(my_abs('9')) #填入字符串
输出错误:
Traceback (most recent call last): File "C:/Users/Eden/PycharmProjects/pythonProject1/main.py", line 7, in <module> print(my_abs('9')) #填入字符串 File "C:/Users/Eden/PycharmProjects/pythonProject1/main.py", line 3, in my_abs if x > 0: TypeError: '>' not supported between instances of 'str' and 'int'
内置绝对值函数:
print(abs('9'))
输出错误:
Traceback (most recent call last): File "C:/Users/Eden/PycharmProjects/pythonProject1/main.py", line 1, in <module> print(abs('9')) TypeError: bad operand type for abs(): 'str'
如果想自定义错误输出,就可以使用数据类型检查内置函数isinstance()实现:
def my_print(x,y,z): if not isinstance(x,(int,float)): raise TypeError('类型输入错误,请输入int或者float类型') nx = y + z ny = x + z nz = x + y return nx,ny,nz print(my_print('1','2','3'))
输出错误:
Traceback (most recent call last): File "C:/Users/Eden/PycharmProjects/pythonProject1/main.py", line 8, in <module> print(my_abs('1','2','3')) File "C:/Users/Eden/PycharmProjects/pythonProject1/main.py", line 3, in my_abs raise TypeError('类型输入错误,请输入int或者float类型') TypeError: 类型输入错误,请输入int或者float类型
默认输出
必选参数在前,默认参数在后,当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
当不给z
赋值时,默认z
等于3
def my_print(x,y,z=3): if not isinstance(x,(int,float)): raise TypeError('类型输入错误,请输入int或者float类型') print(x,y,z) return x,y,z print(my_print(100,200)) #不给z赋值,输出:100,200,3
不定长参数
一个*代表元组
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,声明时不会命名。基本语法如下:
/
def functionname([formal_args,] *var_args_tuple ): "函数_文档字符串" function_suite return [expression]
加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
实例(Python 3.0+) #!/usr/bin/python3 # 可写函数说明 def printinfo( arg1, *vartuple ): "打印任何传入的参数" print ("输出: ") print (arg1) print (vartuple) # 调用printinfo 函数 printinfo( 70, 60, 50 )
以上实例输出结果:
输出:
70 (60, 50)
如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量。如下实例:
实例(Python 3.0+) #!/usr/bin/python3 # 可写函数说明 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
还有一种就是参数带两个星号 **基本语法如下:
def functionname([formal_args,] **var_args_dict ): "函数_文档字符串" function_suite return [expression]
两个*代表字典
加了两个星号 ** 的参数会以字典的形式导入。
实例(Python 3.0+) #!/usr/bin/python3 # 可写函数说明 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 >>>
不可变类型在函数中值不会被改变
int类型是不可变类型,列表是可变类型,所有下面的例子中n1的值没有被修改
def fun(a,b): a = 3 b.append(10) n1 =1 n2 =[8,9] fun(n1,n2) print(n1,n2)