有基础学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解释器没有对尾递归做优化,故尾递归也会导致栈溢出。

猜你喜欢

转载自blog.csdn.net/qq_33067925/article/details/120424650
今日推荐