python中的函数是根据实际需要创建的一类用来实现相关功能的代码段,大致可分为内置函数(如print())和自定义函数。其作用主要是为了提高应用的模块性和代码重复利用率。
定义
def函数名(参数名1[=默认值1],参数名2[=默认值2]…)
…
return表达式
定义一个加减乘除函数
from__future__importdivision
defarithmetic(x,y,operator):
result={
'+': x + y,
'-': x - y,
'*': x * y,
'/': x / y
}
returnresult.get(operator)
print(arithmetic(2,2,"+"))
out:
4
参数
在c、c++中,参数的传递有值和引用传递两种方式,而在python中的任何变量都是对象,所以参数只支持引用传递的方式。Python通过名字绑定的机制,把实际参数的值和形式参数的名称绑定在一起,即把形式参数传递到函数所在的局部命名空间中,形式参数和实际参数指向内存中的同一个储存空间。
函数的参数支持默认值。当某个参数没有传递实际的值时,函数使用默认参数计算
from__future__importdivision
defarithmetic(x=1,y=1,operator='+'):
result={
'+': x + y,
'-': x - y,
'*': x * y,
'/': x / y
}
returnresult.get(operator)
print(arithmetic(2,2))
print(arithmetic(x=2,operator="+"))
print(arithmetic(y=2,operator="*"))
print(arithmetic(x=2,y=2,operator="*"))
out:
4
3
2
4
Python还提供了另一标识符“**”。在形式参数前面添加“**”,可以引用一个字典。根据实际参数的赋值表达式生成字典。
语法规定,“*”必须写在“**”的前面。
defsearch(*t,**d):
keys = d.keys()
values = d.values()
print(keys)
print(values)
forargint:
forkeyinkeys:
ifarg ==key:
print('find:',d[key])
search('one','two','three',one='1',
two='2',three='3')
out:
dict_keys(['one','two','three'])
dict_values(['1','2','3'])
find:1
find:2
find:3
返回值
形式:return+变量或表达式
return+变量
defsum(*args):
sum=
foriinargs:
sum = sum +i
returnsum
print(sum(1,2,3,4,5,6,7,8,9,10))
out:
55
return+表达式
defsum(*args):
sum=
foriinargs:
sum = sum +i
returnsum/len(args)
print(sum(1,2,3,4,5,6,7,8,9,10))
out:
5.5
嵌套
函数的嵌套是指在函数的内部调用其他函数。c、c++只允许在函数体内部嵌套,python不仅支持函数体内的嵌套,还支持函数定义的嵌套。
计算表达式(x+y)*(m-n),可先定义求和函数、求差函数,最后定义求乘积函数
# coding:utf-8
#计算表达式(x+y)*(m-n)
#第1步,求和值:
defsum(x,y):
sum = x+y
returnsum
#第2步,求差值:
defsub(m,n):
sub= m-n
returnsub
#第3步,求乘积:
defpl(x,y,m,n):
pl=sum(x,y)*sub(m,n)
returnpl
print(pl(1,2,3,4))
out:
-3
递归函数
递归函数可以在函数主体内直接或间接调用自己,即函数嵌套是函数本身。递归是一种程序设计方法,使用递归函数可以减少重复的代码,使程序变得简洁。
递归过程:递推和回归
原理:
第一阶段:
递归函数在内部调用自己:每一次函数调用又重新开始执行此函数的代码,直到某一级程序结束
第二阶段:
递归函数从后往前返回:从最后一级开始返回,直到返回到第一次调用的函数体内。即递归逐级调用完毕后,再按照相反的顺序逐级返回。
经典递归阶乘的实现
# coding:utf-8
#普通方式
defn_1(x):
ifx==1:
returnx
else:
rum =1
foriinrange(1,x+1):
rum = rum*i
returnrum
#递归方式
defn_2(x):
ifx ==1:
return1
else:
returnx*(n_2(x-1))
print(n_1(5))
print(n_2(5))
out:
120
120
注:递归函数相对一般函数简洁,但因每次调用递归函数都会复制函数中所有的变量,再执行递归函数,导致程序需要较多的内容空间,对程序的性能有一定的影响。因此,对于没有必要进行递归的程序,最好采用其他方法进行改进。
lambda函数(匿名函数)
lambda函数用于创建一个匿名函数,函数名未和标识符进行绑定,可以通过lambda函数返回一些简单的运算结果。
用法:lambda 变量1,变量2...:表达式
上述表达式(x+y)*(m-n)的计算,也可采用匿名函数
# coding:utf-8
#计算表达式(x+y)*(m-n)
defpl(x,y,m,n):
sum =lambdax,y:x+y
sub=lambdam,n:m-n
pl=sum(x,y) * sub(m,n)
returnpl
print(pl(1,2,3,4))
out:
-3
Generator函数(生成器函数)
生成器(Grator)的作用是一次产生一个数据项,并把数据项输出。因其每次返回一个数据项,使得迭代器性能更加。
用法:
def函数名(参数:
...
yield表达式
deffunc(n):
foriinrange(n):
yieldi
r=func(3)
#python2.x要写成r.next(),python3要写成next(r)
print(next(r))#i=0,暂时中断在yield关键字处,并返回0
print(next(r)) #从上次中断的yield处接着接着执行,中断在下一个yield处,并返回1,依次类推
print(next(r))
out:
1
2
·每次执行,会暂时中断在yield关键字处,而且通过yield返回一个参数;
·下次再接着执行,会从上次中断的yield处接着执行,并通过send()传递参数,继续中断在下一个yield处;
·若通过send()或next()执行generator,而未找到下一个yield,此时会报错。
未找到下一个yield,报错
deffunc(n):
foriinrange(n):
yieldi
r=func(3)
#python2.x要写成r.next(),python3要写成next(r)
print(next(r))
print(next(r))
print(next(r))
print(next(r))
out:
1
2
Traceback (most recent call last):
StopIteration
注:yield保留字与return语句的返回值和执行原理均不同。yield生成值不会中止程序的执行(无下一个yield时报错),返回值后继续执行。return返回值后,程序中止执行。
python3内置函数
领取专属 10元无门槛券
私享最新 技术干货