#基本介绍
###没有使用函数式编程之前带来的问题
- 代码的组织结构不清晰,可读性差
- 实现重复的功能时,你只能重复编写实现功能的代码,导致代码冗余,白白耗费精力
- 假如某一部分功能需要扩展或更新时,需要找出所有实现此功能的地方,一一修改,无法统一管理,加大了维护难度
###函数是什么
- 函数是对实现某一功能的代码的封装
- 函数可以实现代码的复用,从而减少代码的重复编写
#一、定义函数
###1. 函数的分类
#####函数分为内置函数和自定义函数
- 内置函数 是自带的,直接可以调用。比如 :
id() ``````type()``````list()
- 自定义函数 是我们自己在代码中编写定义的
###2. 定义函数的语法
def 函数名(参数1,参数2,参数3,...):
'''注释'''
函数体
return 返回值
def
是定义函数的关键字- 函数名和变量名的定义规则一样,要能体现出函数的功能含有:
()
小括号是必须的:
小括号后面的英文的冒号:
也是必须的- 参数 不是必须的,多个参数使用英文逗号
,
隔开- 函数体 可以写任意合法的 Python 代码,需要缩进
4
个空格retrurn
是用于返回数据的,这个是可选的。- 返回值 也是可选的
#####定义函数
>>> def cc():
... print("chenchao")
...
>>>
#####调用函数
>>> cc()
chenchao
>>>
#####注意:函数必须先定义,才能调用
#二、感受返回值的强大
函数也可以通过关键字
return
返回任何数量的 Python 中的任意数据类型,作为结果
>>> def foo():
... c = 'chen'
... li = [1, 2, 3]
... return c, li
...
>>> foo()
('chen', [1, 2, 3])
# 调用函数并且接收返回值
>>> name, num = foo()
>>> name
'chen'
>>> num
[1, 2, 3]
# 只调用一个函数并且接收返回值
>>> _, num = foo()
>>> num
[1, 2, 3]
#三、函数的参数
函数的参数可以是python 中的任意数据类型,并且参数的数量可以是零个或多个。
#####函数的参数分为:
- 形参
形参就是形式上的参数,是在定义函数时使用的概念,其实就是一个变量名
def 函数名(形参1, 形参2):
- 实参
实参就是实际的数据,是在调用(使用)函数时的概念。
###1. 形参中位置参数和默认参数
#####1.1 位置参数
# 定义参数
>>> def say(msg): # say 就是位置参数
... print(msg)
...
# 调用参数
>>> say(1)
1
>>> say([1, 2, 3])
[1, 2, 3]
# 调用函数
>>> s = "abc"
>>> say(s)
abc
# 定义多个参数
>>> def fuc(x, y):
... n = x-y
... print(n)
...
# 调用参数
>>> fuc(9, 5)
4
>>> fuc(2, 5)
-3
位置参数有几个,调用函数时就要传递几个。并且有位置顺序的区分
#####1.2 默认参数
# 定义参数
>>> def func(y=5): # y 就是默认参数
... print(y)
...
# 调用参数
>>> func()
5
>>> func(3)
3
# 定义多个参数
>>> def func(x, y=5):
... n = x-y
... print(n)
...
# 调用参数
>>> func(9)
4
>>> func(9, 8)
1
y=5
定义了一个默认参数y
,这个参数在定义函数的时候就有了一个值5
默认参数在调用函数时可以不用传递实参,就是使用默认值。
也可以传递实参,传递时,就是用所传递的参数
###2. 实参中的位置参数和关键字参数
在函数调用的时候,给函数传递的参数,称为实参。
实参可以简单分为 位置参数 和 关键字参数
- 位置参数就是 一个一个的数据对象,传递的时候是有位置顺序区分的。如: (‘chen’, 18)
- 关键字参数是变量名和变量值的组合,传递的时候没有位置顺序之分。如:(age=18, name=‘chen’)
>>> def say_me(name, age=20):
... print("昵称:", name)
... print("年龄:", age)
...
>>> say_me('chen', 18) # 位置参数在传值
昵称: chen
年龄: 18
>>> say_me(age=18, name='chen') # 关键字参数的变量名必须 和定义函数时的参数名称一致。
昵称: chen
年龄: 18
###3. * 和 ** 实现接收任意参数
*
可以接收所有的位置参数, **
只可以接收所有的关键字参数。
def some_arg(*args, **kwargs):
print(args)
print(kwargs)
# 调用
>>> some_arg(1, 2, 3, a=10, b=20)
(1, 2, 3)
{'a': 10, 'b': 20}
#四、函数的高级用法
###1. 作为其他函数的参数传递
>>> def f1(): # 定义函数 f1
... n = 1 + 1
... return n
...
>>> f1()
2
>>> def f2(): # 定义函数 f2
... n = 2 + 2
... return n
...
>>> f2()
4
>>> def foo(arg): # 定义函数 foo
... ret = arg()
... print(ret)
...
>>> foo(f1) # 函数 foo 调用函数 f1
2
>>> foo(f2) # 函数 foo 调用函数 f2
4
>注意这里传递的是 函数名,后面不要加小括号。
本质上是传递了 函数对象本身
###2. 作为其他函数的返回值返回
>>> def f1(): # 定义函数 f1
... print('hello')
...
>>> def f2(): # 定义函数 f2 调用 f1
... return f1
...
>>> f3 = f2() # 定义变量 f3 等于函数 f2
# f1 和 f3 都指向同一个函数对象
>>> print(id(f1))
139936415612224
>>> print(id(f3))
139936415612224