目录
- 定义一个函数
在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
>>>