首先明确字符串,数字和元组作为函数参数时是不可变的,但是列表和字典等数据结构却是可以改变的。
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