练习 18 名称,变量,代码,函数

这是一个很大的标题。接下来我要给你介绍一下函数。每一个程序员都要一遍一遍地用到函数,思考它们的作用以及如何使用它们,但是我会给你一些最简单的解释,让你能够快速上手。

函数一般就是做以下这些事情:

  • 它们为一些代码起名字,就像变量为字符串和数字起名字一样。
  • 它们像脚本获取 argv 一样获取参数(arguments)。
  • 通过 1 和 2 的操作,让你做一些你自己的“小脚本”或者“微命令”。你可以通过在 Python 中使用 def 来创建一个函数。我会让你创建 4 个不同的函数,它们就像你的脚本一样运行,之后我还会想你展示每一个之间是如何关联的。

ex18.py

    1. 1 # this one is like your scripts with argv
    2. 2 def print_two(*args):
    3. 3 arg1, arg2 = args
    4. 4 print(f"arg1: {arg1}, arg2: {arg2}")
    5. 5
    6. 6 # ok, that *args is actually pointless, we can just do this
    7. 7 def print_two_again(arg1, arg2):
    8. 8 print(f"arg1: {arg1}, arg2: {arg2}")
    9. 9
    10. 10 # this just takes one argument
    11. 11 def print_one(arg1):
    12. 12 print(f"arg1: {arg1}")
    13. 13
    14. 14 # this one takes no arguments
    15. 15 def print_none():
    16. 16 print("I got nothin'.")
    17. 17
    18. 18
    19. 19 print_two("Zed","Shaw")
    20. 20 print_two_again("Zed","Shaw")
    21. 21 print_one("First!")
    22. 22 print_none()

让我们把第一个函数拆解一下,print_two 这是你从创建脚本中已经学到的最熟悉的东西:

  • 首先,我们告诉 Python 我们想要用 def (即 define)来创建一个函数。
  • def 的同一行我们给了函数一个名字,本例中是 print_two,但是你也可以起名叫“peanuts”(花生),名字没关系,不过最好简短一些,并且能够说明这个函数的作用。
  • 然后我们告诉它我们想要 *args ,它很像参数 args ,只不过是为函数设的,必须放在括号里面才能工作。
  • 然后我们以 : 结束这一行,另起一行开始缩进。
  • : 之后缩进四个空格的所有行都是关于 print_two 这个函数名的。我们第一个缩进的行就是用来解包这个参数(argument),跟之前的脚本一样。
  • 要表明它是如何工作的,我们把这些参数打印了出来,就像我们在脚本中所做的一样。print_two 的问题是它不是创建一个函数最简单的方法。在 python 里面,我们可以跳过整个解包参数的过程,只用我们需要的 () 里面的名字即可,这也正是 print_two_again 所做的事情。

之后我们用一个参数创建了 print_one 这个函数。

最后我们创建了一个没有参数的函数 print_none

警告!
这很重要。如果你现在不太明白,别急着灰心,我们会再做几个跟函数相关的练习来进一步学习。现在当我说“函数”的时候,你就把它想象成一个“迷你脚本”,跟着做就行了。

你会看到

如果你运行了 ex18.py,你会看到:

练习 18 会话

  1. $ python3.6 ex18.py
  2. arg1: Zed, arg2: Shaw
  3. arg1: Zed, arg2: Shaw
  4. arg1: First!
  5. I got nothin'.

现在你已经看到了函数是如何工作的。注意你使用函数的方式就像你使用 exists、open 等其他一些“命令”一样。其实我一直在跟你卖关子,因为在 python 里面,这些“命令”就是“函数”(学习癌注:哈哈哈哈哈老肖太坏了)。这意味着你可以创建你自己的命令然后在你的脚本中使用。

附加练习

创建一个如下的函数 checklist (核查表)用于后面的练习。把这些内容写在索引卡上,一直保留到你完成所有剩余练习的时候或者当你感觉你不再需要这些索引卡的时候:

  • 你是否用 def 来创建函数了?
  • 你的函数名是只包含字符和 _ (下划线)吗?
  • 你在函数名后面放 ( (左圆括号)了吗?
  • 你在左圆括号后面放参数(argument)了吗?参数之间是以逗号隔开的吗?)
  • 你的每个参数都是唯一的吗(即没有重名)?
  • 你在参数后面放 ) (右圆括号)和 : (冒号)了吗?
  • 你在与这个函数相关的代码行前面加上四个空格的缩进了吗?(不能多,也不能少)
  • 你是通过另起一行不缩进来结束你的函数的吗?当你运行(使用或者调用)一个函数时,检查以下事项:

  • 你是通过输入函数名称来运行/调用/使用一个函数的吗?

  • 你运行的时候有在名称后面加 ( 吗?
  • 你有把你想要的值放在圆括号里并用逗号隔开了吗?
  • 你是以 ) 来结束调用这个函数的吗?在接下来的课程中用这两个 checklist ,直到你不再需要它们为止。

最后,再强调以下,我说的“运行”(run)、“调用”(call)、“使用”(use)都是一个意思。

常见问题

函数名称有哪些要求?跟变量名一样,任何不以数字开头的字母、数字、下划线组合都可以。

args 中的 是什么作用?这是告诉 Python 取所有的参数给函数,然后把它们放在 args 里放成一列,很像你之前学的 argv ,只不过这个是为函数设置的。这种不常用,除非有特殊需要。

这部分好无聊好烦人啊。这就对了,这说明你已经开始一边输入代码一边思考它的作用了。如果想让它不这么无聊,按照我的要求一字不差地输入进去,然后再故意打乱它们,看看你能不能修复好。