文章目录
- [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
*[可以传入很多个]: 当然是这样啊!不然程序员们还怎么活啊!