一。 函数

从开始接触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   这句话的意思是把计算结果返回到函数调用的地方。这样我们就可以用个计算结果去做别的事了。

小结:

  • 函数名:其实就是一个符合 Python 语法的标识符,但不建议读者使用 a、b、c 这类简单的标识符作为函数名,函数名最好能够体现出该函数的功能。
  • 形参列表:即上面括号里的函数列表,设置该函数可以接收多少个参数,多个参数之间用逗号( , )分隔。
  • [return [返回值] ]:整体作为函数的可选参参数,用于设置该函数的返回值。也就是说,一个函数,可以用返回值,也可以没有返回值,是否需要根据实际情况而定

三。函数的调用

到目前为止对函数的调用已经比较熟悉。 即 函数名(形参值),函数名即指的是要调用的函数的名称;形参值指的是当初创建函数时要求传入的各个形参的值,需要注意的是,创建函数有多少个形参,那么调用时就需要传入多少个值,且顺序必须和创建函数时一致。即便该函数没有参数,函数名后的小括号也不能省略。

四。pass语句

如果想定义一个什么事也不做的空函数,可以用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)

七。参数检查

  • 函数调用时如果参数的个数不对。python的解释器会自动检查出来
"""
功能:求指定序列的和
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 <module>
    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 <module>
    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。

可以定义空函数

04-23 23:05