计蒜客(九)Python中的函数(上)

1.函数概念的复习

形参、实参、return

在交互式环境中定义了函数add后,可以试试这样输入:

>>> type(add)
<class 'function'>
>>>

2.函数如何定义

3.关于函数的命名

在函数定义时,我们可以调用另一个函数:

def extend():
    print('excited!')
        plus_one_sec()

如果被调用的函数,之前没有被定义的话,那么执行时会报错:

>>> def extend():
...     print('excited!')
...     plus_one_sec()
...
>>> extend()
excited!
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in extend
NameError: name 'plus_one_sec' is not defined
>>>

C++等语言“前向引用声明”——如果我们要调用的函数存在循环引用问题,我们就必须把函数的声明写在最前面。而Python不需要这么做——只要函数定义了,无论先后,都可以使用。

这里如果我们继续在交互式环境中给出函数定义的话(哪怕实际上什么都不做),我们也可以正常运行一开始定义的函数了:

>>> def plus_one_sec():
...     pass
...
>>> extend()
excited!
>>>

4.函数的返回值

return可以返回一个或多个变量或对象的值。

def multi_return():
    return 1,2,3
x,y,z=multi_return()
print(x)

对于不加参数的return其作用是直接结束正在执行的函数,并离开函数体,返回到调用开始的位置。下面代码只会输出A。

def func():
    print("part A")
    return
    print("part B")
func()

5.函数的对象性

   我们需要给函数写文档(方便别人读程序)。格式如下——一般卸载函数名字的下面,主要用于说明函数的用途。

def func():
    """
        func() help
    """
    pass

定义好文档后,在交互式命令行中,我们可以直接使用 fun._doc_ 查看函数的文档。

函数本身也是python中的对象,而“文档”其实就是函数对象的一个属性。

任何对象都具有属性,函数自然也不例外,我们还可以对已经定义好的函数func,给它增加一个新的属性:

func.attr = 10
print(func.attr)  # 输出 10

    在python中内置了一个函数dir,可以用来查看一个对象是否具有哪些属性和方法,然后通过查阅Python文档来搜索这些方法的说明。而前面用过的 _doc_ 属性,跟其他的一些对象自带属性一样,使用双下划线开头——这些属性称之为 特殊属性。函数作为对象也是拥有一些自带的特殊方法的。

6.函数参数

def max_pow(a, b):
    if a > b:
        pow_ab = a ** b
        return pow_ab
    pow_ba = b ** a
    return pow_ba

   在函数调用过程中,当我们无法判断函数会有多少个参数时,python提供了一种非常方便的机制:*args参数。

7.函数参数收集

def app(ls,*args):
    for item in args:
        ls.append(item)
        
def swap(a,b):
    temp=a
    a=b
    b=temp

ls = []
app(ls, 1, 2)
print(ls)
ls2 = []
app(ls2, 1, 2, 3)
print(ls2)

a=1
b=2
swap(a,b)
print(a,b)

结果如右 *args指后面的变量,这里是将后面的变量都加入到列表中。

8.Python中的引用传参

C/C++没有垃圾回收机制,由程序员自己来管理内存,这既是优点也是缺点。而后面发展的JAVA/C#都通过更高层次的抽象,屏蔽了和内存有关的底层细节,另一方面也牺牲了一些运行效率和程序员的自主权。

值传递时参数是单向传递,而要对主函数定义的实参进行修改时,要用引用传参。

python采用的是一种“传对象引用”的参数传递方式——我们不能自己决定如何传参的。即可认为这是值传递和引用传递的结合体:

(1)对于不可变类型的参数,比如数字、字符或者元组,那么函数传参时采用的就是相当于 值传参——我们不能直接修改原始对象。

(2)对于可变类型的参数,比如列表,字典等,那么传参的凡是就类似于 引用传参,我们可以直接修改原始对象。

def app(ls, *args):
    for item in args:
        ls.append(item)

ls作为列表,是一个可变参数。在python中交换两个变量的值,不用写一个函数,直接:

a, b = b, a

9.关于Python的参数传递机制

10.函数的递归调用

在一个函数中,我们可以调用另一个函数:

def fun2:
    fun1()
def fun1:
    pass

递归(直接或间接地调用自身)

调用自身:

def fun1:
    fun1()

函数间接的调用自身:(两个函数互相调用,同样构成了递归)

def fun2:
    fun1()
def fun1:
    pass

递归过程有两个阶段:递推(递推步 和 递归基)和回归。

如求n的阶乘n!【递推步】可以根据定义得到关系式:

n! = n*(n-1)!

同时,【递归基】当n=0时我们可以直接得到已知解:

0! = 1

回归即递推的逆过程——从已知条件出发,注意求值回归,最后达到递推的开始点,结束回归阶段,完成递归调用。

11.关于递归

发布了219 篇原创文章 · 获赞 13 · 访问量 9825

猜你喜欢

转载自blog.csdn.net/qq_35812205/article/details/104118910