Python学习之函数

语法

def 函数名(参数列表):
    函数体

参数检查

调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛出TypeError。

为了保证函数的严谨,我们可以对参数进行检查。

如:对参数类型做检查,只允许整数和浮点数类型的参数。数据类型检查可以用内置函数isinstance()实现。

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


print(my_test('a'))

函数的参数

  • 必需参数

  必需参数要以正确的顺序传入函数。调用时的数量必须和声明时的一样。如:

def printInfo(str):
    print(str)

  调用函数的时候必须传入参数,不然会出错。

  • 默认参数

  调用函数时,如果没有传入参数,则使用的是默认参数。

def power_cal(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s


print("2的2次方:%s" % power_cal(2))  # 第二个参数使用的是默认参数
print("2的3次方:%s" % power_cal(2, 3))


def person(name, age, score=98, city="北京"):
    print("name=%s;age=%s;score=%s;city=%s" % (name, age, score, city))


person("小黑", 18)    # score,city使用默认参数
person("小红", 19, 90)    # city使用默认参数
person("小明", 20, city="上海")     # score使用默认参数

  使用默认参数,需要注意几点:

  1. 必选参数在前,默认参数在后。

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

  3. 默认参数必须指向不变对象。

  4.有多个默认参数时,可以按照顺序提供默认参数,也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上。

  • 可变参数

  可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。

  参数为*param是可变参数,在函数内部,参数param接收到的是一个tuple,Python允许在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去。

# 给定一组数字a,b,c……,请计算a2 + b2 + c2 + ……
def calc_1(*numbers):
    print(numbers)  # 是一个元组
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum


print(calc_1(1, 2, 3, 4, 5))

# list作为可变参数传入函数
list1 = [2, 3, 4, 5]
print(calc_1(*list1))

  • 关键字参数

  函数调用使用关键字来确定传入的参数值,在使用关键字参数调用时,可以任意调换参数传参的位置。

def person(name, age, sex):
    print("name=%s;age=%s;sex=%s" % (name, age, sex))


person("小花", 20, "")   # 位置参数(必需参数)
person(age=22, sex="", name="小米")

  参数为**param是关键字参数,在函数内部,参数param接收到的是一个dict。允许再dict前面加**,再通过**parma方式传入。

def student(name, age, **other):
    print(name, age, other)


student("小白", 23, city="深圳", score=100)
dict1 = {"city": "北京", "score": 99, "sex": ""}
student("小明", 22, **dict1)

  • 命名关键字参数

  限制关键字参数的名字,就可以用命名关键字参数。

  命名关键字参数需要一个特殊分隔符**后面的参数被视为命名关键字参数。

def student2(name, age, *, city, score):
    print("name:", name, "age:", age, "city:", city, "score:", score)


student2("小白", 23, city="深圳", score=100)

  如果调用函数是关键字名字不存在,就会会报TypeError错误。如:

student2("小花", 23, cy="深圳", se=100) 

  如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*

def student3(name, age, *args, city, score):
    print(name, age, args, city, score)


student3("小白", 23, 1, 2, 3, 4, city="北京", score=99)

  如果命名关键字参数有默认值,可以不用再传入该参数值。

def student4(name, age, *, city="北京", score):
    print("name:", name, "age:", age, "city:", city, "score:", score)


student4("小白", 23, score="98")

return语句

函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。

如果没有return语句,函数执行完毕后也会返回结果,只是结果为Nonereturn None可以简写为return。

可以返回多个值,Python的函数返回多值其实就是返回一个tuple。

# 请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程 ax^2+bx+c=0 的两个解。
def quadratic(a, b, c):
    t1 = -b
    t2 = math.sqrt(b * b - 4 * a * c)
    t3 = 2 * a
    x1 = (t1 + t2) / t3
    x2 = (t1 - t2) / t3
    return x1, x2


print(quadratic(2, 3, 1))    # (-0.5, -1.0)

空函数

如果想定义一个什么事也不做的空函数,可以用pass语句:

def demo1():
    pass

pass可以作为一个占位符,也可以用在其他语句块中,如:

if age>=18:
    pass

缺少了pass,代码运行就会有语法错误。

递归函数

 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

# 我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示
def fact(n):
    if n == 1:
        return 1
    return n*fact(n-1)

print("10的阶乘:",fact(10))
posted @ 2021-08-03 15:10  rissa  阅读(39)  评论(0)    收藏  举报

记录学习笔记,会有很多是参考重复,如有侵权,联系删除