首先明确字符串,数字和元组作为函数参数时是不可变的,但是列表和字典等数据结构却是可以改变的。
def change(n): n[0]=‘apple‘ names=[‘banana‘,‘pear‘] n=names[:] change(n) print names,n [‘banana‘, ‘pear‘] [‘apple‘, ‘pear‘]
修改后让原始列表保持不变。
假设现在要编写一个存储姓名, 年龄,部门并能够根据这三样进行联系人查询的程序:
因为是查询多个元素,首先想到了字典这种数据结构,考虑建立一个大字典storage内存在三个小字典names,age,dept.
首先建立一个字典初始化函数:
def init(data): data[‘names‘]={} data[‘age‘]={} data[‘dept‘]={} storage={} print init(storage) None
在获得信息之前,先编写一个获得信息函数,data字典,label为names, age和dept, info是具体个人信息,比如jack,25,finance和lee 25 hr,则data[age][25]就会返回‘jack,25,finance‘和‘lee,25,hr‘两项。
def lookup(data,label,info): return data[label].get(info)
接下来想办法怎样把值存入字典:
def store(data,infos): linfo=infos.split() labels = ‘name‘,‘age‘,‘dept‘ for label,info in zip(labels,linfo): #并行遍历两个list people=lookup(data, label, info) if people: people.append(infos) #如果已存在键,只添加值。 else: data[label][info]=[infos] #如果不存在,则创建新的键值。注意这里[info]代表一个字符串列表。 mylist={} init(mylist) store(mylist,‘LEE 26 HR‘) store(mylist,‘ZHANG 27 HR‘) store(mylist,‘LEE 26 Engineering‘) lookup(mylist,‘name‘,‘LEE‘) {‘dept‘: {‘HR‘: [‘LEE 26 HR‘, ‘ZHANG 27 HR‘], ‘Engineering‘: [‘LEE 26 Engineering‘]}, ‘age‘: {‘26‘: [‘LEE 26 HR‘, ‘LEE 26 Engineering‘], ‘27‘: [‘ZHANG 27 HR‘]}, ‘name‘: {‘LEE‘: [‘LEE 26 HR‘, ‘LEE 26 Engineering‘], ‘ZHANG‘: [‘ZHANG 27 HR‘]}}
再调用函数的时候,可以提供参数的名字,代码更加易读:
def hello1(greeting,name): print ‘%s,%s‘ % (greeting,name) hello1(name=‘Shuwei‘,greeting=‘Hello‘) hello1(name=‘Hello‘,greeting=‘shuwei‘) Hello,Shuwei shuwei,Hello
再定义函数的时候,关键字参数可以给函数提供默认值,例如:
def hello1(greeting=‘Hello‘,name=‘Shuwei‘):
看下面一个例子,如何将参数收集成元组或字典:
def printpa(x,y,z=3,*pospar,**keypar): print x, y, z print pospar print keypar printpa(1,2,3,4,5,6,foo=1,bar=2) printpa(1,2,foo=1,bar=2) printpa(1,2,3,4,5,6,7,8,foo=1) printpa(1,2,3,‘i love you‘,foo=1) printpa(1,2,‘i love you‘,foo=1)
1 2 3 (4, 5, 6) {‘foo‘: 1, ‘bar‘: 2} 1 2 3 () {‘foo‘: 1, ‘bar‘: 2} 1 2 3 (4, 5, 6, 7, 8) {‘foo‘: 1} 1 2 3 (‘i love you‘,) {‘foo‘: 1} 1 2 i love you () {‘foo‘: 1}
所以*在定义函数时允许输入不定数目的参数,在调用时表示分割字符串或者列表。
能不能在一个函数中嵌套另一个呢?当然可以:
def npower(factor): def cal(num): return num**factor return cal n=npower(5) print n(2)
第一次调用npower(5),并赋给n,相当于把cal赋给n,然后n(2)就相当于cal(2),返回2**5==32,我们把cal()在npower()中的现象叫做闭包(closure)
原文地址:http://bretoncrepe.blog.51cto.com/9590251/1590297