参考来源:Vitu.AI
在上一节课,你已经看过并使用过print和abs等函数。 但python有更多的功能,比如说,定义自己的函数是python编程的重要组成部分。
在本课中,我们将带你一起来将了解有关使用和定义函数的更多信息。
如何获得帮助?
相信你在上一个教程中看到了abs()函数,但是如果忘记了它的作用怎么办?
help()函数可能是最重要的,可以帮助你学习python函数。 如果你能记住如何使用help(),就掌握了理解大多数其他功能的关键。
这是一个例子:
help(round)
help()
显示两件事:
- 该函数的标题为
round(number [,ndigits])
。 在这种情况下,这告诉我们round()
接受一个我们可以描述为number的参数。 另外,我们可以选择给出一个可以描述为ndigits
的单独参数。 - 该函数的简要英文描述。
常见的陷阱:当我们查找函数时,记得传入函数本身的名称,而不是输入参数来调用该函数。
如果我们在调用函数abs()时调用帮助会发生什么? 点击运行下面单元格的输出以查看。
help(round(-2.01))
Python一般会从内到外评估表达式。
首先,它计算round(-2.01)的值,即-2,然后它提供对2这个整数的帮助。
(事实证明有很多关于整数的说法!在我们稍后讨论python中的对象,方法和属性之后,上面的大量帮助输出会更有意义。)
round是一个非常简单的函数,文档字符串很短。
在处理更复杂可配置的功能(如print())时,help()会显示更多参数的用法,让我们带来更多的帮助。
如果以下输出看起来繁琐晦涩,请不要担心...现在,只要看看你是否可以从这个帮助中学到任何新的东西。
help(print)
如果你正在寻找它,你可能会知道print可以采用一个名为sep的参数,并且它描述了我们在打印它时在所有其他参数之间放置的内容。我们将在本课的后面给出有关sep的例子。
定义函数
内置函数非常棒,但在我们需要开始定义自己的函数之前,我们只能使用python里面的它们。
下面是一个简单的例子。
def least_difference(a, b, c):
diff1 = abs(a - b)
diff2 = abs(b - c)
diff3 = abs(a - c)
return min(diff1, diff2, diff3)
这将创建一个名为least_difference的函数,该函数接受三个参数a,b和c。
函数以def关键字引入的标头开头。 调用函数时会运行以下代码后面的缩进代码块。
return是与函数唯一关联的另一个关键字。 当python遇到return语句时,它会立即退出函数,并将右侧的值传递出来,以便调用上下文。
是否清楚了代码中的least_difference()代表什么了吗?
如果我们不确定,我们总是可以尝试一些例子:
print(
least_difference(1, 10, 100),
least_difference(1, 10, 10),
least_difference(5, 6, 7)
)
或者也许help()函数可以告诉我们一些关于它的东西。
help(least_difference)
Python不够聪明,无法读取我的代码并将其转换为精美的英文描述。
但是,当我们编写一个函数时,我们可以提供一个名为docstring的描述,让python可以在调用help()这个函数时读取相应的帮助内容。
Docstrings
def least_difference(a, b, c):
"""Return the smallest difference between any two numbers
among a, b and c.
>>> least_difference(1, 5, -5)
4
"""
diff1 = abs(a - b)
diff2 = abs(b - c)
diff3 = abs(a - c)
return min(diff1, diff2, diff3)
docstring是一个三引号字符串(可能跨越多行),紧跟在函数头之后。 当我们在函数上调用help()时,docstring就是我们可以看到的解释。
help(least_difference)
备注:docstring的最后两行是示例函数调用和结果。
(>>>是对Python交互式shell中使用的命令提示符的引用。)Python不运行示例调用 - 它只是为了读者的方便。
在函数的文档字符串中包含一个或多个示例调用不常见,但它可以非常有效地帮助某人理解您的函数。有关实际示例,请参阅numpy函数np.eye的此docstring。
import numpy
help(numpy.eye)
优秀的程序员使用文档字符串,除非他们希望在使用后立即丢弃代码(这很少见)。 所以,以成为优秀的程序员为目标的你从今天开始也应该开始编写文档字符串。
没有return的函数
如果我们在函数中没有包含return关键字,会发生什么呢?
def least_difference(a, b, c):
"""Return the smallest difference between any two numbers
among a, b and c.
"""
diff1 = abs(a - b)
diff2 = abs(b - c)
diff3 = abs(a - c)
min(diff1, diff2, diff3)
print(
least_difference(1, 10, 100),
least_difference(1, 10, 10),
least_difference(5, 6, 7),
)
Python允许我们定义这样的函数。 调用它们的结果是特殊值None。 (这与其他语言中的“null”概念类似。)
没有return的语句,least_difference是完全没有意义的,它仅仅是一个带有副作用的函数可以在不返回任何内容的情况下做一些有用的事情。
我们已经看到了这样的例子:print()不返回任何有价值的内容。 我们只是将它们称为副作用,即在屏幕上放置一些无意义的文字。
mystery = print()
print(mystery)
默认参数
当我们调用help(print)时,我们看到print函数有几个可选参数。
例如,我们可以为sep指定一个值,在我们的打印参数之间放置一些特殊的字符串:
print(1, 2, 3, sep=' < ')
但是如果我们不为sep指定值,则将其视为具有默认值''(单个空格)。
print(1, 2, 3)
以下的函数,将Colin视为默认值;当你没有输入额外参数时,该函数返回默认参数,当你输入新的参数时,该函数返回新的参数。
def greet(who="Colin"):
print("Hello,", who)
greet()
greet(who="Kaggle")
# (In this case, we don't need to specify the name of the argument, because it's unambiguous.)
greet("world")
将函数当作参数
在函数里调用函数,这是强大的东西,虽然它起初可以感觉非常抽象,但是你可以将函数作为参数提供给其他函数。
一些例子可能会使这更清楚:
def mult_by_five(x):
return 5 * x
def call(fn, arg):
"""Call fn on arg"""
return fn(arg)
def squared_call(fn, arg):
"""Call fn on the result of calling fn on arg"""
return fn(fn(arg))
print(
call(mult_by_five, 1),
squared_call(mult_by_five, 1),
sep='\n', # '\n'是换行的符号,每个结果都新起一行
)
在其他函数上运行的函数称为“高阶函数”。 你可能暂时不会写一些自己的东西。 但是,python中内置了更高级的函数,我们会发现它们很有用。
这是一个使用max函数的有趣示例。
默认情况下,max返回其最大的参数。 但是如果我们使用可选的参数key传入一个函数,会出现什么结果呢?
def mod_5(x):
"""Return the remainder of x after dividing by 5"""
return x % 5
print(
'Which number is biggest?',
max(100, 51, 14),
'Which number is the biggest modulo 5?',
max(100, 51, 14, key=mod_5),
sep='\n', # '\n'是换行的符号,每个结果都新起一行
)
在上述的代码中,当我们给参数key传入一个求除以5后的余数值的函数,此时需要判断的条件是3个数字除以5后,哪个数字的余数最大?
经过简单的计算,我们可以知道100除以5的话没有余数,即为0,51除以5的余数为1,而14除以5的话余4,因为拥有最大的余数的数值是14,所以最后会返回14。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。