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语句,函数执行完毕后也会返回结果,只是结果为None。return 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))
记录学习笔记,有其他参考,如有侵权,联系删除
本文来自博客园,作者:rissa,转载请注明原文链接:https://www.cnblogs.com/rissa/p/14892815.html

浙公网安备 33010602011771号