联想说 Python 基础 10 - 函数

函数

目标:理解函数,掌握函数的定义和调用。

对于初学者来说,函数在各个语言都算是理解起来相对较难的知识点了,而且它还很重要,所以这部分一定要掌握好。

函数?

我们的内容主打的就是一个 联系,将编程里面的东西和以前学过的东西联系起来,方便理解知识点。

回想数学中的函数

那说到函数,你能联系到什么?或者 想到什么?

其实函数并不是在编程中第一次见,在数学中早就有见到过它。可能有的小伙伴已经忘记了,没关系,我们看一个简单的例子应该就能挖出你相关记忆:

假设有一个函数 f(x),对于任何一个数 x,都可以通过以下公式计算出函数的值:

    f(x) = 2x + 1

这个函数的含义是,对于任何一个输入的数 x,函数会计算出 2x + 1 的值作为输出。例如,如果输入 x=3,则函数的值就为:

    f(3) = 2×3 + 1 = 7

同样地,如果输入 x=5,则函数的值为:

    f(5) = 2×5 + 1 = 11

函数在中小学数学中是非常重要的一个概念,它可以 描述一种输入和输出之间的相互关系

Python 中的函数

Python 中的函数和数学中的函数其实还挺像的,它也可以输入一个数,然后经过某个公式计算出结果。

不过在写法上与数学还是有一定的区别,Python 中的函数是这样写的:

def f(x):
    return 2 * x + 1

对比数学中的函数,区别在于一个格式和两个关键字。

  • def:表示定义(创建)一个函数

    defdefine 的缩写,翻译成中文是 定义 的意思。

  • return:翻译成中文意为 返回,在函数里的作用是结束函数并将 return 后面的值返回出去

    返回到哪(可以不看,后面再讲)?

    数学中不是这样写吗 f(x) = 2x + 1,现在给个具体的值 f(1) = 2x + 1,得到结果是 3。这个结果你怎么得到?或者怎么用?

    这部分是心算的,所以拿不到,要得到这个结果,我们可以定义一个变量接收:a = f(1),此时 a 的值就是函数的结果了。

    因为数学代入具体的值就可以得到结果,所以不用管。但是在 Python 中,函数是可以不给你结果的,如果你要给结果,就需要用 return 表示把结果给出去。

    再问 - 不返回结果要函数有何用?

    你看看 f(1) 的格式和什么比较像?print("HelloWorld")

    现在,它还有用吗。

    好像,超前了 囧。不管了,能理解就理解,不能理解再看后面。

函数语法

函数的定义

前面为了与数学联系起来,我们写了一个与它功能一致的函数。接下来我们需要看普遍一些的函数了,首先看定义语法

def 函数名称(参数名称1, 参数名称2......):
	pass
	return 返回值1,返回值2......

对照着上面的代码和这里的语法格式,我们可以知道几个数据的名词了:

  1. 参数函数名后面小括号里的 x

    参数可以有多个,多个之间用 “,” 隔开。

    参数对函数的意义非常大,它能让同一个函数产生不同的效果。

  2. 返回值:return 后面的值

    不管表达式是什么样的,它最终会得到具体的值,返回值就是这个值;

    返回值也可以有多个,多个之间用 “,” 隔开。

函数的调用

函数在定义好后,就像你打造了一个工具,工具有了你不用它,它就一直在那不会自己行动。

所以函数在定义好后,你想要让其生效,还需要用它。为了方便和好听,我们以后都称其为 调用

调用语法

函数名称(参数1, 参数2......)

这调用方式就和数学中一样一样的,调用了函数就相当于启动了函数的开关,它就开始执行了。

在调用函数的时候,如果定义函数时有定义参数,那么在调用的时候也需要传递参数。

定义也叫参数,调用也叫参数,为了区分它们,于是给这哥俩取了别名

  • 形参定义函数时,小括号里面的参数叫形参,也叫形式参数
  • 实参调用函数时,小括号里面的参数叫实参,也叫实际参数

为什么叫形式参数?

因为它只起到形式作用,它本身并没有值,只有实参传递了值,它才有值。

为什么叫实际参数?

因为实参它是有具体的值的,在函数内部使用的就是这个值,是实际起到作用的参数。

返回值

当你调用的函数是需要它给出结果的时候(比如爆米花机器,给了玉米,出来爆米花),就需要使用 return 把结果返回出来,返回出来的这些东西就叫 返回值

东西返回出来了,自然需要有东西把它们装起来,一般我们都是用变量来装,那么格式就会变成这样:

变量 = 函数名(参数...)

返回值的接收

返回值虽然简单,但是门道还不少,比如前面说它可以传递好几个返回值。怎么返回?像这样:

def getret():
       return 1, 2, 3

res = getret()
print(res)

当我们接收返回值的时候,得到的结果却是这样的:

(1, 2, 3)

这是一种特别的类型,后面再说。现在要说的是,我只需要其中的某一个或某几个返回值,该怎么接收?

如果碰到这样的需求,可以根据返回值返回的个数接收所有的值,不需要的值可以用 _ 接收。比如:

r1, _, r2 = getret()
print(r1)
print(r2)

有几个返回值不需要就用 _ 代替它就行。

其实这样接收后,_ 也是有值的,只是我们不用它,所以不用费脑子想名字。

