感谢廖雪峰老师提供了自学python很好的平台,以下内容仅作个人学习记录使用,侵删。
附上链接: 廖雪峰的官方网站.
函数的调用
Python中提供了很多内置的函数,我们知道函数的名称和参数之后可以直接调用。如果不了解使用方法,也可以通过help()
函数来查看该函数的帮助信息。
函数的定义
定义函数
函数定义的语法如下:
def FunctionName (paras):
Body of Function
例如,定义一个求从a到b的整数和的函数:
def FindTheSum(sta,end):
sum = 0
for i in range(sta,end+1):
sum += i
print('The sum is',sum)
return sum
空函数
定义一个空函数,可以使用pass
语句,pass
语句表示什么都不做,可以作为一个占位符。
- 空函数:
def nop():
pass
- 条件判断中:
if age >= 18:
pass
参数检查
我们在定义函数的时候,并没有像其他语言一样指定参数的类型,但是在调用时候往往会出现参数类型不匹配的情况,这就需要我们在函数内部手动对传入参数的类型做检查,比如下面的例子只允许整数和浮点型类型的参数传入:
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x>=0:
return x
else:
return -x
这样定义之后,如果传入了错误的参数类型,函数就会抛出一个错误:
返回多个值
当使用Python函数返回多个值的时候,实际上是返回了一个tuple,然后按照位置赋值给对应的值。
def move(x, y, step, angle):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
x, y = move(100, 100, 60, 0)
函数的参数
参数传入
再调用函数时,函数的参数列表中的值按照所在位置顺序依次赋值给对应的参数。
默认参数
在函数定义时,为其中的某些参数设置默认值,这样如果没有对其赋值的话,则会自动取其默认值:
def move(x, y, step=0, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
x, y = move(100, 100, 60, 0)
x1, y1 = move(100,100)
注意:
- 必选参数要在前面,默认参数再后面。
- 关于默认参数的设置,可以把变化大的参数放在前面,变化小的参数放在后面,这样就可以为那些变化不大的参数设定默认值。
- 这样做可以有效地降低调用函数的难度。
- 在调用的时候也可以不按照顺序提供其中一部分默认函数:
def test(a, b, c=0, d=0):
pass
test(1,2)
test(1,2,3,4)
test(1,2,d=4)
- 默认参数必须指向一个不变的对象。
对于下面的函数,默认参数是一个空的list,在函数定义的时候,默认参数l的值就已经被计算出来了,是个一个[]
,因此默认参数是指向这个变量[]
的一个对象。
如果调用的时候传入了参数,则会在传入的list后面添加一个字符a,与默认参数的对象无关;
如果调用的时候使用了默认参数,则第一次调用的时候就会将l原本指向的空list,运行完这个函数之后,会在这个默认参数的后面加上一个字符a,也就是说此时默认参数的内容已经被改变了。下一次再使用默认参数进行调用的时候,这个参数就仿佛具有记忆性了一样,会在上次运行的基础上加上一个a,因此会得到我们不想要的结果。
因此必须要让默认参数指向不变的一个对象。将上面的例子修改成:
可变参数
如果我们传入的参数的数量未定,少的话可以设置几个默认参数,但是多的话用默认参数就不是很方便。因此我们可以将输入的参数改为是一个tuple或者是list这种形式,但是这就要求在传入参数的时候将输入数据提前转换成目标的形式。
def CalcSum(numbers):
if not isinstance(numbers,(list,tuple)):
return 0
sum = 0
for n in numbers:
sum += n
return sum
CalcSum([1,7,3,8])
CalcSum([1,6,8,4])
CalcSum(2)