(九)Python中的函数(上)

举报
野猪佩奇996 发表于 2022/01/23 01:00:03 2022/01/23
【摘要】 1.函数概念的复习 形参、实参、return 在交互式环境中定义了函数add后,可以试试这样输入: >>> type(add)<class 'function'>>>> 2.函数如何定义 3.关于函数的命名 在函数定义时,我们可以调用另一个函数: def extend()...

1.函数概念的复习

形参、实参、return

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


  
  1. >>> type(add)
  2. <class 'function'>
  3. >>>

2.函数如何定义

3.关于函数的命名

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


  
  1. def extend():
  2. print('excited!')
  3. plus_one_sec()

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


  
  1. >>> def extend():
  2. ... print('excited!')
  3. ... plus_one_sec()
  4. ...
  5. >>> extend()
  6. excited!
  7. Traceback (most recent call last):
  8. File "<stdin>", line 1, in <module>
  9. File "<stdin>", line 3, in extend
  10. NameError: name 'plus_one_sec' is not defined
  11. >>>

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

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


  
  1. >>> def plus_one_sec():
  2. ... pass
  3. ...
  4. >>> extend()
  5. excited!
  6. >>>

4.函数的返回值

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


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

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


  
  1. def func():
  2. print("part A")
  3. return
  4. print("part B")
  5. func()

5.函数的对象性

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


  
  1. def func():
  2. """
  3. func() help
  4. """
  5. pass

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

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

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


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

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

6.函数参数


  
  1. def max_pow(a, b):
  2. if a > b:
  3. pow_ab = a ** b
  4. return pow_ab
  5. pow_ba = b ** a
  6. return pow_ba

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

7.函数参数收集


  
  1. def app(ls,*args):
  2. for item in args:
  3. ls.append(item)
  4. def swap(a,b):
  5. temp=a
  6. a=b
  7. b=temp
  8. ls = []
  9. app(ls, 1, 2)
  10. print(ls)
  11. ls2 = []
  12. app(ls2, 1, 2, 3)
  13. print(ls2)
  14. a=1
  15. b=2
  16. swap(a,b)
  17. print(a,b)

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

8.Python中的引用传参

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

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

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

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

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


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

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

a, b = b, a
 

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

10.函数的递归调用

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


  
  1. def fun2:
  2. fun1()
  3. def fun1:
  4. pass

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

调用自身:


  
  1. def fun1:
  2. fun1()

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


  
  1. def fun2:
  2. fun1()
  3. def fun1:
  4. pass

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

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

n! = n*(n-1)!
 

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

0! = 1
 

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

11.关于递归

文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。

原文链接:andyguo.blog.csdn.net/article/details/104118910

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。