python 指南(03)函数

调用函数

  • 没说的就是内置函数的调用:abs、max、int、float、hex等函数
  • 注意参数的数量和类型要正确传入即可
  • 函数就是函数对象,函数名就看作是指向对象的变量
生成随机数
  • 使用随机数生成函数首先引入random模块
    在这里插入图片描述

定义函数

  • 如果有必要,可以先对参数的数据类型做检查(isinstance);
  • 函数执行完毕也没有return语句时,自动return None
  • 函数可以同时返回多个值,但其实就是一个tuple,接受的时候使用多个变量按位置进行接收
  • 空函数:函数的逻辑没有想好,直接在函数体里面写一个 pass,本质相当于一个占位符,是文件可以解释执行不报错

函数参数

一、位置参数

  • 有多个参数的时候,调用函数按照参数的位置进行依次赋值

二、默认参数

  • 就是函数定义的时候给参数设置一个默认值,当相应的参数没有传入的时候就使用默认值处理
  • 使用默认参数最大的好处是能降低调用函数的难度

1、使用注意事项

设置的时候
  • 必选参数在前,默认参数在后,否则Python的解释器会报错(思考一下为什么默认参数不能放在必选参数前面);
  • 当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
方法调用时参数赋值
  • 可以按位置进行赋值
  • 当不按顺序提供部分默认参数时,需要把参数名写上
默认参数的坑
  • 定义默认参数要牢记一点:默认参数必须指向不变对象!
  • 假如默认参数的值指定为list可变类型,初始化方法的时候默认参数指向list对象,后面list对象被改变的时候,参数的默认值也会随之发生变化,这显然是不允许的!这里的话可以用None替代list就没问题了

关于不可变对象:

三、可变参数

  • 可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple
  • 可变参的使用
def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
  • 当参数是一个list或tuple的时候,如何作为一个可变参传递
li=[1,2,3]
print(calc(*li))

四、关键字参数

  • 关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
  • 基本使用
def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)

person('Michael', 30)
person('Bob', 35, city='Beijing')
person('Adam', 45, gender='M', job='Engineer')
  • 字典转换为关键字参数
extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, **extra)

五、命名关键字参数

  • 作用就是对关键字参数的传入做一定的限制,参数不可少传也不能多传
  • 基本使用:一定要带参数名
def person(name, age, *, city, job):
    print(name, age, city, job)

person('Jack', 24, city='Beijing', job='Engineer')
  • 如果位置参数和命名关键字参数中间有可变参
def person(name, age, *args, city='chungking', job):
    print(name, age, args, city, job)

六、参数组合

  • 几种参数的组合使用,参数定义的顺序必须是:
    必选参数—默认参数—可变参数—命名关键字参数—关键字参数
  • 虽然可以组合多达5种参数,但不要同时使用太多的组合,否则函数接口的可理解性很差
  • 对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,但是具体的写法还是要参考函数的参数定义的
def f1(a,*,d,**kw):
    print(a,d,kw)


args = (1,)
kw = {'d': 99, 'x': '#'}
f1(*args, **kw)

#output:1 99 {'x': '#'}

递归函数

  • 一个函数在内部调用自身本身,这个函数就是递归函数
  • 递归的次数过多会导致方法栈溢出,很多情况下递归都可以使用循环进行替代
  • 部分语言有尾递归优化,可以解决递归次数过多方法栈溢出的问题,但是python没有
  • 所谓的尾递归就是在函数返回的时候调用自身,且return语句不能包含表达式,这样编译器或解释器做优化,使递归本身无论调用多少次都只占用一个栈帧
def fact(n):
    if n == 1:
        return 1
    return n * fact(n - 1)


def fact_iter(num, product):
    if num == 1:
        return product
    return fact_iter(num - 1, num * product)


print(fact(5))
print(fact_iter(5, 1))
发布了153 篇原创文章 · 获赞 51 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/stanwuc/article/details/103613857
今日推荐