0
点赞
收藏
分享

微信扫一扫

Python总结,定义函数(3)


目录

  • ​​定义一个函数​​
  • ​​自定义错误输出​​
  • ​​默认输出​​
  • ​​不定长参数​​
  • ​​一个*代表元组​​
  • ​​两个*代表字典​​
  • ​​单独写`*`代表`*`后的参数必须用关键字传入​​
  • ​​不可变类型在函数中值不会被改变​​

在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回,请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。return None可以简写为return。

定义一个函数

你可以定义一个由自己想要功能的函数,以下是简单的规则:

函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。

任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。

函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。

函数内容以冒号 : 起始,并且缩进。

return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。

Python总结,定义函数(3)_后端

自定义错误输出

我们自己定义的函数错误与内置函数输出错误不一样

比如下面定义一个​​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类型')

默认输出

必选参数在前,默认参数在后,当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

当不给​​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

如果单独出现星号 * 后的参数必须用关键字传入。

>>> 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)


举报

相关推荐

0 条评论