函数
1 什么是函数
函数就是盛放功能(一系列代码)的容器
定义函数就是造出了一个工具
事先准备工具的过程->函数的定义
遇到应用场景拿来就用->函数的调用
2 为何要用函数
不用函数写出的代码问题是:
1 程序的组织结构不清晰,可读性差,可维护性差
2 可扩展性差
3 如何用函数
原则:
先定义
后调用
定义函数的语法:
def 函数名(参数1,参数2,参数3,...):
代码1
代码2
代码3
return 值
调用函数语法:
res = 函数名(值1,值2,值3)
1 定义函数与调用函数
# x = 10
# y = x
# print(x)
# def func(): # func = 函数的内存地址
# print("*" * 40)
# print("hello".center(40, ' '))
# print('=' * 40)
# print(func)
# f = func
2 函数定义阶段发生的事情:
申请内存空间,把函数体代码放进去,然后把内存地址绑定给函数名
# def func():
# print(1)
# print(2)
# print(3)
3 函数调用阶段发生的事情: 执行函数体代码
# def func():
# print(1)
# print(2)
# print(3)
# func()
ps: 函数定义阶段只检测语法不执行代码,只有在调用函数时才会执行函数体代码
例1:
# def bar():
# print('from bar')
#bar()
例2:
# def foo():
# print('from foo')
# foo()
定义函数的三种形式
1、无参:应用场景仅仅只是执行一些操作,比如与用户交互,打印
2、有参:需要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值
3、空函数:设计代码结构
函数调用的三种形式
1 语句形式:foo()
2 表达式形式:3*len('hello')
3 当中另外一个函数的参数:range(len('hello'))
```
#函数返回值
return返回值的语法:
函数内可以有多个return,但只要执行一次,整个函数就立即结束,并且将return后的值当作本次调用的产品返回
具体来说函数的返回值有三种形式
1 return 值: 返回的就是改值本身/-
2 return 值1,值2,值3:返回的是小元组
3 没有return或者return无值或者return None:返回的都是None
函数的参数
一 形参与实参的含义
形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定
二 参数的种类
#1、位置参数:按照从左到右的顺序定义的参数
位置形参:必选参数
位置实参:按照位置给形参传值
#2、关键字参数:按照key=value的形式定义的实参
无需按照位置为形参传值
注意的问题:
1. 关键字实参必须在位置实参右面
2. 对同一个形参不能重复传值
#3、默认参数:形参在定义时就已经为其赋值
可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)
注意的问题:
1. 只在定义时赋值一次
2. 默认参数的定义应该在位置形参右面
3. 默认参数通常应该定义成不可变类型
#4、可变长参数:
可变长指的是实参值的个数不固定
而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs
ps:
1 可以混用位置形参与关键字形参参,但是位置形参必须跟在默认形参的前面
2 默认形参的值推荐指向不可变类型
3 默认形参的值只在函数定义阶段被赋值一次
4 可变长参数:*与**
在形参中带*: *会将溢出的位置实参值汇总成元组,然后赋值给紧跟其后的形参名
在形参中带**: **会将溢出的关键字实参值汇总成字典,然后赋值给紧跟其后的形参名
在实参中带*在实参中带**会被打散成单个
命名关键字参数
跟在*args和**kwargs之间的参数