从零开始学Python-Day15-定义函数

Python零基础 木人张 3年前 (2020-03-20) 850次浏览 0个评论 扫描二维码
文章目录[隐藏]

def

定义一个函数,要使用def语句,依次写出函数名、括号、括号中写参数、括号、冒号,然后,在缩进块中编写函数体,也就是计算过程,函数的返回值用return语句返回。
我们可以自己定义一个取绝对值的函数my_abs

>>> def my_abs(x):
	if x>=0:
		return x
	else:
		return -x

>>> my_abs(-2)
2

在函数体的内部,一旦符合条件执行了return,整个函数体运行就结束了。也就是之前说过的条件判断,一旦符合条件就执行对应的语句结束。如果没有return语句,函数体执行结束也要返回结果,结果为None;retuen None可以直接写为retuen,如下两个函数定义,如果传入参数为0时,我们让它返回None,运行的结果都是None

# -*- coding: UTF-8 -*-
# Filename : newf.py
# author by : www.woodmanzhang.com
# 新的函数
def my_function(x):
	if x>0:
		return x
	if x<0: return -x print(my_function(0)) def my_function2(x): if x>0:
		return x
	if x<0:
		return -x
	else:
		return
print(my_function2(0))

我们在存放了newf.py文件的目录下启动python3交互模式,就可以直接调用这个函数my_function:

>>> from newf import my_function
None
None
>>> my_function(100)
100
>>> my_function2(100)
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'my_function2' is not defined
>>> from newf import my_function2
>>> my_function2(100)
100

注意,只有在当前环境调用了的函数才能使用,你可以将自己定义的函数存放在一个文件中,供自己使用调用。调用的方式为 from 文件名 import 函数名

空函数

空函数即为什么都不做,用pass语句完成,跟打牌的pass一个意思,这段我还没想好咋写,先pass,让程序可以运行起来,如果没有pass就会有语法错误,还是上面的例子,我只要非零证书,零我不要,负数我还没想好,修改如下:

def my_function3(x):
	if x>0:
		return x
	if x<0:
		pass
	else:
		return

参数检查

调用函数时,如果参数个数不对,Python解释器会自动检查出来,并给出TypeError
如果参数类型不对,自定义函数和内置函数就有区别了,我们的自定义函数是在执行过程中报错,说明了不能在数值和字符串之间进行’>=’的运算;而内置函数直接告诉我们不可以使用字符串:

>>> my_abs(1,2)
Traceback (most recent call last):
  File "<pyshell#40>", line 1, in 
    my_abs(1,2)
TypeError: my_abs() takes 1 positional argument but 2 were given
>>> my_abs('A')
Traceback (most recent call last):
  File "<pyshell#42>", line 1, in 
    my_abs('A')
  File "<pyshell#39>", line 2, in my_abs
    if x>=0:
TypeError: '>=' not supported between instances of 'str' and 'int'
>>> abs('A')
Traceback (most recent call last):
  File "<pyshell#44>", line 1, in 
    abs('A')
TypeError: bad operand type for abs(): 'str'

我们修改一下my_abs的定义,增加一个参数类型检查,这里只允许整数和浮点数参数传入,参数检查用内置函数isinstance(),报错信息就会直接显示出来:

>>> def my_abs(x):
	if not isinstance(x,(int,float)):
		raise TypeError('bad operand type')
	if x>=0:
		return x
	else:
		return -x

>>> my_abs('A')
Traceback (most recent call last):
  File "<pyshell#56>", line 1, in 
    my_abs('A')
  File "<pyshell#55>", line 3, in my_abs
    raise TypeError('bad operand type')
TypeError: bad operand type

这里其实就是在函数的定义的函数体前面增加了最初的条件判断,为我们进行参数类型检查。

用tuple返回多个值

一个函数如何返回多个值?我们都知道一元二次方程有两个根,那该如何求解呢?

一元二次方程的求根公式为:

计算平方根可以调用math.sqrt()函数

import math
def f2(a,b,c):
	if not (isinstance(a, (int,float)) and isinstance(b, (int,float)) and isinstance(c, (int,float))):
		raise TypeError('bad operand type')
	y=b**2-4*a*c
	if a==0:
		if b==0:
			print('无解')
		if b!=0:
			x1=-c/b
			print('x=',x1)
	else:
		if y==0:
			x1=-b/(2*a)
			print('x=',x1)
		if  y<0:
			print('无解')
		else:
			x1=(-b+math.sqrt(y))/(2*a)
			x2=(-b-math.sqrt(y))/(2*a)
			print('x1=',x1,'\n''x2=',x2)

import导入math函数包,我们定义move为运动后x,y轴数据计算的函数。
原来返回值是一个tuple!但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。


木人张,版权所有丨如未注明 , 均为原创,禁止转载。
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址