跳转到内容

Python 初学者教程/函数

来自维基教科书,开放的书籍,为开放的世界

在我们之前的课程中,我说过我们会深入研究有目的的编程。这涉及用户输入,用户输入需要一个叫做函数的东西。

什么是函数?实际上,函数是执行特定任务的小型独立程序,你可以将它们合并到自己的大型程序中。创建函数后,你可以随时随地使用它。这样可以节省你每次执行常见任务时不得不重复告诉计算机该做什么的时间和精力,例如让用户输入一些内容。

使用函数

[编辑 | 编辑源代码]

Python 有很多预制函数。你现在就可以使用这些预制函数,只需“调用”它们。“调用”函数是指你向函数提供输入,它会返回一个值(就像变量一样)作为输出。不理解?以下是调用函数的一般形式

代码示例 1 - 如何调用函数
function_name(parameters)

看到了吗?很简单。

function_name 指示你想使用的函数(你应该知道......)。例如,函数 raw_input(此函数在 Python 3 中已重命名为 input),将是我们使用的第一个函数。参数是你传递给函数的值,告诉它应该做什么,以及如何做。例如,如果一个函数将任何给定的数字乘以 5,参数中的内容告诉函数应该将哪个数字乘以 5。将数字 70 放入参数中,函数将执行 70×5。

参数和返回值 - 与函数通信

[编辑 | 编辑源代码]

好吧,程序可以将一个数字乘以 5,但这有什么意义呢?一种温暖模糊的感觉?你的程序需要看到发生的事情的结果,看看 70 x 5 是多少,或者看看是否哪里出了问题(比如你给了它一个字母而不是数字)。那么函数如何显示它做了什么呢?

实际上,当计算机运行一个函数时,它实际上看不到函数名,而是看到函数执行的结果。变量做的事情完全一样 - 计算机看不到变量名,而是看到变量中存储的值。让我们把这个将任何数字乘以 5 的程序称为 multiply()。你将想要乘以的数字放在括号中。所以如果你输入了这个

代码示例 2 - 使用函数
a = multiply(70)

计算机实际上会看到这个

代码示例 3 - 计算机看到的
a = 350

注意:不要尝试输入此代码 - multiply() 不是一个真实函数,除非你创建它。

函数运行自身,然后根据它接收的参数返回一个数字给主程序。

现在让我们用一个真实的函数试试,看看它做了什么。这个函数叫做 input,它会提示用户输入一些内容。然后它将输入的内容转换为文本字符串。尝试以下代码

代码示例 4 - 使用 input
# this line makes 'a' equal to whatever you type in, change "raw_input" to "input" for python 3.0
a = raw_input("Type in something, and it will be repeated on screen:")
# this line prints what 'a' is now worth
print(a)

假设在上面的程序中,你输入了“hello”当它提示你输入一些内容时。对于计算机来说,这个程序看起来像这样

代码示例 5 - 计算机看到的
a = "hello"
print("hello")

记住,变量只是一个存储的值。对于计算机来说,变量“a”不像“a”那样看起来 - 它看起来像存储在它里面的值。函数类似 - 对于主程序(即运行函数的程序)来说,它们看起来像它们运行时返回的值。

计算器程序

[编辑 | 编辑源代码]

让我们写另一个程序,它将充当计算器。这次它将执行比我们之前更冒险的事情。将会有一个菜单询问你是否要将两个数字相乘、将两个数字相加、将一个数字除以另一个数字,或者从一个数字中减去另一个数字。唯一的问题是raw_input函数将你输入的内容作为字符串返回,而我们想要数字 1,而不是字母 1(是的,在 Python 中,两者是有区别的)。

幸运的是,有人写了函数input(在 Python 3 中为 eval(input())),它将你输入的内容作为数字返回给主程序 - 但关键的是,作为数字,而不是字母。如果你输入一个整数(一个整数),从 input 中返回的值就是一个整数。如果你将这个整数放入一个变量中,该变量将成为一个整数类型的变量,这意味着你可以在它上面执行加法、减法和其他数学运算。

现在,让我们适当地设计这个计算器。我们想要一个每次完成加法、减法等操作后都会返回的菜单。换句话说,要循环(提示!!!)while(大提示!!!)你告诉程序应该继续运行。

我们希望它执行与你输入的数字相关的菜单选项。这意味着你需要输入一个数字(即输入)和一个if循环。

让我们先用通俗易懂的英语把它写出来

代码示例 6 - 人类语言示例
START PROGRAM
print opening message

while we let the program run, do this:
    #Print what options you have
    print Option 1 - add
    print Option 2 - subtract
    print Option 3 - multiply
    print Option 4 - divide
    print Option 5 - quit program
    
    ask the person what option they want and look for an integer
    if it is option 1:
        ask for first number
        ask for second number
        add them together
        display the result on screen
    if it is option 2:
        ask for first number
        ask for second number
        subtract one from the other
        display the result on screen
    if it is option 3:
        ask for first number
        ask for second number
        multiply them
        display the result on screen
    if it is option 4:
        ask for first number
        ask for second number
        divide the first by the second
        display the result on screen
    if it is option 5:
        tell the loop to stop
