Notes taken while studying " Liao Xuefeng's Official Website: Python Tutorial "
#!/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解释器没有对尾递归做优化,故尾递归也会导致栈溢出。