从开始接触python就接触了函数。 例如 input()函数用于获取用户键盘输入、print()函数用于输出结果、range()函数用于生成整数序列、len()函数用于获取序列的长度。不仅如此python还为我们提供了自定义函数。即将有规律,可重复使用的代码封装成函数,从而达到一次编写多次调用的结果。由此可见我们可以简单的认为函数是可以实现特定功能的代码块。
假如我们要求0-100之间的和应该怎么将其写成函数呢?
def sun():
a = 0
for i in list(range(101)):
a += i
print(a)
sun()
--------------------
5050
上述代码我们定义了一个函数实现0-100的求和。 而且得到了准确的结果。 首先用def关键字用来定义一个函数。后面跟一个函数名。 函数名顾名思义就是函数的名字。 这个名字是我们自定义的同样遵循命名规范。函数名后面的"()"表示参数列表。 具体会在下一个列子中讲到。 括号后面的是函数体即我们的求和功能。 程序的最后一行sun()称之为函数的调用。 定义了函数如果不调用就相当于不执行。简而言之也就无法生成求和的功能。
同时我们思考另一个问题。 不是说函数是可以重复利用的嘛。 很明显上述函数只能完成0-100的求和。 假如说要完成1-1000,或者0-300之间的求和,难道要继续写嘛。显然不是。
def sun(mag):
a = 0
for i in list(range(mag)):
a += i
print(a)
sun(1002)
sun(301)
501501
-----------------
45150
通过上述代码我们发现我们在示例1 的基础上在参数列表假如mag,这个成为参数。 关于参数后面还会具体讲到。 一个参数可以有多个参数。 参数与参数之间用逗号隔开。 与此同时我们吧range里原先的100换成了我们的参数。 此时不难发现我们在调用函数的时候分别在括号里填上了1001和301。 这样就实现了我们提出的求0-1000和0-300求个的功能。
那么我们有提出新的疑问。假如说我们不仅要实现求和。 然后还要将求出来的和参与别的运算。此时我们又应该怎么做呢?
def sun(mag):
a = 0
for i in list(range(mag)):
a += i
return a
b = sun(1002)
print(b)
c = b - 10000
print(c)
501501
------------------
491501
我们在示例2 的基础上又添加了return a 这句话的意思是把计算结果返回到函数调用的地方。这样我们就可以用个计算结果去做别的事了。
小结:
到目前为止对函数的调用已经比较熟悉。 即 函数名(形参值),函数名即指的是要调用的函数的名称;形参值指的是当初创建函数时要求传入的各个形参的值,需要注意的是,创建函数有多少个形参,那么调用时就需要传入多少个值,且顺序必须和创建函数时一致。即便该函数没有参数,函数名后的小括号也不能省略。
如果想定义一个什么事也不做的空函数,可以用pass
语句.pass
语句什么都不做,那有什么用?实际上pass
可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass
,让代码能运行起来。
def sun():
pass
函数不仅仅是给自己用的。 在一个团队中很可能其他人也要用到。 这时如果他不知道函数的功能就没法准确的调用。或者时隔很久要做维护和修改或者新员工要接手项目。 如果没写注释不仅效率低。而且有可能回成为吐槽的对象。 因此添加说明文档必不可少。例如
"""
功能:求指定序列的和
mag 要生成的序列的最大值
"""
def sun(mag):
a = 0
# 通过循环求和并返回结果
for i in list(range(mag)):
a += i
return a
b = sun(1002)
print(b)
"""
功能:求指定序列的和
mag 要生成的序列的最大值
"""
def sun(mag):
a = 0
# 通过循环求和并返回结果
for i in list(range(mag)):
a += i
return a
b = sun()
print(b)
Traceback (most recent call last):
File "/Users/apple/Documents/重要文件/python3/python20.py", line 12, in
b = sun()
TypeError: sun() missing 1 required positional argument: 'mag'
def my_list(number):
print(list(range(number)))
my_list("10")
Traceback (most recent call last):
File "/Users/apple/Documents/重要文件/python3/python20.py", line 5, in
my_list("10")
File "/Users/apple/Documents/重要文件/python3/python20.py", line 3, in my_list
print(list(range(number)))
TypeError: 'str' object cannot be interpreted as an integer
显然我们要生成0-9的列表。而我们偏偏传入了字符串这时就会报错。此时内置函数isinstance()就派上用场了
def my_list(number):
if isinstance(number, int):
print(list(range(number)))
else:
print("只接受整型的数值")
my_list("10")
my_list(10)
只接受整型的数值
---------------
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
那么可不可以一个参数满足两个或者以上类型呢?当然可以
def my_list(number):
if isinstance(number, (int, float, str)):
print("我满足了条件")
else:
print("我不满足条件")
my_list("10")
my_list(10)
my_list((1, 2))
我满足了条件
我满足了条件
我不满足条件
def my_list():
return 10, 20, [1, 3]
a = my_list()
print(a)
(10, 20, [1, 3])
由上述例子可知函数是可以一次性返回多个值的。但是这个返回值是tuple
定义函数时,需要确定函数名和参数个数;
如果有必要,可以先对参数的数据类型做检查;
函数体内部可以用return
随时返回函数结果;
函数执行完毕也没有return
语句时,自动return None
。
函数可以同时返回多个值,但其实就是一个tuple。
可以定义空函数