一、定义函数
1.如何自定义函数 (return 返回值和参数不是必须要写的)
#语法 def 函数名(参数1,参数2,参数3,...): '''注释''' 函数体 return 返回的值 #函数名要能反映其意义
2.函数的使用原则:先定义,在调用 (******)
def foo(): print('from foo') bar() def bar(): print('from bar') foo() #会报错吗? 不会 #结论:函数的使用,必须遵循原则:先定义,后调用我们在使用函数时,一定要明确地区分定义阶段和调用阶段,会先走定义阶段的foo和bar,等到调用foo函数的时候,内存中已经存在bar函数了
3.函数在定义阶段
只检测语法,不执行代码
也就说,语法错误在函数定义阶段就会检测出来,而代码的逻辑错误只有在执行时才会知道
4.定义函数的三种形式
#1、无参:应用场景仅仅只是执行一些操作,比如与用户交互,打印 #2、有参:需要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值 #3、空函数:设计代码结构
二、调用函数
1.函数返回值
return:函数内可以有多个return,但是只能执行一次return 执行return函数就立刻结束,并且return后的值当做本次调用的结果返回 return返回值没有类型限制
无return->默认返回None return 1个值->返回1个值 return 逗号分隔多个值->返回一个元组
2.函数调用的三种形式
1 语句形式:foo() 2 表达式形式:3*len('hello') 3 当中另外一个函数的参数:range(len('hello'))
三、函数的参数
1.具体应用 (******)重点
1.位置参数:按照从左往右的顺序依次定义的参数 位置形参:必须被传值,多一个少一个都不行 位置实参:与形参一一对应传值 2.关键字参数:按照key=value的形式定义的实参 特点:指名道姓的给形参传值,不再依赖位置 注意:1.关键字实参必须在位置实参的后面。2.不能为同一个参数赋值多次 3.默认参数:在函数定义阶段,就已经为形参赋值了 特点:定义阶段已经有值意味着调用阶段可以不用传值 位置参数通常用于经常变化的参数,而默认参数指的是大多数情况下都一样的 注意:1.默认参数必须放在位置形参的后面 2.默认参数的值只在定义时被赋值一次 3.默认参数的值通常应该是不可变类型 4.可变长参数:(分在形参使用和在实参使用)
在调用函数时,实参值的个数不固定 实参的形式有:位置实参,关键字实参 在形参中使用的解决方案:用 *,**接收多余的实参 (*接收多余的位置实参,**接收多余的关键字实参)
在实参中使用的解决方案:用*,**打散 (*打散元组,**打散字典,然后把打散的值传给一一传给形参)
了解:命名关键字参数 *后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参key=value的形式传递 def foo(x,y,*,m,n) print(x,y) print(m,n) foo(1,2,n=4,m=3) #如果不用key=value形式传参,那么传的值都会被*接收