- 1.
#简单的函数
#个人版
def fibs1(num):
fib=[0,1]
for i in range(2,num):
fib.append(fib[i-1]+fib[i-2])
return fib
#课本版
def fibs2(num):
fib=[0,1]
for i in range(num-2):
fib.append(fib[-1]+fib[-2])
return fib
print fibs1(10)
print fibs2(10)
课本版的更有Python的风格,个人版的则感觉像是C的风格。
输出:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
- 2.
def change_word(name):
name='Bob'
my_name='Mary'
print my_name
change_word(my_name)
print my_name
当变量name改变时,my_name不变。函数参数储存在局部作用域内。
输出:
Mary
Mary
def change(n):
n[0]='Bob'
names=['Mary','Jack']
print names
change(names)
print names
当两个变量引用同一个列表的时候,它们用的就是一个列表。如果想避免这个问题,就要再创建一个副本。
输出:
[‘Mary’, ‘Jack’]
[‘Bob’, ‘Jack’]
-
这里是一个储存名字并能用名字的前中后三部分查找联系人的程序。
def init(data):
'init the data_structure'
data['first']={}
data['middle']={}
data['last']={}
def lookup(data,label,name):
'look for the full_name'
return data[label].get(name)
def store(data,full_name):
'stroe new message'
names=full_name.split()
if len(names)==2:
names.insert(1,' ')
labels='first','middle','last'
for label,name in zip(labels,names):
people=lookup(data,label,name)
if people:
people.append(full_name)
else:
data[label][name]=[full_name]
My_names={}
init(My_names)
在store函数中,首先将输入进来的全名进行分片,如果只有两部分,则在中间加一个部分,为空格;
然后,获得属于给定标签和名字的列表,如果full_name可以放,就放在原列表中,否则创建一个新列表存储。
测试结果:
>>> My_names
{'middle': {}, 'last': {}, 'first': {}}
>>> store(My_names,'Ma Ag ss')
>>> store(My_names,'Ma Hood')
>>> lookup(My_names,'first','Ma')
['Ma Ag ss', 'Ma Hood']
>>> store(My_names,'Alice Wang')
>>> lookup(My_names,'middle',' ')
['Ma Hood', 'Alice Wang']
- 4.
#通常情况无法改变参数
def iadd(n):
return (n+1,n+2)
c=5
(a,b)=iadd(c)
print c,a,b
#如果你非要改变参数
def inc(x):
x[0]=x[0]+1
foo=[10]
print foo
inc(foo)
print foo
无法直接改变参数,只能从函数中返回值;如果非要改变,参考第二种写法。
- 5.
def hello_4(name='Bob',greeting='Hello',punctuation='!'):
print '%s, %s%s' %(greeting,name,punctuation)
hello_4()
hello_4('Mary')
hello_4(greeting='hi')
hello_4('Mary','hi')
hello_4('Mary',punctuation='...')
这里使用了关键字参数和位置参数两种方法,不过不难,看例子很容易就可以明白。
输出:
Hello, Bob!
Hello, Mary!
hi, Bob!
hi, Mary!
Hello, Mary…