>>> from env_helper import info; info()
页面更新时间: 2024-01-14 09:35:32
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-16-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

3.1. 函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

从前面的章节中,你已经熟悉了 print()input()len() 函数。 Python 提供了这样一些内建函数,但你也可以编写自己的函数。 “函数”就像一个程序内的小程序。

为了更好地理解函数的工作原理,让我们来创建一个函数 :

>>> def hello():
>>>     print('-' * 4)
>>>     print('Howdy!')
>>>     print('Howdy!!!')
>>>     print('Hello there.')
>>>     print('\n')

第一行是 def 语句 ,它定义了一个名为 hello() 的函数。 def 语句之后的代码块是函数体 。 这段代码在函数调用时执行,而不是在函数第一次定义时执行。

>>> hello()
>>> hello()
>>> hello()
----
Howdy!
Howdy!!!
Hello there.


----
Howdy!
Howdy!!!
Hello there.


----
Howdy!
Howdy!!!
Hello there.

函数之后的 heIlo() 语句行是函数调用。 在代码中,函数调用就是函数名后跟上括号,也许在括号之间有一些参数。 如果程序执行遇到这些调用,就会跳到函数的第一行,开始执行那里的代码。 如果执行到达函数的末尾,就回到调用函数的那行,继续像以前一样向下执行代码。

因为这个程序调用了3次 hello() 函数,所以函数中的代码就执行了3次。

3.1.1. 定义一个函数

你可以定义一个由自己想要功能的函数,以下是简单的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()

  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。

  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。

  • 函数内容以冒号起始,并且缩进。

  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的 return 相当于返回 None

函数的一个主要目的就是将需要多次执行的代码放在一起。 如果没有函数定义,你可能每次都需要复制粘贴这些代码, 程序看起来可能会像这样:

>>> print('Howdy!')
>>> print('Howdy!!!')
>>> print('Hello there.')
>>> print('Howdy!')
>>> print('Howdy!!!')
>>> print('Hello there.')
>>> print('Howdy!')
>>> print('Howdy!!!')
>>> print('Hello there.')
Howdy!
Howdy!!!
Hello there.
Howdy!
Howdy!!!
Hello there.
Howdy!
Howdy!!!
Hello there.

一般来说,我们总是希望避免复制代码, 因为如果一旦决定要更新代码(比如说,发现了一个缺陷要修复), 就必须记住要修改所有复制的代码。

随着你获得更多的编程经验, 常常会发现自己在为代码“消除重复”, 即去除一些重复或复制的代码。 消除重复能够使程序更短、更易读、更容易更新。

3.1.2. 语句和参数

如果调用 print()len() 函数,你会传入一些值, 放在括号之间,在这里称为“参数”。也可以自己定义接收参数的函数。

>>> def hello(name):
>>>     print('Hello '+ name)

如果运行这个程序,输出看起来像这样:

>>> hello('Alice')
>>> hello('Bob')
Hello Alice
Hello Bob

在这个程序的 hello() 函数定义中, 有一个名为 name 的变量 。 “变元”是一个变量,当函数被调用时, 参数就存放在其中。 hello() 函数第一次被调用时, 使用的参数是 'Alice' 。程序执行进入该函数, 变量 name 自动设为 'Alice' , 就是被 print() 语句打印出的内容。

关于变元有一件特殊的事情值得注意:保存在变元中的值, 在函数返回后就丢失了。例如前面的程序, 如果你在 hello('Bob') 之后添加 print(name) , 程序会报 NameError ,因为没有名为 name 的变量。 在函数调用 hello(Bob)返回后,这个变量被销毁了,所以 print(name) 会引用一个不存在的变量 name

这类似于程序结束时,程序中的变量会丢弃。 在本章稍后,当我们探讨函数的局部作用域时,我会进一步分析为什么会这样。

3.1.3. 函数调用

定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。

>>> def printme( str ):
>>>     '''
>>>     打印任何传入的字符串
>>>     '''
>>>     print (str)
>>>     return

如下实例调用了 printme() 函数:

>>> printme("我要调用用户自定义函数!")
我要调用用户自定义函数!
>>> printme("再次调用同一函数")
再次调用同一函数