创建函数:
函数是可以调用的(可能带有参数,也就是放在圆括号中的值),它执行某种行为并且返回一个值。一般来说,内置的callable函数可以用来判断函数是否可以调用:
import math
x=1
y=math.sqrt #sqrt返回数字的平方根
print(callable(x))
print(callable(y))
输出:
import math
x=1
y=math.sqrt
print(callable(x))
print(callable(y))
简单的定义一个函数:使用def语句即可:
def hello(name):
return ('Hello, '+name+"!")
print(hello('world'))
输出:
Hello, world!
代码实现斐波那契数列列表函数:
斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
如果设F(n)为该数列的第n项(n∈N*),那么这句话可以写成如下形式::F(n)=F(n-1)+F(n-2)
显然这是一个线性递推数列。
def fibs(num):
result=[0,1]
for i in range(num-2):
result.append(result[-2]+result[-1]) #任意一个数都是前两个数字之和的数字序列
return result
print(fibs(10))
输出:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
参数:
1.值
编写函数只是给程序需要的部分(也可能是其他程序)提供服务,能保证函数在被提供给可接受参数的时候正常工作就行,参数错误的话显然会导致失败(一般这时候需要断言和异常)。
注意:写在def语句中函数名后面的变量通常叫做函数的形参,而调用函数时提供的值是实参,或者参数。
2.参数可以被改变吗?
在函数内为参数赋予新值不会改变外部任何变量的值:
def try_to_change(n):
n='hjfjdh'
return n
name='shdjh'
print(try_to_change(name))
print(name)
输出:
hjfjdh
shdjh
字符串(以及数字和元组)是不可变的,即无法被修改。
如果将可变的数据结构如列表作为参数:
def change(n):
n[0]='yhuyuih'
return n
names=['sfhgfihf','sgfaiidfdhh']
print(change(names))
print(names)
输出:
['yhuyuih', 'sgfaiidfdhh']
['yhuyuih', 'sgfaiidfdhh']
假设需要编写一个存储名字并且能用名字、中间名、或姓查找联系人的程序,可以使用下面的数据结构:
def init(data):
data['first']={}
data['middle']={}
data['last']={}
st={}
init(st)
print(st)
输出:
{'first': {}, 'middle': {}, 'last': {}}
在编写存储名字的函数前,先写个获取名字的函数:
def lookup(data, label, name):
return data[label].get(name)
def init(data):
data['first']={}
data['middle']={}
data['last']={}
def store(data, full_name):#使用参数data和full_name进入函数,这两个参数被设置为函数在外部获得的一些值
names = full_name.split()#通过拆分full_name,得到一个叫names的列表。
if len(names)==2:
names.insert(1, '')#如果names长度为2(只有首名和末名),那么插入一个空字符串作为中间名
labels='first','middle','last'#将first,middle,last作为元组存储在labels中
for label, name in zip(labels,names):#使用zip函数联合标签和名字,对于每一个(label,name)对进行处理
people =lookup(data,label,name)#获得属于给定标签和名字的列表
if people:
people.append(full_name)#将full_name添加到列表中
else:
data[label][name]=[full_name]
Mynames={}
init(Mynames)
store(Mynames,'Magnus Lie Hetland')
print(lookup(Mynames,'middle','Lie'))
store(Mynames,'Robin Hood')
store(Mynames,'Robin Locksley')
print(lookup(Mynames,'first','Robin'))
store(Mynames,'Mr Gumby')
print(lookup(Mynames,'middle',''))
输出:
['Magnus Lie Hetland']
['Robin Hood', 'Robin Locksley']
['Robin Hood', 'Robin Locksley', 'Mr Gumby']
代码实现联系提供和接受参数的方法:
def story(**kwds):
return 'Once upon a time ,there was a %(job)s called %(name)s.' %kwds
def power(x,y,*others):
if others:
print('Received redundant parameters:',others)
return pow(x,y)
def interval(start,stop=None,step=1):
'Imitates range() for step >0'
if stop is None: #如果没有为stop提供值...
start,stop =0,start #指定参数
result =[]
i=start #计算start索引
while i<stop: #直到计算到stop的索引
result.append(i) #将索引添加到result内...
i +=step #用step(>0)增加索引i...
return result
print(story(job='King',name='Gumby'))
print(story(name='Sir Robin',job='brave knight'))
params={'job':'language','name':'Python'}
print(story(**params))
del params['job']
print(story(job='stroke of genius',**params))
print(power(2,3))
print(power(3,2))
print(power(y=3,x=2))
params=(5,)*2
print(power(*params))
print(power(3,3,'Hello, world'))
print(interval(10))
print(interval(1,5))
print(interval(3,12,4))
print(power(*interval(3,7)))
输出:
Once upon a time ,there was a King called Gumby.
Once upon a time ,there was a brave knight called Sir Robin.
Once upon a time ,there was a language called Python.
Once upon a time ,there was a stroke of genius called Python.
8
9
8
3125
Received redundant parameters: ('Hello, world',)
27
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4]
[3, 7, 11]
Received redundant parameters: (5, 6)
81