您的位置:首页 > 编程语言 > Python开发

Python函数

2016-01-14 22:08 253 查看

函数

设计和编写函数,不仅可以实现代码的复用,更重要的是可以保证代码的一致性,只需要修改该函数代码则所有调整位置均受到影响。

尽量只让一个函数完成一个功能,以提高模块的内聚性,尽量减少不同函数之间的隐式耦合性。

函数定义:

def funcName([arguments]):
函数体


fiber函数实现菲波那切数列

def fiber(n):
a, b = 1,1
i = 0
while i < n:
print(a, end=' ')
a, b = b, a+b
i = i + 1


参数类型

Python函数的参数有多种:普通参数、默认值参数、关键参数、可变长度参数等。

在定义函数时不需要指定参数的类型,形参的类型完全由调用者传递的参数类型和Python解释器的理解和推断来决定的,类似于java的泛型。

不需要指定函数的返回值类型,函数的类型由return语句返回值的类型决定,如果函数中没有return语句或者没有执行到return语句而返回,则函数默认返回None。

默认值参数

def funcName(..., 形参名=默认值):
函数体


funcName.defaults返回函数所有默认值参数的当前值,返回值是一个元组。

注意:

默认值参数必须出现在函数参数列表的最右端,且任何一个默认值参数右边都不能再出现非默认值参数。

默认值参数只被解释一次。

关键参数

主要指实参,即调用参数时的参数传递方式,而与函数定义无关。

通过关键参数传递,实参顺序可以和形参顺序不一致,避免了需要牢记参数位置与顺序的麻烦,更加灵活方便。

def demo(a, b, c=6):
print(a, b, c)

>>> demo(b=4,a=2)
2 4 6


可变长度参数

可变长度参数主要有两种形式:*parameter 和 **parameter。

*parameter用来接收任意多个实参并将其放在一个元组中;

**parameter用来接收类似于关键参数一样显示赋值形式的多个实参并将其放入字典中

#将接收的实参放入到一个元组中
def demo(*p):
print(p)

>>> demo(1, 2, 3)
(1, 2, 3)

#在调用该函数时会自动将接收的参数转换成字典
def demo2(**p):
for item in p.items():
print(item)

>>> demo2(x=1,y=2,z=3)
('x', 1)
('y', 2)
('z', 3)


参数传递的序列解包

传递参数时,可以使用Python列表、元组、集合、字典以及其他可迭代对象作为实参,并在实参名称前加一个星号,Python解释器将自动进行解包,然后传递给多个单变量形参。

但需要注意的是,如果使用字典作为实参,默认使用的是字典的键,通过字典对象的items()和values()方法来操作字典的键值对、值。

要保证实参中元素个数与形参个数相等。

def demo3(a, b, c):
print(a + b + c)

>>> aList = [1, 2, 3]
>>> demo3(*aList)
6

>>> aTuple = [1, 2, 3]
>>> demo3(*aTuple)
6

>>> dic = {1:'a', 2:'b', 3:'c'}
>>> demo3(*dic)
6

>>> aSet = {1, 2, 3}
>>> demo3(*aSet)
6


变量作用域

局部变量

全局变量

全局变量可以通过global来声明或定义,分两种情况:

一个变量已在函数外定义,如果在函数内需要修改这个变量的值,并要将这个赋值结果反映到函数外,可以在函数内用global声明这个变量,明确声明使用同名的全局变量。

在函数内部直接将一个变量声明为全局变量,在函数外没有声明,在调用这个函数之后,将增加为新的全局变量。

def demo4(n = 10):
global sum #是声明,而不可以在声明时直接赋值
sum = 0
for item in range(n):
sum = sum + item
return sum

>>> demo4()
45
>>> sum
45


lambda表达式

lambda表达式可以用来生命匿名函数,即没有函数名字的临时使用的小函数。

lambda表达式只可以包含一个表达式

>>> f = lambda x, y, z : x+y+z
>>> print(f(1,2,3))
6

>>> g = lambda x, y=2,z=3 : x+y+z
>>> g(1)
6


几个重要的内置函数或语句

内置函数map()

内置函数reduce(),需要导入functools模块

内置函数filter()

包含yield语句的函数创建生成器。迭代器的最大特点是惰性求值,它尤其适用于大数据处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: