数据类型转换

  • int()、str()、bool()、hex()

定义函数

  • 使用def语句,依次写出函数名、括号、括号中的参数和冒号:,在缩进块中编写函数体,返回值用return
  • return,函数执行完毕后返回Nonereturn 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)
  • listtuple前面加一个*号,把元素变成可变参数传入。

关键字参数

  • 传入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)