有基础学Python > 0x2 函数

学习“廖雪峰的官方网站:Python教程”时做的笔记

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# 所有函数都有返回值,默认返回None。
# 返回多个值是假象,其实是一个tuple,省略了括号。
# from 文件名 import 函数名

# 没有参数检查的函数定义是不完善的。
# x是位置参数。
def my_abs(x):
    if not isinstance(x, (int, float)):
        raise TypeError('bad operand type')
    pass

print(my_abs('1'))

# 只有与默认参数不符的调用才需要提供差异信息。
def enroll(name, gender, age=6, city='beijing'):
    pass

enroll('Sarah', 'F')
enroll('Bob', 'M', 7)   # 男多女少时甚至可以默认gender='M'进一步简化调用
enroll('Adam', 'M', city='Tianjin')

# 默认参数必须指向不变对象,不可指向list。
# 可改为L=None这个不变对象来实现。
def add_end(L=[]):
    L.append('END')
    return L

add_end()
add_end()

# 可变参数可以简化调用,不用先组装出list或tuple。
# def calc(numbers):
#     pass
def calc(*numbers):
    pass

calc(1, 2)   # 1,2 自动组装为 tuple(1,2)
nums = [1, 2]
calc(*nums)

# 关键字参数
# 允许传入0个或多个含参数名的参数,它们自动组装为dict。
def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)

person('Adam', 45, gender='M', job='Engineer')
extra = {'gender': 'M', 'job': 'Engineer'}  # 不会被person内部修改影响到
person('Adam', 45, **extra)

# 命名关键字参数能限制关键字参数的名字,调用时必须传入参数名(有默认值除外)。
# 没有可变参数时,必须加一个'*'作为分割符。
def prsn(name, age, *, city='Beijing', job):
    pass

# 参数组合
# 参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数、关键字参数。
# 在参数调用时,Python解释器自动按照参数位置和参数名把对应的参数传进去。
def f1(a, b, c=0, *args, d, **kw):
    print(a, b, c, args, d, kw)

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

# 尾递归把每一步的结果传入到下一步,不用像递归一样反向再来一遍。
# Python解释器没有对尾递归做优化,故尾递归也会导致栈溢出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值