Display a goodbye message on screen
END PROGRAM

让我们把它转换成 Python 能够理解的语言

代码示例 7 - 菜单的 Python 版本
#calculator program

#This variable tells the loop whether it should loop or not.
# 1 means loop. Anything else means don't loop.

loop = 1

#this variable holds the user's choice in the menu:

choice = 0

while loop == 1:
    #Display the available options
    print ("Welcome to calculator.py")

    print ("your options are:")
    print (" ")
    print ("1) Addition")
    print ("2) Subtraction")

    print ("3) Multiplication")

    print ("4) Division")
    print ("5) Quit calculator.py")
    print (" ")

    choice = int(input("Choose your option: "))
    if choice == 1:
        add1 = int(input("Add this: "))
        add2 = int(input("to this: "))
        print (add1, "+", add2, "=", add1 + add2)
    elif choice == 2:
        sub2 = int(input("Subtract this: "))
        sub1 = int(input("from this: "))
        print (sub1, "-", sub2, "=", sub1 - sub2)
    elif choice == 3:
        mul1 = int(input("Multiply this: "))
        mul2 = int(input("with this: "))
        print (mul1, "*", mul2, "=", mul1 * mul2)
    elif choice == 4:
        div1 = int(input("Divide this: "))
        div2 = int(input("by this: "))
        print (div1, "/", div2, "=", div1 / div2)
    elif choice == 5:
        loop = 0
	
print("Thank you for using calculator.py!")

哇!这是一个令人印象深刻的程序!把它粘贴到 Python IDLE 中,保存为“calculator.py”并运行它。试着玩玩 - 尝试所有选项,输入整数(没有小数点的数字),以及小数点后面的数字(在编程中称为浮点数)。尝试输入文本,看看程序如何出现轻微错误并停止运行(这可以通过错误处理来解决,我们将在后面讨论)。

定义自己的函数

[编辑 | 编辑源代码]

好吧,使用别人的函数固然很好,但是如果你想编写自己的函数来节省时间,或者可能在其他程序中使用它们呢?这就是“def”运算符发挥作用的地方。(运算符只是告诉 python 该做什么,例如“+”运算符告诉 python 进行加法,“if”运算符告诉 python 如果满足条件就执行某些操作。)

这就是“def”运算符的工作方式

