函数是编程中应用非常多的一类对象(请注意这里的宾语“对象”,在本章7.3节会专门探讨)。此前我们已经多次使用过 Python 的内置函数,现在要自己亲自动手编写更有个性的函数。这是一件很有意思的事情,也伴随着一定的挑战。相信已经自学至此的读者能够攻克本章所遇到的难关。
不论 Python 的内置函数还是模块中提供的函数(比如 math.pow()
),都是“别人”创造的,我们施行“拿来主义”,只是应用。但是,当“别人”定义的函数不能满足自己的需要时,就要“自力更生”,自己定义函数了。
如图7-1-1所示,是自定义函数的基本格式。
图7-1-1 定义函数
按照此格式,写一个非常简单的函数(在 Python 交互模式中):
>>> def my_fun(): # (1)
... print("this is a function")
...
>>> my_fun()
this is a function
注释(1)定义了一个名为 my_fun
的函数,此函数的功能非常简单,就是打印一行字符串。接下来的 my_fun()
是执行或者调用此函数,在 Python 交互模式中就显示了打印的结果。
有了初步体验之后,再对图7-1-1所示的定义函数的格式给予说明:
def
是定义函数的关键词(英文 define 的前三个字母)。当 Python 解释器看到了这个关键词,就知道此处开始定义函数了。function_name
是函数的名称。按照 PEP 的要求,函数名称的命名方式与变量的命名方式和格式一样(参阅第2章2.3.2节)。([parameters])
,函数名称和圆括号之间不能有空格,圆括号也不能省略。圆括号里面是这个函数的参数列表,如果此函数不需要参数,则可为空。例如注释(1)中定义的函数,就只有圆括号,其内部没有参数。注释(1)所定义的函数的语句块只有一条语句,下面再定义一个有多条语句的函数。
#coding:utf-8
"""
filename: myadd.py
"""
def add(x, y):
'''
This is an addition function.
add(3, 4) -> 7
'''
r = x + y
return float(r)
对照图7-1-1所示的函数定义形式,这里定义的函数 add()
符合该形式要求,若与注释(1)所定义的函数相比,不仅语句块中的逻辑行数量多了,还增加了“函数文档”
.py
程序文件开头的文档。add()
的语句块中有两个语句,其中 return float(r)
称为 return 语句。return
是 Python 的关键词,它的作用是返回其后面的表达式的值到函数调用的位置。有的函数没有显示地写出 renturn 语句,Python 解释器会默认为 return None
。例如前面编写的函数 my_func()
:>>> r = my_fun()
this is a function
>>> print(r)
None
注意,不要误认为 my_fun()
函数返回的是 this is a function
,这个字符串是 print()
的执行结果,不是 my_fun()
的返回值。上述代码已经显示,my_fun()
的返回值是 None
。
继续编写 myadd.py
程序,在前述函数的后面,编写如下代码:
if __name__ == "__main__": # (2)
sum = add(2, 4) # (3)
print(sum)
注释(2)的内容姑且照抄(注意,__name__
和 __main__
中的下划线都是各侧有两个),在第11章11.1节中会给予解释。注释(3)中以 add(2, 4)
的方式调用所定义的函数,并且函数的返回值被变量 sum
引用。执行程序,结果如下:
% python myadd.py
6.0
初步了解了定义函数的基本格式之后,要想能熟练地写出自己所需要的函数,唯有多练习。
下面编写一个函数,实现字符串中字母大小写转化,即将某字符串中的大写字母,转化为小写字母;原来的小写字母则转化为大写字母。例如字符串 'Python'
,经此函数后转化为 'pYTHON'
。
请读者先按照要求自己尝试编写并调试,再参考下面的示例。
#coding:utf-8
'''
filename: convertletter.py
'''
def convert(s):
"""
convert upper and lower in a string.
convert(string) -> string
"""
lst = [e.upper() if e.islower() else e.lower() for e in s]
return "".join(lst)
if __name__=="__main__":
word = "Python"
new_word = convert(word)
print(f"{word} --> {new_word}")
程序执行效果:
% python convertletter.py
Python --> pYTHON
当然,上述函数并非是实现需求的最佳选择,如果使用位运算(本书略去此内容,有兴趣的读者可以深入研究),会得到一个有点魔幻的函数:
>>> def toggle(s):
... return ''.join(chr(ord(c) ^ 32) for c in s)
...
>>> toggle("Python")
'pYTHON'
此处并不要求读者理解上述函数,只是想传达一个信息:本书中的代码,不是最优,希望读者能在学习过程中,探索优化方法——“尽信书,不如无书”(《孟子》)