1.创建函数def

def hello(name):
    return 'hello,'+name+'!'

>>>print(hello('Lily'))
hello,Lily!

2.文档化函数:文档字符串
2.1 为函数写文档,在函数开头写下字符串作为函数的一部分进行存储,这被称为文档字符串。
添加文档字符串:

def hello(name):
    'Output a greeting'
    return 'hello,'+name+'!'

2.2 访问文档字符串:__doc__是函数属性(注意左右均为两个小横线)

>>> hello.__doc__
'Output a greeting'

2.3 内建的help函数:在交互式解释器中使用它可以得到关于函数包括他的文档字符串的信息。

>>> help(hello)
Help on function hello in module __main__:

hello(name)
    Output a greeting

3.没有return语句或后边没有返回值的函数:

def test():
    print('this is printed')
    return
    print('this is not')

>>> x=test()
this is printed

>>> print(x)
None

return语句起到结束函数的作用。
所有的函数的确返回了东西:当不需要返回值的时候,返回None。

4.函数实例

#初始化数据结构
def init(data):
    data['first']={}
    data['middle']={}
    data['last']={}

#获取名字
def lookup(data,label,name):
    return data[label].get(name)

#存储名字
def store(data,full_name):
    names = full_name.split()    #切片,拆分full_name,得到names列表
    if len(names) == 2:names.insert(1,'')    #如果长度为2,中间插入空字符作为中间名
    labels = 'first', 'middle','last'
    for label, name in zip(labels,names):    #使用zip函数联合标签和名字
        people = lookup(data,label,name)    #获取属于给定标签和名字的列表
        if people:    #将full_name添加到列表或者插入一个需要的新列表
            people.append(full_name)    #在列表末尾添加新的对象
        else:
            data[label][name] = [full_name]

>>> MyNames={}
>>> init(MyNames)
>>> store(MyNames,'Magnus Lie Hetland')
>>> lookup(MyNames,'middle','Lie')
['Magnus Lie Hetland']

>>> store(MyNames,'Robin Hood')
>>> store(MyNames,'Robin Locksley')
>>> lookup(MyNames,'first','Robin')
['Robin Hood', 'Robin Locksley']
>>> store(MyNames,'Mr. Gumby')
>>> lookup(MyNames,'middle','')
['Robin Hood', 'Robin Locksley', 'Mr. Gumby']

>>> MyNames
{'first': {'Magnus': ['Magnus Lie Hetland'], 'Robin': ['Robin Hood', 'Robin Locksley'], 'Mr.': ['Mr. Gumby']}, 'middle': {'Lie': ['Magnus Lie Hetland'], '': ['Robin Hood', 'Robin Locksley', 'Mr. Gumby']}, 'last': {'Hetland': ['Magnus Lie Hetland'], 'Hood': ['Robin Hood'], 'Locksley': ['Robin Locksley'], 'Gumby': ['Mr. Gumby']}}
>>>

5.关键字参数

def hello_1(greeting, name):    #位置参数
    print('%s,%s!' % (greeting,name))

>>> hello_1('world','hello')
world,hello!

#参数名与值对应(关键字参数)
>>> hello_1(name='world',greeting='hello') 
hello,world!

关键字参数可以在函数中给参数提供默认值:

def hello_2(greeting='hello', name='L'):
    print('%s,%s!' % (greeting,name))


>>> hello_2() 
hello,L!

6.收集参数

def print_params(title,*params):    #*号收集其余的位置参数
    print(title)
    print(params)

def print_p(*item):    #*号将所有值放在同一个元组
    print(item)

def print_pra(**pra):    #**号将所有值放在字典里
    print(pra)

>>> print_p(1,2,3,4,5,6,7,8,9)
(1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> print_params('ite:',1,2,3)
ite:
(1, 2, 3)
>>> print_pra(x=1,y=2,z=3)
{'x': 1, 'y': 2, 'z': 3}

联合使用示例:

def print_para(title,*params,**pra):
    print(title)
    print(params)
    print(pra)

>>> print_para(1,2,3,4,5,6,7,x=1,y=2,z=3)
1
(2, 3, 4, 5, 6, 7)
{'x': 1, 'y': 2, 'z': 3}

7.参数收集逆过程
例子1:元组

def add(x,y):
    return x+y

>>> params=(1,2)
>>> add(*params)
3

例子2:字典

def hello_3(greeting, name):
    print('%s,%s!' % (greeting,name))

>>> params={'name':'Sir Robin','greeting':'Well met'}
>>> hello_3(**params)
Well met,Sir Robin!

例子3:

def with_stars(**kwds):
    print (kwds['name'],'is',kwds['ages'],'years old')


def without_stars(kwds):
    print (kwds['name'],'is',kwds['ages'],'years old')

>>> arg={'name':'Mr','ages':42}
>>> with_stars(**arg)
Mr is 42 years old
>>> without_stars(arg)
Mr is 42 years old

星号只在定义函数(允许使用不定数目的参数)或者调用(“分割”字典或者序列)时才有用。

8.作用域
全局变量与局部变量:若局部变量或者参数的名字和想要访问的全局变量名相同,全局变量将被局部变量屏蔽。

在局部域中使用全局变量值可以使用globals()函数,例:

parameter='berry'
def combine(parameter):
    print (parameter+globals()['parameter'])

>>> combine('Shrub')
Shrubberry

重绑定全局变量:
如果早函数内部将值赋予一个变量,他会自动成为局部变量—除非告知Python将其声明为全局变量。

x=1
def change_global():
    global x
    x=x+1

>>> change_global()
>>> x
2

作用域嵌套:

def multiplier(factor):
    def multiplyByFactor(number):
        return number*factor
    return multiplyByFactor

>>> double=multiplier(2)
>>> double(5)
10

>>> multiplier(3)(2)
6

类似multiplyByFactor函数存储子封闭作用域的行为叫做闭包。

9.递归
有用的递归函数包含以下部分:

  • 当函数直接返回值时有基本实例(最小可能性问题);
  • 递归实例,包括一个或者多个问题较小部分的递归调用。