代码示例 8 - def 运算符
def function_name(parameter_1, parameter_2):
    {this is the code in the function}
    {more code}
    {more code}
    return {value to return to the main program}
{this code isn't in the function}
{because it isn't indented}
#remember to put a colon ":" at the end
#of the line that starts with 'def'

function_name 是函数的名称。你将函数中的代码写在该行下方,并缩进。(我们稍后再考虑 parameter_1 和 parameter_2,现在想象在括号之间什么都没有。

函数完全独立于主程序运行。记住我说过当计算机遇到一个函数时,它看不到函数,而是看到一个值,即函数返回的值?以下是这句话

"对于计算机来说,变量“a”不像“a”那样看起来 - 它看起来像存储在它里面的值。函数类似 - 对于主程序(即运行函数的程序)来说,它们看起来像它们运行时返回的值."

函数就像一个小型程序,一些参数被传递给它 - 然后它运行自身,然后返回一个值。你的主程序只看到返回的值。如果该函数飞往月球并返回,然后最后有

代码示例 9 - return
return "Hello"

那么你的程序只会看到字符串“hello”,在那里函数的名称。它不知道程序还做了什么。

因为它是独立的程序,函数看不到主程序中的任何变量,而主程序也看不到函数中的任何变量。例如,以下是一个函数,它在屏幕上打印单词“hello”,然后将数字“1234”返回给主程序

代码示例 10 - 使用 return
# Below is the function
def hello():
    print ("hello")
    return 1234

# And here is the function being used
>>>hello()

想想上面代码的最后一行。它做了什么?在程序中输入(可以跳过注释),看看它做了什么。输出看起来像这样

代码示例 11 - 输出
hello
1234

那么发生了什么?

当运行 'def hello()' 时,创建了一个名为 'hello' 的函数。当运行 'hello()' 时,函数 'hello' 被执行(运行其中的代码)。函数 'hello' 在屏幕上打印 "hello",然后将数字 '1234' 返回到主程序。现在主程序将该行视为 'print 1234',因此打印了 '1234'。这解释了发生的一切。记住,主程序不知道屏幕上打印了 "hello"。它只看到了 '1234',并打印在屏幕上。

向函数传递参数

[编辑 | 编辑源代码]

在这一堂(超大)课中,我们还有最后一件事要讲 - 向函数传递参数。回忆一下我们如何定义函数

代码示例 12 - 用参数定义函数
def function_name(parameter_1,parameter_2):
    {this is the code in the function}
    {more code}
    {more code}
    return {value (e.g. text or number) to return to the main program}

在 (圆括号) 中,parameter_1 和 parameter_2 的位置,你输入要将参数放入的变量名。输入需要的任何数量,只要用逗号隔开。运行函数时,在圆括号中输入的第一个值将放入 parameter_1 所在的变量中。第二个值(第一个逗号之后)将放入 parameter_2 所在的变量中。对于函数中存在的任何参数,这将继续下去(从零到无限)。例如

代码示例 13 - 参数的工作原理
def funny_function(first_word, second_word, third_word):
    print "The word created is: " + first_word + second_word + third_word
    return first_word + second_word + third_word

运行上面的函数时,你可以输入类似这样的内容:funny_function("meat", "eater", "man")。第一个值(即 "meat")将放入名为 first_word 的变量中。方括号中的第二个值(即 "eater")将放入名为 second_word 的变量中,依此类推。这就是从主程序向函数传递值的方式 - 在圆括号内,在函数名称之后。

最终程序

[编辑 | 编辑源代码]

回忆一下那个计算器程序。你认为它看起来有点乱吗?我认为是的,所以让我们用函数重写它。

设计 - 首先,我们将用 'def' 运算符定义所有将要使用的函数(还记得运算符是什么吗?)。然后我们将使用主程序,用整洁的函数替换所有乱糟糟的代码。这样,在未来再次查看时,它会更容易理解。

代码示例 14 - 计算器程序
# calculator program

# NO CODE IS REALLY RUN HERE, IT IS ONLY TELLING US WHAT WE WILL DO LATER
# Here we will define our functions
# this prints the main menu, and prompts for a choice
def menu():
    #print what options you have)
    print ("Welcome to calculator.py")
    print ("your options are:")
    print (" ")
    print ("1) Addition")
    print ("2) Subtraction")
    print ("3) Multiplication")
    print ("4) Division")
    print ("5) Quit calculator.py")
    print (" ")
    return int(input ("Choose your option: "))
    
# this adds two numbers given
def add(a,b):
    print (a, "+", b, "=", a + b)
    
# this subtracts two numbers given
def sub(a,b):
    print (b, "-", a, "=", b - a)
    
# this multiplies two numbers given
def mul(a,b):
    print (a, "*", b, "=", a * b)
    
# this divides two numbers given
def div(a,b):
    print (a, "/", b, "=", a / b)
    
# NOW THE PROGRAM REALLY STARTS, AS CODE IS RUN
loop = 1
choice = 0
while loop == 1:
    choice = menu()
    if choice == 1:
        add(int(input("Add this: ")),int(input("to this: ")))
    elif choice == 2:
        sub(int(input("Subtract this: ")),int(input("from this: ")))
    elif choice == 3:
        mul(int(input("Multiply this: ")),int(input("by this: ")))
    elif choice == 4:
        div(int(input("Divide this: ")),int(input("by this: ")))
    elif choice == 5:
        loop = 0

print ("Thank you for using calculator.py!")

# NOW THE PROGRAM REALLY FINISHES

初始程序有 34 行代码。新程序实际上有 35 行代码!它稍微长一点,但如果你以正确的方式看待它,它实际上更简单。

你将所有函数都定义在顶部。这实际上不属于你的主程序 - 它们只是许多小程序,你将在以后调用它们。如果你需要它们,甚至可以在另一个程序中重用它们,而且不需要再告诉计算机如何加减。

如果你看一下程序的主要部分(在 'loop = 1' 和 'print "Thank you for..."' 行之间),它只有 15 行代码。这意味着如果你想用不同的方式编写这个程序,你只需要编写大约 15 行代码,而不是没有函数时通常需要编写的 34 行代码。

传递参数的复杂方法

[编辑 | 编辑源代码]

最后,作为一段插曲,我将解释 add(input("Add this: "), input("to this: ")) 这行代码的含义。

我想将所有内容都放在一行上,并尽可能少用变量。还记得函数对主程序看起来像什么吗?它们返回的值。如果传递给 add() 函数的数字是 2 和 30,那么主程序将看到以下内容

代码示例 15 - 复杂参数工作的结果
        add(2, 30)

然后 add 程序将运行,将 2 和 30 相加,然后打印结果。add 程序没有 'return' 运算符 - 它不会向主程序返回任何内容。它只是将两个数字相加并打印在屏幕上,主程序看不到任何内容。

你可以用变量替换 (input("Add this: "), input("to this: ")) 作为 add 程序的参数。例如,

代码示例 16 - 变量作为参数
num1 = 45
num2 = 7
add(num1, num2)

对于上面的情况,请记住,你正在向其传递变量的函数无法更改变量本身 - 它们只是用作值。你甚至可以将值直接放入函数中

代码示例 17 - 最终结果
add(45, 7)

这是因为函数看到的只有作为参数传递的值。这些值将放入定义 'add' 时提到的变量中('def add(a,b)' 行)。然后,函数使用这些参数来完成其工作。

简而言之

  • 函数只能从主程序中看到传递给它的参数
  • 主程序只能从函数中看到它传递回来的返回值
华夏公益教科书