视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python中的自定义函数学习笔记
2020-11-27 14:38:07 责编:小采
文档
 定义一个什么都不做的函数

代码如下:


>>> def a():
... pass
...

>>> def printHello():
... print("hello")
...
>>> printHello()
hello
>>> callable(printHello)
True


顾名思义,callable函数用于判断函数是否可以调用;

有书上说,callable在Python3.0中已经不再使用,而使用hasattr(func, '__call__')代替;

代码如下:


>>> hasattr(printHello, '__call__')
True

>>> printHello.__doc__
>>> def printHello():
... 'just print hello'
... print('hello')
...
>>> printHello.__doc__
'just print hello'


每个函数都有一个__doc__属性,双下划线表示它是个特殊属性;

内建的help函数非常有用,可以提供有关方法/函数的帮助信息;

代码如下:


>>> help(printHello)

函数的注释信息包含其中;

虽然printHello函数没有使用return,可以用一个变量接收返回值:

代码如下:


>>> result = printHello()
hello
>>> result
>>> print(result)
None


None是Python的内建值,类似Javascript的undefined么?

定义一个可以接收参数的printStr,用以打印字符串

代码如下:


>>> def printStr(str):
... print(str)


>>> printStr("hello")
hello


像C++一样,Python支持默认参数

代码如下:


>>> def printStr(str="nothing"):
... print(str)
..

>>> printStr()
nothing


再来看看传参方式

代码如下:


>>> a = [1,2]
>>> def try_change_list(a):
... a[:] = [1,1,1]
...
>>> try_change_list(a)
>>> a
[1, 1, 1]


Python的传参可以理解为按值传递(同java,Javascript)?

BTW:如果不想让try_change_list改变原来的对象,可以传入a[:]

代码如下:


>>> a = [1,2]
>>> try_change_list(a[:])
>>> a
[1, 2]


当然,这里做的是浅拷贝,可以使用copy模块的deepcopy来进行深拷贝;

除了支持参数默认值,还支持命名传参:

代码如下:


>>> def sum(a=0, b=0):
... return a + b;
...
>>> sum(2,2)
4
>>> sum(b = 3, a = 4)
7


这种特性在参数较多时比较好用;

来看一下,Python对可变参数列表的支持:

代码如下:


>>> def sum(*args):
... s = 0;
... for i in args:
... s += i;
... return s
...
>>> sum(1,2,3,4)
10


这是一个简单的求和例子,不同于C/C++的静态类型,Python并不会传入sum函数的参数的类型:

代码如下:


>>> def printArs(*args):
... for a in args:
... print(a)
...
>>> printArs(2, 3, [2,2], (2,), 'df')
2
3
[2, 2]
(2,)
df
>>> printArs(*(2, 3, [2,2], (2,), 'df'))
2
3
[2, 2]
(2,)
df
>>> printArs(*[2, 3, [2,2], (2,), 'df'])
2
3
[2, 2]
(2,)
df


这里的args对应于Javascript的arguments;

除了使用使用元组(tuple)接收可变参数,还可以使用dictionary接收命名参数:

代码如下:


>>> def printArs(**args):
... for k in args:
... print(repr(k) + " = " + repr(args[k]))
...
>>>
>>> printArs(name='wyj', age=24)
'name' = 'wyj'
'age' = 24
>>> printArs(**{'name':'wyj', 'age':24})
'name' = 'wyj'
'age' = 24


当然,更复杂地,可以混合使用*arg, **arg, 默认值特性:

下载本文
显示全文
专题