我们在编程过程中经常会遇到同样功能的代码不断地出现,使得编程成为枯燥无味的复制粘贴过程的循环。为了找乐子 让代码变得精简。我们需要函数来帮助我们。
1.函数定义
函数就是完成特定功能的代码块,本质上是对代码的封装。
函数的语法格式为:
def 函数名(参数):
代码段 # 函数体
需要注意的是,函数名的命名规则与变量的命名规则一致。
函数名以数字、字母和下划线组成,不能以数字开头,不能与系统关键字重名,区分大小写。
函数名最好不要跟系统函数重名,否则,系统函数会被覆盖。
2.函数参数
2.1.形参和实参
形参就是函数定义时小括号里的变量,实参就是函数调用的时候小括号里的表达式。例如,
def add(a, b):
return a + b
res = add(3, 5)
上面这段代码中a和b就是函数add()的形参,而3和5就是函数add()的实参。
注意:函数可以没有实参和形参。
def hello():
print("hello world")
hello()
执行结果如下:
hello world
这个hello()函数是没有形参的,同时在函数调用时,我们也无需给hello()函数实参。
2.2.参数分类
2.2.1.位置参数
位置参数是python函数中最常用到的参数之一。位置参数要求实参顺序必须和形参顺序完全一致,并且一一对应。例如:
def intro(name, age):
print("我是{},今年{}岁了。".format(name, age))
intro("小明", 18)
执行结果如下:
我是小明,今年18岁了。
这个函数中name对应"小明",age对应18。如果颠倒过来就与函数本意不一致了。
2.2.2.关键字参数
与位置参数不同,关键字参数不要求实参与形参顺序一致。函数调用时,实参以键值对的形式书写,其中键是形参名。例如:
def intro(name, age):
print("我是{},今年{}岁了。".format(name, age))
intro(age=18, name="小明")
执行结果如下:
我是小明,今年18岁了。
2.2.3.默认值
如果在函数定义时给形参一个默认值,那么在函数调用时,就可以不给这个形参传值,可以简化调用。例如:
def intro(name, sex, age=20):
print(name, sex, age)
intro('Tom', '男')
intro('Tom', '男', 25)
执行结果如下:
Tom 男 20
Tom 男 25
可以看到,如果我们不给age形参传值,age会默认为20。如果我们给age传值,age会使用我们传递的数值。
注意:默认值参数必须放在最右边,并且默认值最好是不可变对象并且只计算一次。
2.2.4.可变参数
有时我们无法确定函数所需的参数的数量,这个时候我们需要用到可变参数。
2.2.4.1.任意位置参数
任意位置参数可以接受任意数量的位置参数,并将其作为一个元组来表示。
任意位置参数通过在函数名前加上"*"来表示。例如:
def demo(*args):
print(args)
demo()
demo(1)
demo(1, 2)
执行结果如下:
()
(1,)
(1, 2)
2.2.4.2.任意关键字参数
任意关键字参数可以接受任意数量的关键字参数,并将其作为一个字典来表示。
任意位置参数通过在函数名前加上"**"来表示。例如:
def demo6(**kwargs):
print(kwargs)
demo6()
demo6(a=1)
demo6(a=1, b=3)
执行结果如下:
{}
{'a': 1}
{'a': 1, 'b': 3}
2.2.5.参数的混合使用
位置参数、默认值和可变参数可以同时在函数定义中出现。但是这些参数的混合使用要保证每一个形参都必须有值于其对应。
一般来说,我们以位置参数、任意位置参数、默认值和任意关键字参数这样的顺序进行排列。
3.函数调用
函数调用是我们使用定义好的函数的过程。
这里我们要区别好函数定义和函数调用。
函数定义是一个静态的过程,定义函数的代码不会被执行。
函数调用是一个动态的过程。函数调用会先在内存中分配形参的空间,然后会将形参指向实参,之后会执行函数定义中的代码体,最后会返回计算结果并回收形参。