1. 函数名其实是指向函数对象的应用,可以将这个引用赋给其他变量
  1. >>> a = abs
  2. >>> a(-1)
  3. 1

image.png

  1. 函数执行完毕也没有return语句时,自动return Nonereturn None可以简写成return

  2. 方法可以有多个返回值

  1. import math
  2. def move(x, y, step, angle=0):
  3. nx = x + step * math.cos(angle)
  4. ny = y - step * math.sin(angle)
  5. return nx, ny
  6. >>> x, y = move(100, 100, 60, math.pi / 6)
  7. >>> print(x, y)
  8. 151.96152422706632 70.0

实际上,返回值仍为一个:元组

函数的参数

位置参数

函数根据形参的位置进行传参

默认参数

  • 注意:传参时,必填参数在前,默认参数在后,否则解释器会报错 ```python def power(x, n=2): # n为默认参数 pass

power(1, n=3) power(n=3, 1) SyntaxError: positional argument follows keyword argument ```

  • 默认参数设计原则:把变化大的参数放前面,变化小的可以设置为默认参数放后面。
  • 要牢记:默认参数必须指向不变对象

为什么要设计str、None这样的不变对象呢?因为不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误。此外,由于对象不变,多任务环境下同时读取对象不需要加锁,同时读一点问题都没有。我们在编写程序时,如果可以设计一个不变对象,那就尽量设计成不变对象。

可变参数

传入函数的参数个数可变

其实就是传入了一个tuple

  1. def calc(*numbers):
  2. sum = 0
  3. for n in numbers:
  4. sum = sum + n * n
  5. return sum

若要将list或者tuple中的元素作为可变参数传入,可以在list或者tuple前加上一个*号,以此把元素作为可变参数传入:

  1. >>> nums = [1, 2, 3]
  2. >>> calc(nums) # 这样子的话,相当于将两个列表相乘
  3. Traceback (most recent call last):
  4. File "<pyshell#8>", line 1, in <module>
  5. calc([1,2,3])
  6. File "<pyshell#6>", line 4, in calc
  7. sum = sum + n * n
  8. TypeError: can't multiply sequence by non-int of type 'list'
  9. >>> calc(*nums)
  10. 14

关键字参数

允许调用者传入任意个含参数名的参数

其实就是传入一个dict

  1. def person(name, age, **kw): # kw为关键字参数
  2. print('name:', name, 'age:', age, 'other:', kw)
  3. >>> person('Michael', 30)
  4. name: Michael age: 30 other: {}
  5. >>> person('Adam', 45, gender='M', job='Engineer')
  6. name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
  7. # 也可以直接传入一个字典,不过得注意要在对应参数前加上**
  8. >>> extra = {'city': 'Beijing', 'job': 'Engineer'}
  9. >>> person('Jack', 24, **extra)
  10. name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

参数组合

在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数。参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数