码迷,mamicode.com
首页 > 编程语言 > 详细

Python 学习笔记-函数(一)传参

时间:2014-12-16 06:35:10      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:python 函数 参数 闭包

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

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)




Python 学习笔记-函数(一)传参

标签:python 函数 参数 闭包

原文地址:http://bretoncrepe.blog.51cto.com/9590251/1590297

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!