首页 » InfoTech »

Python函数的一些特性

2018年11月8日 / 4次阅读
Python

打开支付宝首页,搜索“529018372”,即可领取红包!可重复领。

特色图片

本文尝试总结学习过的与Python函数有关的知识点,函数的一些特性。

在Python语言中,函数是第一类对象(first-class objects)。这指的是它们可以被指定给变量,函数既能返回函数类型,也可以接受函数作为输入。类(class)也是第一类对象。

 

1, Python中一切都是对象,包括函数!

在 Python 中有个常识:函数和其他任何东西一样,都是对象。函数包含变量,它并不那么特殊。

>>> issubclass(int, object) # all objects in Python inherit from a common baseclass
True
>>> def foo():
...     pass
>>> foo.__class__ 
<type 'function'>
>>> issubclass(foo.__class__, object)
True

函数这个对象,也可以直接作为参数,在不同的函数间传递,写回调时很方便。

>>> def add(x, y):
...     return x + y
>>> def sub(x, y):
...     return x - y
>>> def apply(func, x, y): # 1
...     return func(x, y) # 2
>>> apply(add, 2, 1) # 3
3
>>> apply(sub, 2, 1)
1

apply函数的第一个参数,就是另外一个函数。在C/C++语言里面,我们称这样的函数为钩子,或者回调。

 

2, Python的函数都有返回值,只是有的时候不明显!

没有return语句的函数,也会返回None。

>>> def foo():
...     print('abc')
...
>>>
>>> rr = foo()
abc
>>>
>>> rr
>>> type(rr)
<class 'NoneType'>

return语句可以写,也可以不写,return后面什么都没有,就是返回None。

>>> def koo():
...     print('123')
...     return
...
>>> kk = koo()
123
>>> kk
>>> type(kk)
<class 'NoneType'>
>>>

 

3, 函数入参的初始值,只在加载代码时赋值一次!

这是一个经典的case,来自python官方教程,麦新杰略作修改,以便更好的显示其内部机制。

def f(a, L=[]):
    print(locals())
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))

L这个list,在整段代码执行之前,只赋值一次。你可以想象,这段代码被载入Python解释器时,L就被赋值,然后在后续执行过程中,L=[]这行代码不会再被执行。于是,我们看到了如下的执行结果:

D:\>python pytest/testk.py
{'L': [], 'a': 1}
[1]
{'L': [1], 'a': 2}
[1, 2]
{'L': [1, 2], 'a': 3}
[1, 2, 3]

可以还是不是太明显,我在稍加改造这段代码:

def f(a, L=[]):
    L =[]
    print(locals())
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))

函数f中,对L的操作,替换为一个局部变量,执行结果如下:

D:\>python pytest/testk.py
{'L': [], 'a': 1}
[1]
{'L': [], 'a': 2}
[2]
{'L': [], 'a': 3}
[3]

这里还有个问题要解释,函数f返回了一个L,可是L是局部变量,难道局部变量不应该在f调用结束之后消失吗?

下面这段代码可以说明:当L是一个mutable变量时(Python中严格区分mutable和immutable变量),返回的是这个mutable变量的地址,这个变量并没有消失。应该是这个局部定义的变量被返回,其ref还在,因此没有消失。

def f(a):
    L =[]
    print(locals())
    L.append(a)
    print(id(L))
    return L

a = f(1)
print(a)
print(id(a))

b = f(2)
print(b)
print(id(b))

执行结果:

D:\>python pytest/testk.py
{'L': [], 'a': 1}
3276712
[1]
3276712
{'L': [], 'a': 2}
31690920
[2]
31690920

 

4, 小巧玲珑的Lambda函数(羊大,Python的第一块语法糖)

Python的Lambda表达式

在排序函数中使用Lambda表达式

 

未完待续...

 

本文链接:http://www.maixj.net/ict/python-func-19013
云上小悟 麦新杰(QQ:1093023102)

相关文章

评论是美德

无力满足评论实名制,评论对非实名注册用户关闭,有事QQ:1093023102.


前一篇:

栏目精选

云上小悟,麦新杰的独立博客

Ctrl+D 收藏本页

栏目

AD

ppdai

©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号:苏ICP备14045477号-1。云上小悟网站部分内容来源于网络,转载目的是为了整合信息,收藏学习,服务大家,有些转载内容也难以判断是否有侵权问题,如果侵犯了您的权益,请及时联系站长,我会立即删除。

网站二维码
go to top