这次主要是整理一下函数以及函数的各种类型的参数(这次的重点在于函数参数)
一、函数的例子:
#!/usr/bin/env python
# -*- coding=utf-8 -*-
# 函数定义 使用def语句 后边跟着函数名称 以及函数所需参数
def my_abs(x):
if not isinstance(x, (int, float)):
raise TyprError('bad operand type')
if x >= 0:
# 当函数执行到return之后不会再去往下执行,如果没有return的函数默认返回none
return x
else:
return -x
“”“
上述定义了一个求绝对值的函数
”“”
二、函数参数:(函数参数包含【必须参数】【默认参数】【可变参数】【关键字参数】)
2.1 必选参数
#!/usr/bin/env python2.7
# -*- coding=utf-8 -*-
def power(x):
return x*x
"""
我们定义了一个求x平方的函数,其中这里的x就是我们的必传递的参数
那我们这里假设不传递这个参数会发生什么呢?我们来调用看下
"""
print(power())
# >>> TypeError: power() takes exactly 1 argument (0 given) 这里的意思是power函数需要一个参数,你给了0个
2.2 默认参数
#!/usr/bin/env python2.7
# -*- coding=utf-8 -*-
根据上边必选参数举出来的例子,我们这个时候想要计算x的3次方怎么办?4次方?5次方?
def power(x):
return x*x*x
我们不能这样做吧,如果这样做,每次都需要定一个新的函数,这样就违背了我们使用函数的初衷,那我们可以给对应的函数多传递一个参数作为需要计算的次方数
def power(x, n):
return x**n
print(power(3))
# 使用之前调用的方式 >>> TypeError: power() takes exactly 2 arguments (1 given) 需要两个参数但是给了一个
这个时候我们就可以直接引出我们的默认参数来了
def power(x, n = 2):
return x ** n
print(power(2)) # >> 4
print(power(2,3)) # >> 8
# [注意1:必选参数和非必选参数(默认参数)位置不能颠倒]
def power(n=2,x):
return x**n
print(power(3))
这个地方就是错误的,因为这个时候会造成歧义,这里的3到底是给默认参数的还是给必选参数的,python会直接给这个代码报错 non-default argument follows default argument
#[注意2: 默认参数不能是可变对象,因为多次调用之后结果会与你想象的不一样]
def add_end(L=[]):
L.append('END')
return L
add_end() # ['END']
add_end() # ['END','END']
Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。所以,定义默认参数要牢记一点:默认参数必须指向不变对象!
默认参数如果是可变对象的话,这个时候不传递参数,一直指向的是初始化定义的那个地址,
参考:https://www.cnblogs.com/python960410445/p/11979585.html
2.3 可变参数
可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
我们以数学题为例子,给定一组数字a,b,c……,请计算a2 + b2 + c2 + ……。
def calc(numbers):
sum = 0
for i in numbers:
sum += i
return sum
这个时候可以这样调用:
calc([1,2,3,4]) or calc((1,2,3,4))
如果我们将calc的参数写成可变参数的样式
def calc(*number):
pass
这个时候我们可以这样调用:
calc(1,2,3,4,5) 就不用外加中括号或者圆括号了
当然假设提前给好的list我们也可以这样调用
nums = [1, 2, 3]
calc(*nums)
2.4 关键字参数
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
def person(name, age, **kw):
print 'name:', name, 'age:', age, 'other:', kw
person('Michael', 30)
# >>> name: Michael age: 30 other: {}
person('Bob', 35, city='Beijing')
# >>> name: Bob age: 35 other: {'city': 'Beijing'}
person('Adam', 45, gender='M', job='Engineer')
# >>> name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
2.5 组合使用
def func(a, b, c=0, *args, **kw):
print 'a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw
参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数。
对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。
本节内容主要参考:廖雪峰-python