数据类型转换
- int()、str()、bool()、hex()
定义函数
- 使用
def
语句,依次写出函数名、括号、括号中的参数和冒号:
,在缩进块中编写函数体,返回值用return
。 - 无
return
,函数执行完毕后返回None
。return None
可以简写为return
。
- 函数定义保存为
.py
文件,from 文件名 import 函数名
来导入函数。
空函数
- 定义空函数,用
pass
作为占位符。 - 缺少
pass
,代码运行有语法错误。
参数检查
- 定义函数,需对参数类型做检查,用内置函数
isinstance()
实现。
# 自定义函数,需要参数检查
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
返回多个值
- 返回值是一个tuple,返回一个tuple可以省略括号。
- 多个变量可同时接收一个tuple,按位置赋给对应的值
函数的参数
- 参数的名字和位置确定,函数的接口定义完成。
位置参数
- 调用函数时,传入的两个值按照位置顺序依次赋给参数。
默认参数
- 可简化函数的调用。
- 必选参数在前,默认参数在后。
- 多参数时,变化大的放前面,小的放后面可作为默认参数。
- 可按顺序提供默认参数。
- 不按顺序提供部分默认参数时,需把参数名写上。
- 默认参数必须指向不变对象。
可变参数
- 传入0个或任意个参数,在函数调用时自动组装为一个tuple。
# 作为list/tuple传进来
def calc(numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
# 调用
calc([1, 2, 3])
calc((1, 3, 5, 7))
# 利用可变参数
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
# 简化调用,在函数内部接收到的是一个tuple
calc(1, 2, 3)
calc(1, 3, 5, 7)
- 在list或tuple前面加一个
*
号,把元素变成可变参数传入。
关键字参数
- 传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
- dict前面加
**
号,所有key-value用关键字参数传入到函数的**kw
参数。 - 函数内部通过
kw
检查传入的参数
# 关键字参数
def person(name, age, **kw):
if 'city' in kw:
# 有city参数
pass
if 'job' in kw:
# 有job参数
pass
print('name:', name, 'age:', age, 'other:', kw)
命名关键字参数
- 限制关键字参数的名字
- 必须传入参数名
# 只接收city和job作为关键字参数,需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
def person(name, age, *, city, job):
print(name, age, city, job)
# 已经有了一个可变参数,后面的命名关键字参数不再需要一个特殊分隔符*
def person(name, age, *args, city, job):
print(name, age, args, city, job)
# 调用
person('Jack', 24, city='Beijing', job='Engineer')
# 可以有缺省值,简化调用
def person(name, age, *, city='Beijing', job):
print(name, age, city, job)
person('Jack', 24, job='Engineer')
参数组合
- 定义顺序:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
递归函数
- 函数在内部调用自身。
- 函数调用通过栈(stack)实现,递归调用的次数过多,会导致栈溢出。
- 通过尾递归优化解决递归调用栈溢出。在函数返回的时候,调用自身,且return语句不能包含表达式。
# 汉诺塔递归算法
# -*- coding: utf-8 -*-
def move(n, a, b, c):
if n == 1:
print(a, '-->', c)
move(n-1,a,c,b)
print(a, '-->', c)
move(n-1,b,a,c)