python创建函数以及参数的使用(一)

创建函数:

函数是可以调用的(可能带有参数,也就是放在圆括号中的值),它执行某种行为并且返回一个值。一般来说,内置的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

猜你喜欢

转载自blog.csdn.net/qq_38360675/article/details/84970405