Python基础入门之函数二

5.4、Python函数之返回多值


函数可以返回多个值吗?答案是肯定的。

比如在游戏中经常需要从一个点移动到另一个点,给出坐标、位移和角度,就可以计算出新的坐标:

# math包提供了sin()和 cos()函数,我们先用import引用它:

import math

def move(x, y, step, angle):

    nx = x + step * math.cos(angle)

    ny = y - step * math.sin(angle)

    return nx, ny

这样我们就可以同时获得返回值:

>>> x, y = move(100, 100, 60, math.pi / 6)

>>> print x, y

151.961524227 70.0

但其实这只是一种假象,Python函数返回的仍然是单一值:

>>> r = move(100, 100, 60, math.pi / 6)

>>> print r

(151.96152422706632, 70.0)

用print打印返回结果,原来返回值是一个tuple

但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以函数返回几个值就需要几个变量去接收(除了一个变量去接收函数时),接收变量多了或少了,代码都会报错ValueError。Python的函数返回多值其实就是返回一个tuple,但写起来更方便。

任务4

一元二次方程的定义是:ax² + bx + c = 0

请编写一个函数,返回一元二次方程的两个解。

注意:Python的math包提供了sqrt()函数用于计算平方根。


5.6、Python之定义默认参数


定义函数的时候,还可以有默认参数。

例如Python自带的 int() 函数,其实就有两个参数,我们既可以传一个参数,又可以传两个参数:

>>> int('123')

123

>>> int('123', 8)

83

int()函数的第二个参数是转换进制,如果不传,默认是十进制 (base=10),如果传了,就用传入的参数。

可见,函数的默认参数的作用是简化调用,你只需要把必须的参数传进去。但是在需要的时候,又可以传入额外的参数来覆盖默认参数值。

我们来定义一个计算 x 的N次方的函数:

def power(x, n):

    s = 1

    while n > 0:

        n = n - 1

        s = s * x

    return s

假设计算平方的次数最多,我们就可以把 n 的默认值设定为 2:

def power(x, n=2):

    s = 1

    while n > 0:

        n = n - 1

        s = s * x

    return s

这样一来,计算平方就不需要传入两个参数了:

>>> power(5)

25

由于函数的参数按从左到右的顺序匹配,所以默认参数只能定义在必需参数的后面:

# OK:

def fn1(a, b=1, c=2):

    pass

# Error:

def fn2(a=1, b):

    pass

任务6

请定义一个 greet() 函数,它包含一个默认参数,如果没有传入,打印 'Hello, world.',如果传入,打印 'Hello, xxx.'


5.7Python之定义可变参数


如果想让一个函数能接受任意个参数,我们就可以定义一个可变参数:

def fn(*args):

    print args

可变参数的名字前面有个 号,我们可以传入0个、1个或多个参数给可变参数:

>>> fn()

()

>>> fn('a')

('a',)

>>> fn('a', 'b')

('a', 'b')

>>> fn('a', 'b', 'c')

('a', 'b', 'c')

可变参数也不是很神秘,Python解释器会把传入的一组参数组装成一个tuple传递给可变参数,因此,在函数内部,直接把变量 args 看成一个 tuple 就好了。

定义可变参数的目的也是为了简化调用。假设我们要计算任意个数的平均值,就可以定义一个可变参数:

def average(*args):

    ...

这样,在调用的时候,可以这样写:

>>> average()

0

>>> average(1, 2)

1.5

>>> average(1, 2, 2, 3, 4)

2.4

任务7

请编写接受可变参数的 average() 函数。


任务答案:

任务4:

#提示:求根公式:x = (-b±√(b*b-4ac))/2a

import math


def quadratic_equation(a, b, c):

    t = math.sqrt(b * b - 4 * a * c)

    x1 = (-b + t) / (2 * a)

    x2 = (-b - t) / (2 * a)

    return x1,x2


print quadratic_equation(2, 3, 0)

print quadratic_equation(1, -6, 5)


任务6:

def greet(a = 'world'):

    print 'Hello,'+ a + '.'


greet()

greet('Bart')


任务7:

def average(*args):

    if len(args) <= 0:

        return 0.0

    sum = 0.0

    avg = 0.0

    for i in args:

        sum = sum + i

    avg = sum / len(args)

    return avg

print average()

print average(1, 2)

print average(1, 2, 2, 3, 4)


文章中缺少了5.5、函数之递归函数,为了更好的理解,我准备单列出一篇,用来讲,敬请期待!!!




猜你喜欢

转载自blog.csdn.net/hbblzjy/article/details/78585560
今日推荐