见过的一些函数(内置)

看到这样的一些语法格式,总感觉非常熟悉,哪里见过呢?

print("转圈圈")

num1 = input("请输入你数字:")

这俩应该是比较熟悉的了吧,在很早之前就见过它们了。没错哈,以前说的 Python 给我们提供的一些功能,一般都是用函数来实现的(以后就叫它 内置函数 了)。这里的第一个明显就是存在参数,但是没有返回值的函数。第二个呢是既存在参数,也存在返回值。

除此之外还有 range、type 等等,在后面我们将学习更多的 Python 提供给我们使用的函数。

函数的运用

关于函数,大概也就这么多东西了,主要是你能理解这些东西都是干嘛的,你能把它用起来。

那,我们来用函数实现一个简单的计算器吧:

def calculator(num1, num2, operation):
    if operation == '+':
        return num1 + num2
    elif operation == '-':
        return num1 - num2
    elif operation == '*':
        return num1 * num2
    elif operation == '/':
        if num2 == 0:
            return "除数不能为 0 不知道啊!!"
        else:
            return num1 / num2
    else:
        return "这么高级的计算我哪会,下次不许用了 (¬д¬)"

result = calculator(3, 4, '*')
print(result)

这段代码定义了一个函数叫 calculator,它表示计算。这个函数需要三个参数,分别是 num1, num2, operation,表示两个计算的值和计算的方式。

在函数内部,使用 if 分支语句判断 operation 参数,来确定最终使用哪种方式计算,并使用 return 把计算的结果返回。

嗯,还有出现错误的判断,这里就不再一一说明了。

函数的骚操作

函数的骚操作就是函数的一些特殊用法,本身没有什么比较难理解的,所以这里主要演示并说明一下作用。

这里有必要说一下内置函数 print 了,之前我们只用了它的一小部分,它其实还能接收更多的参数来实现不同的功能。

比如:

print(1, 2, 3)
print(1, 2, 3, sep='-', end=' ')
print("再看效果")

上面代码运行的结果:

1 2 3
1-2-3 再看效果

前面说形参有几个,实参就要传几个,但是再看上面代码,个数随便改。

再来,调用 print 的时候,传递了 sep='-', end=' ',为什么之前不用传,传了有什么特别的?

默认参数

先来解决第二个问题(为什么?它简单)。

对比下面两个代码:

print(1, 2, 3)
print(4, 5, 6)
print(7, 8, 9)

# 结果
1 2 3
4 5 6
7 8 9

print(1, 2, 3)
print(4, 5, 6, sep='-', end=' ')
print(7, 8, 9)

# 结果
1 2 3
4-5-6 7 8 9

第一个的结果是我们预想中的, 而第二个则有两个变化:

  1. 4 5 6 =》4-5-6
  2. 456 换行 798 =》4-5-6 7 8 9 没换行

从参数和结果来看:

  • sep 就是用来设置 print 前面参数之间的连接方式的,如果不给就是空格(默认)。
  • end 一般表示结束,也就是换行那里的区别。就是说 print 输出的内容最后是接什么,默认是换行。

这样说来,我们什么都不给,也有值可以使用,这些值我们称为 默认值,而这些值在参数这里,则可以称为 默认参数

自己怎么定义带有默认参数的函数?

只用在需要设置默认值的参数后面用赋值的方式进行赋值就行,当有参数过来,这些值就会被覆盖:

def set_attribute(name, age=0, sex='yao'):
    print("你的姓名是:", name)
    print("你的年龄是:", age)
    print("你的性别是:", sex)

需要注意,默认值必须从最后向前定义,也就是说不能 age 有默认值,sex 却没有默认值。

调用的时候有什么注意事项?

调用的时候,默认参数可以不传实参。但是如果有多个默认参数,你只想给其中某一个(不确定位置)参数传参时,需要指定形参名称传递,例如:

set_attribute("kitty", sex='girl')

此时 age 使用的默认值 0,sex 则使用的是 girl。

可变参数

再看第一个问题 - 为什么可以传递任意个数的参数?

这个一般也不怎么用,看看就行。

这是 Python 提供的一个特殊功能,所以需要用特殊的方式提供这个参数。这个参数的格式是:*参数名称

试一试:

def set_attribute(*cs):
    print(cs)

set_attribute(1, 2, 3, 4, 5, 6)

我只定义了一个形参,却传递了 6 个实参,结果不报错。以后想要定义一个可以接收任意个数参数的形参时,就用 *参数名 的格式。

除了这种格式之外,还有另外一种格式也支持接收任意个数的实参:**参数名称

试一试:

def set_attribute(**cs):
    print(cs)

set_attribute(name='alice', age=0, sex='yao')

使用这种方式定义的时候,需要注意实参要以 任意名字=值 的方式传递,否则接收不到(这里并不是变量赋值,但是你觉得这样好理解的话,也可以)。

这两种方式,在 Python 中都有推荐的参数名称,第一种推荐名称为 *args,第二种推荐名称为 **kwargs,这样做的目的是见名知意。

关于函数就这么多了,既然已经学习了函数,后面将会大肆的使用一些内置函数,所以要好好理解一下函数。

posted @ 2023-10-06 22:27  笔锋微凉~~  阅读(15)  评论(0)    收藏  举报