前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python——深入函数(1)

python——深入函数(1)

作者头像
zy010101
发布2021-06-24 14:59:16
3160
发布2021-06-24 14:59:16
举报
文章被收录于专栏:程序员

函数基础

函数能够实现功能的模块化封装,以方便后续调用。函数能够实现代码重用,减少代码冗余。另外,函数可以实现过程的分解。来一步一步实现整个过程。

def

python的函数是由一条赋值语句def编写的。def是可执行语句,在python运行到def的时候,会创建一个函数对象,并把该函数对象赋值给函数名变量。由于def是语句,因此它能出现在任何可以出现语句的地方。例如:

代码语言:javascript
复制
name = input("please input your name:")
if name == "Nicholas Zhao Si":
    def func():
        print("尼古拉斯·赵四")
else:
    def func():
        print("杂鱼")
func()

上面的代码中在if-else语句的子句中定义了函数。代码的执行结果如下所示:

代码语言:javascript
复制
zy@zy-PC:/media/zy/新加卷1/学习/Python$ python3 test.py 
please input your name:zy
杂鱼
zy@zy-PC:/media/zy/新加卷1/学习/Python$ python3 test.py 
please input your name:Nicholas Zhao Si
尼古拉斯·赵四

代码的执行结果说明了确实是当python执行到def语句的时候才会创建函数对象,并赋值给变量(函数名)。接下来,通过赋值操作,共享引用同一个函数对象。例如:

代码语言:javascript
复制
name = input("please input your name:")
if name == "Nicholas Zhao Si":
    def func():
        print("尼古拉斯·赵四")
else:
    def func():
        print("杂鱼")
funb = func     # func赋值给funb,它们引用同一个函数对象
funb()

程序执行结果如下所示,表明使用func和funb没有任何区别,它们是共享引用。

代码语言:javascript
复制
zy@zy-PC:/media/zy/新加卷1/学习Python$ python3 test.py 
please input your name:zy
杂鱼
zy@zy-PC:/media/zy/新加卷1/学习/Python$ python3 test.py 
please input your name:Nicholas Zhao Si
尼古拉斯·赵四

因此,函数名和普通的变量名没有任何区别,它可以赋值给其他变量名,或者是保存在列表,元组之中等。

return

上面定义的函数没有return语句,但是这并不意味函数没有返回值。实际上,没有return语句的函数,返回值默认是None,例如:

代码语言:javascript
复制
def func():
    print("666")


ret = func()    # 接受函数返回值
print(ret)  

执行代码将会打印函数返回值,结果如下:

代码语言:javascript
复制
666
None

可以看到,即使没有return语句,python的函数也会默认返回None,这点需要特别注意。回顾一下,列表,字典,集合这样的允许原地修改的对象,它们的某些方法,实际上没有return语句,但是会默认返回None,因此初学python的人,可能会犯如下的致命错误。

代码语言:javascript
复制
L = [1,2,3]
L = L.append(4)    # 错误使用,这将导致L的值变为None
print(L)

我们可以执行这段代码,结果如下:

代码语言:javascript
复制
None

return语句是可选的,并不是必须的,代码执行到return语句的时候,函数调用结束,并把结果返回到调用处。例如:

代码语言:javascript
复制
def add(x, y):
    return x + y


res1 = add(1, 2)
print(res1)
res2 = add('a', 'b')
print(res2)

程序执行结果如下所示:

代码语言:javascript
复制
3
ab

add函数的这种“适应性”,有一个新的名词“鸭子类型”来称呼这种多态性。

鸭子类型

鸭子类型是说,有一只鸟(甚至可以是其他东西),它游起来像鸭子,叫起来像鸭子,走起来也像鸭子,等等。那么它就是鸭子。换而言之,我们不关心它是否是鸭子,而是关心它的行为像不像鸭子。这种多态行为其实也是新瓶装老酒。毕竟“已有的事,后必再有;已行的事,后必再行。日光之下,并无新事。” 鸭子类型是多态的一种形式,在这种形式中,不管对象属于哪个类,也不管声明的具体接口是什么,只要对象实现了相应的方法,函数就可以在对象上执行操作。

局部变量

函数内的所有变量都是局部变量(包括函数参数),这些变量在函数被调用的时候创建,并在函数结束的时候销毁。例如:

代码语言:javascript
复制
>>> def func(r):
...     PI = 3.14
...     return PI * r * r
... 
>>> PI
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'PI' is not defined
>>> func(3)
28.259999999999998

PI这个变量只能在函数内部使用,在外部使用会出错,因为函数内部的所有变量都是局部变量。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/06/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数基础
    • def
      • return
        • 鸭子类型
          • 局部变量
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档