作者 | Aditya Kousik Cotra
译者 | IT外文选刊是时候编写结构合理的程序了。
函数是复用程序代码的有效方法。使用函数的好处是可以节省空间,而且我们选择的名称也使我们的程序易于阅读。函数可以在没有输入的情况下定义函数,也不一定要产生输出。
Python中内置的函数有很多,我们也可以自己创建函数。
在Python中,函数是用def关键字来定义的。
>>> def myfunc():
print("Python functions are easy to learn.")
>>> myfunc() #calling function
'Python functions are easy to learn.'
函数主要是帮助你结构化你的程序。最好是把长程序分解成函数,每个函数都有自己的目的,使其结构透明化,就像这样:
data = extract_data(source)
results = analyze(data)
present(results)
适当地使用函数,使程序的可读性和可维护性更强。此外,在对一个函数进行修改的时候,不用担心程序的其他部分,也更容易进行修改。
在这篇文章中,我们将讨论五个话题,我认为了解函数是很重要的。这些话题将帮助你更好地理解函数。
1. 变量的作用域
函数定义为变量创建新的局部作用域。当在函数体内部分配一个新变量时,该变量只在函数内部定义。变量在函数外部是不可见的。因此,我们在定义变量时可以选择任意名称,而不需要关注函数外部的变量。
举例来说:
>>> x = 10
>>> def myfunc():
x = 5
在上述函数中,变量x在函数外赋值为10,在函数内赋值为5。现在,当我们在函数外把x打印时:
>>> x
10
变量x在函数外部不会发生变化,因为在函数内部定义的x的范围只限于函数本身。
2. 参数的类型
参数,是用来向函数传递信息的。有两种类型的参数:关键字参数:在函数调用中以标识符(key1 = value1 )为前缀的参数,或者在字典中以**为前缀的值传递。
ratio(numerator=10, denominator=4)
ratio(**{'numerator':10,'denominator':4})位置参数:非关键字参数的参数。这个值被直接传递到函数中,其位置代表函数中的一个变量。它也可以作为一个以*为前缀的迭代元素传递。
ratio(10,4)
ratio(*(10,4))
3. 函数可作为参数
有趣的是,我们还可以将函数作为参数传递给函数。例如,我们可以将内置函数 len() 或用户定义的函数 vowel_present() 作为参数传递给另一个函数:
>>> sent = ['Python', 'functions', 'are', 'amazing']
>>> def execute_func(prop):
return [prop(word) for word in sent]
>>> execute_func(len)
[6, 9, 3, 7]
>>> def vowel_present(word):
... for x in word:
if x in 'aeiou':
return True
return False
>>> execute_func(vowel_present)
[True, True, True, True]
4. 参数类型检查
Python函数不要求我们指定输入参数的类型。所以在执行函数之前,有必要检查一下输入变量的类型。
def is_vowel(char): #Returns True if char is vowel, False otherwise.
if char in 'aeiou':
return True
else:
return False
>>> is_vowel(5)
False
例如,在上面的函数中,没有指定数字的数据类型,但我们希望变量的类型为长度为1的str类型。但是,如果我们传递一个整数变量,函数执行时返回False。
为了避免执行和报错,我们可以使用这样的assert函数。
def is_vowel(char):
assert(isinstance(char, str)) #raises error if not satisfied
assert(len(char)==1) #raises error if string not of length 1
if char in 'aeiou':
return True
else:
return False
如果assert语句失败,会产生一个错误,函数停止执行。
5. 函数文档
好的做法是给函数加文档,描述它的目的,并使用函数定义顶部的docstring来提供文档,就像这样:
def is_vowel(char):
'''Takes a string input of length one and returns True if vowel, False otherwise'''
assert(isinstance(char, str))
assert(len(char)==1)
if char in 'aeiou':
return True
else:
return False
任何函数的Docstrings都可以通过运行帮助函数找到。它也可以使用属性__doc__来检索。
>>> help(is_vowel)
Help on function is_vowel in module __main__:
is_vowel(char)
Takes a string input of length one and returns True if vowel, False otherwise
>>> is_vowel.__doc__
'Takes a string input of length one and returns True if vowel, False otherwise'
你可以试着运行help(xxx)来获取xxx库的docstring。
在这篇文章中,我们主要讨论了函数的应用以及它们如何帮助构建结构化的程序。在后续文章中,我们将讨论Python模块以及它们是如何帮助程序高效运行的。
外文链接:https://medium.com/@cotra.ak/5-things-to-know-about-python-functions-52565919d748medium.com
版权声明:
本译文仅用于学习、研究和交流目的,欢迎非商业转载。转载请注明出处、译者和IT外文选刊的完整链接。
更多优质IT外文在“IT外文选刊”(公众号)