Python教学:7.函数

文章目录

  • [1.1 使用函数的意义](#1.1 使用函数的意义)
  • [1.2 函数的定义](#1.2 函数的定义)
  • [1.3 函数的参数](#1.3 函数的参数)
    • [1.3.1 普通的参数](#1.3.1 普通的参数)
    • [1.3.2 特殊的参数](#1.3.2 特殊的参数)
    • [1.3.3 二者结合](#1.3.3 二者结合)
  • [1.4 传参方式](#1.4 传参方式)
    • [1.4.1 位置传参](#1.4.1 位置传参)
    • [1.4.2 关键字传参](#1.4.2 关键字传参)
  • [1.5 返回](#1.5 返回)

为什么会有人问我函数怎么定义呢?气死我了,这都不会,气得我直接
开课!

1.1 使用函数的意义

首先,肯定会有人问为什么要使用函数。

在编程的时候,经常会遇到需要判断的情况,简单的条件判断还好说,但是,如果要判断一整个列表中的元素是否都为偶数时,这就难办了。这时,我们就可以使用函数,函数里面用一个循环,遍历这个列表,如果列表中有一个是奇数,那么就返回False,如果都遍历完了,还是没有奇数,很容易就能得出这个列表里面都是偶数,所以直接返回True就可以了!

1.2 函数的定义

定义函数的语法如下:

复制代码
def 函数名(参数):
	...

其中,函数名的命名规则和变量一样,不能以数字开头。然后,参数是可选的,而且 。

接下来讲讲------

1.3 函数的参数

1.3.1 普通的参数

首先,讲讲定义函数时的参数。

比如这样一个函数吧:

python 复制代码
def do_something(x):
	print(x * 2)
do_something(2) # 输出:4

这里就是一个函数了,首先,do_something这个函数定义了一个参数,名为x,然后,函数内部打印出x * 2的值。

这里的x就是一个名副其实的参数。

参数的"作用域"只在函数内部,也就是说,在函数外部无法使用x。同样的,函数内部也无法修改外部变量的值。
如果我们要用外部变量的值怎么办呢? 那么,就要使用global关键字了。

python 复制代码
a = 1
def do_something(x):
	global a
	print(x * 2 + a)
do_something(2) # 输出:5

这里的global告诉函数,函数中的a是外部变量a,然后函数就用了全局变量a了。这样,输出就为5了。但是,如果不使用global,函数就会在内部寻找a,但是找不着,于是就会报错。

好像有点扯远了......接下来,就是特殊的参数。

1.3.2 特殊的参数

前面见到的参数数量都是一定的,但是有没有可变数量的参数呢?答案是肯定的。

首先就是*args。这玩意其实很简单:

py 复制代码
def do_something(*args):
	for i in args:
		print(i)

do_something(1, 4, 2, 6) # 1 4 2 6
do_something("Hello", "World") # Hello World

看完了,你就应该能理解了。传入的参数,在函数内部会变成一个列表,里面装着你传入的所有参数。只要遍历这个列表就能知道传入了什么东西。

接下来就是**kwargs了。这个东西与*args用法差不多:

py 复制代码
def do_something(**kwargs):
	print(kwargs)

do_something(name="小明", age="12", country="中国") # {'name': '小明', 'age': 12, 'city': '中国'}

你应该能看出来,**kwargs在函数内部是一个字典,至于这个字典的键值对是哪里来的呢?那么就要使用关键字传参。

1.3.3 二者结合

如果将*args**kwargs这俩兄弟一起用呢?那就得出问题了。先看这一段代码:

py 复制代码
def do_something(*args, **kwargs):
	print(args)
	print(kwargs)

如果我要传入[1, 2, 4, 3, 5]这个列表与{"name":"小明", "age":12}这个字典,那么要在列表前写上*,字典前面写上**才行,比如说:

py 复制代码
def do_something(*args, **kwargs):
	print("args =", args)
	print("kwargs =", kwargs)

do_something(*[1, 2, 4, 3, 5], **{"name":"小明", "age":12}) # args = (1, 2, 4, 3, 5) kwargs = {'name': '小明', 'age': 12}

如果这些*都不加,就会变成这样:

py 复制代码
def do_something(*args, **kwargs):
	print("args =", args)
	print("kwargs =", kwargs)

do_something([1, 2, 4, 3, 5], {"name":"小明", "age":12}) # args = ([1, 2, 4, 3, 5], {'name': '小明', 'age': 12}) kwargs = {}

看出区别了吗?也就是说,如果不加*,解释器就会认为[1, 2, 4, 3, 5]{"name":"小明", "age":12}都应该放在args里,而加上*,就等于告诉解释器[1, 2, 4, 3, 5]属于args,{"name":"小明", "age":12}属于kwargs,这样解释器就不会搞错了。

当然,如果不想加*,还有另外一种方式:

py 复制代码
def do_something(*args, **kwargs):
	print("args =", args)
	print("kwargs =", kwargs)

do_something(1, 2, 3, 4, 5, name="小明", age=12)

这里,name=...age=...都叫关键字传参。解释器会自动认为位置传参属于args,关键字传参属于kwargs。

至于什么是位置传参,什么是关键字传参,请看下面------

1.4 传参方式

1.4.1 位置传参

我们 都是位置传参,也就是说,像这种只有一个数字(或其他数据类型)的传参方式就是位置传参。位置传参也是最常用的传参方式,所以这里就不细讲了。

1.4.2 关键字传参

像这种什么=什么的就是关键字传参,举个例子吧:

py 复制代码
def do_something(name, age):
    print("name = ", name)
    print("age = ", age)

do_something("小明", age=12) # name =  小明 age =  12

这个例子已经很清晰了,自己看看就能理解了。这里有一个要注意的点:关键字传参只能放在位置传参后面。如果放在前面,它就会报错。

1.5 返回

运行完函数,自然是需要返回某些东西的,返回东西用return就好了:

py 复制代码
def do_something(a, b):
    return a + b

print(do_something(1, 2)) # 3

好了,函数的知识都讲完了,那么,同学们,
下课!

后记:今天,我一个上午内把两个没写完的文章都写完了,按照我以往的更新频率,这就是打了鸡血!

*[之前看到的]: 当然,除了kwargs
*[可以传入很多个]: 当然是这样啊!不然程序员们还怎么活啊!