函数就是将具备独立功能的代码块封装成一个小模块快,之后想使用直接调用
def 函数名(参数1,参数2,...): '''说明书''' 函数体代码 return 返回值 ''' 函数必须先定义再调用 函数在定义阶段只检查语法不执行代码 只有在调用过程中才会执行代码 '''
通过函数的定义方式分为两大类:
1.函数体代码没有return关键字 默认返回值None 2.函数体只有return,后面没有跟值 默认返回None 3.函数体代码有关键字return并且后面跟了数据 多个返回值,返回元组
1.形式参数 在函数定义阶段所用的参数统称为形式参数,简称'形参' 2.实际参数 在函数调用阶段,向函数名后括号传导的参数,简称'实参' 形参与实参的关系可以看成变量名和变量值的关系 两者只有在函数调用过程中才会暂时绑定在一起,调用结束后即断绑 在表现形式上,实参形式更多,形参表现形式只有变量名
定义:按照从左往右的顺序依次填入的参数叫位置参数
位置形参与位置实参在函数调用阶段 按照位置一一对应绑定
位置参数在绑定时,多一个不行少一个也不行
定义:在函数调用阶段,用'形参名=数据值'的形式指名道姓进行传参
位置参数要打破yiyi对应的关系,借助关键字实参 def func(a, b): print(a, b) func(b=1, a=2) 形参无法接受多个值,位置实参与关键字实参混用,容易报错 # 位置参数必须在关键字参数前面 '''越简单的越靠前,越复杂的越靠后'''
定义:函数在定义阶段,就对形参尽心赋值
1.该参数如果在调用阶段不给值,使用默认给定的值 2.该参数如果在调用阶段给定了值,则使用给定的值
可变长形参 # 问题1引入:函数无论传入多少位置参数都可以正常运行 格式 def func(x,y,*a): print(x,y,a) func(1,2,3,4,5,6) # 1,2,(3,4,5,6) *号在形参中就是接受多余位置的位置参数,并组织成元组的形式赋值给*号后面的变量名 # 问题2引入:函数无论传入多少关键字参数都可以正常运行 格式 def index(x, y, **b): print(x, y, b) index(y=2, x=1, u=222, k=111, l=444) # 1 2 {'u': 222, 'k': 111, 'l': 444} **号用来接受多余的关键字参数,并组织成字典的模式赋值给**后的变量名 """ 墨守成规 可变长形参 *与**后面的变量名其实是可以随便定义的 但是python中推荐使用 *args **kwargs def index(*args, **kwargs): pass """ # 问题3引入:如果index形参是*args 列表里面有很多元素 如何实现按照位置一一传入 def index1(*args): print(args) new_list1 = [11,22,33,44,55] index1(*new_list1) # index1(11,22,33,44,55) ''' *号在实参中会将变量名所对应的列表、元组打散,再yiyi传入函数中 '''
命名关键字参数 def register(name,age,*,sex,height): pass register('alan',18,'male',188) # ERROR register('alan',18,sex='male',height='1.88m') # 正常运行 """ sex height在传入实参的时候必须以关键字参数的形式 ps:该类型的参数几乎不用 也几乎很少能碰到 """
在PY文件中顶格编写的代码运行之后就会存放在全局空间,但也不绝对,什么if、for都能造例外
函数体代码在运行之后产生的都是存放在局部名称空间
# 在查找名字的时候 要先确定自己当前在哪 1.如果你在局部 局部 >>> 全局 >>> 内置 2.如果你在全局 全局 >>> 内置