#!/usr/bin/env python
#--- coding: utf-8 ---
"""
定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。
对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,
函数内部的复杂逻辑被封装起来,调用者无需了解。
Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、
可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
"""
#python function experiment.
#eg.
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
"""
设置默认参数时,有几点要注意:
一是必选参数在前,默认参数在后,否则Python的解释器会报错(思考一下为什么默认参数不能放在必选参数前面);
二是如何设置默认参数。
当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
使用默认参数有什么好处?最大的好处是能降低调用函数的难度。
"""
def enroll(name, gender, age=6, city='Beijing'):
print 'name:', name
print 'gender:', gender
print 'age:', age
print 'city:', city
enroll('Bob', 'M', 7)
enroll('Adam', 'M', city='Tianjin')
"""
定义默认参数要牢记一点:默认参数必须指向不变对象
"""
#可变参数 variable parameter
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
"""
定义可变参数和定义list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部
,参数numbers接收到的是一个tuple,因此,函数代码完全不变。
但是,调用该函数时,可以传入任意个参数,包括0个参数
"""
#关键字参数
def person(name, age, **kw):
print 'name:', name, 'age:', age, 'other:', kw
"""
函数person除了必选参数name和age外,还接受关键字参数kw。在调用该函数时,
可以只传入必选参数:
"""
person('Michael', 30)
#也可以传入任意个数的关键字参数:
person('Adam', 45, gender='M', job='Engineer')
person('Bob', 35, city='Beijing')
#参数组合
"""
在Python中定义函数,可以用必选参数、默认参数、可变参数和关键字参数,这4种参数都可以一起
使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:
必选参数、默认参数、可变参数和关键字参数。
"""
"""
Python3Syntax:
命名关键字参数
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。
至于到底传入了哪些,就需要在函数内部通过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)
但是调用者仍可以传入不受限制的关键字参数:
>>> person('Jack', 24, city='Beijing', addr='Chaoyang', zipcode=123456)
如果要限制关键字参数的名字,就可以用命名关键字参数,例如,
只接收city和job作为关键字参数。这种方式定义的函数如下:
def person(name, age, *, city, job):
print(name, age, city, job)
>>> person('Jack', 24, city='Beijing', job='Engineer')
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错.
"""