enumerate
函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
>>> list(enumerate(seasons, start=1)) # 下标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
函数定义
def my_abs(x):
if not isinstance(x, (int, float)): # 类型判断
raise TypeError('bad operand type')
if x>=0:
return x
if x<0:
return -x
#空函数
def nop():
pass
若是没有return语句,隐式 return none.
返回多个值
函数可以返回多个值,但实际上返回的是一个 元组。
因为在语法上,返回一个元组可以省略括号,且多个变量可以同时接收一个tuple。
参数
位置参数
在函数调用中,一般用到的都是 位置参数。
默认参数
def power(x, n=2):
s = 1
s = s ** n
return s
当调用power(5)
时,相当于调用 power(5,2)
。但传入两个参数时,则按定义进行计算。
注意:
- 必选参数在前,默认参数在后。
- 变化大的参数在前面,变化小的参数放后面。
- 默认参数必须指向 不可变对象。
可变参数
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
在函数内部,参数numbers接收到的是一个 tuple。
若已经有一个lsit或是tuple,python允许在list 或是 tuple上加一个*
号,把list 或 tuple的元素变成可变参数传进去。例:
>>> nums = [1, 2, 3]
>>> calc(*nums)
关键字参数 & 命名关键字参数
def person(name, age, **kw):
if 'city' in kw:
pass
if 'job' in kw:
pass
print(name, age, kw)
>>>person('xie',12, city = 'qingdao', job = 'engineer')
xie 12 {'city': 'qingdao', 'job': 'engineer'}
kw是含 参数名的参数,函数内部会将其自动组装为dict。
对现有dict的调用
>>>extra = {'city': 'qingdao', 'job': 'engineer'}
person('zhao', 24, **extra)
若使用 命名关键字参数,需要一个 特殊分隔符 *
,其后的参数被视为 命令关键字参数,且此时必须输入命名关键字参数的名字。
def person (name, age, *, city, job):
print(name, age, city, job)
#这种用法时,不会出现dict外面的大括号
>>> person('zhao', 24, city = 'qingdao', job = 'engineer')
zhao 24 qingdao engineer
#命名关键字参数可以有缺省值
def person(name, age, *, city='Beijing', job):
print(name, age, city, job)
>>> person('Jack', 24, job='Engineer')
Jack 24 Beijing Engineer
参数小结
对任意函数,都可以使用类似 func(*args, **kw)
的形式调用它。
args是可变的 positional arguments列表, **kwargs是可变的 keyword arguments列表
*args
是可变参数,args接收的是一个tuple。
**kw
是关键字参数,kw接收的是一个dict。
递归函数
若一个函数在内部调用 自身,它即为 递归函数。
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
在计算机中,函数调用通过栈实现,每进入一个函数调用,栈会多一层,每当函数返回,则会少一层,所以若调用次数过多,会导致栈溢出。