python函数
内容概要
- 函数语法结构
- 函数的定义和调用
- 函数的分类
- 函数参数的两大分类
- 位置参数
- 默认形参(默认参数)
- 关键字实参(关键字参数)
- 参数位置规定
- 笔试题
- 可变长参数
- 名称空间
- 名字查找顺序
一、函数语法结构
'''
1.以上所写代码无法做到精简,需要用必须重复写模仿len的功能
2.所写的代码兼容性很差
3.没有返回值
函数:类似工具,提前定义好之后就可以反复使用
'''
'''
def 函数名(参数1,参数2):
"""函数注释"""
函数体代码
return 返回值
'''
'''
1.def(必选)
定义函数的关键字
2.函数名(必选)
与变量名命名规范一致
3.参数(可选)
当函数定义了参数,在调用的时候必须进行传参才能运行成功
4.函数注释(可选)
对函数体功能进行解释
5.函数体代码(必选)
函数功能实现的代码,核心逻辑(重要)
6.return(可选)
执行到return的时候结束函数并且返回值,如果要返回多个值会组织成元组返回
'''
二、函数的定义和调用
1.函数必须先定义后调用(不能乱顺序)
2.函数在定义阶段只检测语法不执行代码
3.函数在调用阶段才会执行函数体代码
函数的调用:
函数名(),如果函数再定义阶段有参数,在调用阶段也要给相应的参数
三、函数在定义与调用阶段底层原理
1、在内存空间申请一块空间存储函数体代码
2、将函数体代码所在的内存空间地址绑定给一个函数名
3、要调用的时候直接函数名加括号调用就会执行函数体代码
四、函数的分类
1、内置函数
python解释器自带的,提前定义好了,可以直接调用
2、自定义函数
程序员自己写的函数
2.1无参函数
# 无参函数
在函数定义阶段括号内没有写参数
def my_func():
print('努力学习')
2.2有参函数
# 有参函数
在函数定义阶段括号内写了参数
def my_func1(a, b):
c = a * b
my_func1(3, 4)
2.3.空函数
# 空函数
函数体代码为空
def my_func2():
pass
一般空函数可以用于提前规定好编写代码的思路
五、函数参数的两大分类
1、形式参数(形参)
# 在函数的定义阶段,填写在括号内的参数
def func(a, b):
print(a, b)
# 此时,a、b是函数func的形参
2、实际参数(实参)
# 在函数的调用阶段,给函数传入的数据值
func(1, 2)
# 此时,传入的1,2是实际参数
形参与实参的关系
可以将形参看作变量名,实参看作变量值
两者在函数调用阶段临时绑定,函数运行结束断开
形参表现形式只有一种就是变量名
实参表现形式有很多种(把握核心,数据值)
六、位置参数
位置参数
按照从左往右的顺序依次填入的参数
位置形参
在函数定义阶段括号内按照从左往右的顺序依次填入的变量名
位置实参
在函数调用阶段括号内按照从左往右的顺序依次传入的数据值
# 在函数定义阶段,填写在括号内的参数
def func(a, b):
print(a, b)
'''
1、位置形参和位置实参在函数调用阶段,按照位置一一对应绑定
2、位置参数在绑定的时候多一个不行少一个也不行
'''
七、默认参数(默认形参)
# 在函数定义阶段,就可以给形参赋值了,以sex=female 的形式填入括号内
1、该形参在函数调用阶段如果不给值,则使用默认的
2、该形参在函数调用阶段如果给值,则使用传入的值
def func2(x, y, sex='female'):
print(x, y, sex) # 1 2 female
func2(1, 2)
# 在调用函数的时候默认参数的位置可以不填,不填默认是female值,填则改为传入的数据值
# 应用场景,当某个变量在大多数情况下是一个值时,比如一个班男生多,sex=male,这样在传入值时男生可以不输入性别
关键字参数(关键字实参)
# 在函数调用阶段,用salary=30000的形式传入数据值
func3('eliajh', 23, salary=30000)
位置参数、默认参数混合使用
# '简单的在前面,复杂的在后面'
# 函数定义和调用阶段,位置参数得放在默认参数和关键字参数前面
def func4(a, b, salary=30000):
pass
func4(2, 3, salary=50000)
笔试
# 1、默认参数如果为可变类型
def admin(a, b, c=[]):
c.append(b)
print(a, b, c)
admin(1, 2) # 1 2 [2]
admin(3, 4) # 3 4 [2, 4]
admin(5, 6) # 5 6 [2, 4, 6]
# 列表在三次调用中用的都是同一个内存地址的列表,所以三次添加值都会添加在同一个列表里面
解决方法:
admin(1, 2, []) # 1 2 [2]
admin(3, 4, []) # 3 4 [4]
admin(5, 6, []) # 5 6 [6]
# 2、名称空间
m = 200
def test(a, b, m)
print(a, b, m)
m = 400
def test(22, 33, m)
八、可变长参数
1、可变长形参
函数无论传入多少位置参数都可以正常运行
# 1、* 号可以接收多余的位置参数并组织元组,赋值给*号后面的变量名
def index(a, b, *c):
print(a, b, c) # 2 3 (5, 6, 7, 8)
index(2, 3, 5, 6, 7, 8)
# 2、** 号可以接收多余的关键字参数并组织成字典,赋值给**号后面的变量名
def index(a, b, **c):
print(a, b, c) # 2 3 {'c': 5, 'd': 6, 'f': 8}
index(2, 3, c=5, d=6, f=8)
# 3、定义一个函数无论传入多少位置参数和关键字参数都可以正常运行
def index(*a, **b):
print(a, b)
index(2, 3, 4, 5, 6, a=9, b=55, c=66) # # (2, 3, 4, 5, 6) {'a': 9, 'b': 55, 'c': 66}
2、可变长实参
# 1、* 号可以将列表、元组内的元素打散成位置参数的形式一一传值
def index(*args):
print(args)
new_list = [2, 3, 4, 5]
index(*new_list) # (2, 3, 4, 5)
# index(new_list) 只能传入一个列表整体
# 2、** 号可以将字典中的键值对打散成关键字参数传入
def index(**kwargs):
print(kwargs) # {'name': 'elijah', 'age': 23}
new_dict = {'name': 'elijah', 'age': 23}
index(**new_dict)
函数参数补充(了解)
1.命名关键字参数
def register(name,age,*,sex,height):
pass
# register('jason',18,'male',183)
register('lili',18,sex='male',height='1.8m') #正确使用
"""
sex height在传入实参的时候必须以关键字参数的形式
ps:该类型的参数几乎不用 也几乎很少能碰到
"""
九、名称空间
# 什么是名称空间(namespaces)
用于存放变量名与变量值绑定关系的地方(民政局)
# 名称空间分类
1、内置名称空间
python解释器提前定义好
print()
input()
...
2、全局名称空间
在py文件中顶格编写的代码运行之后都会存入全局名称空间
name = 'elijah' # name全局
def func(): # func全局
pass
if 1:
a = 123 # a全局
for i in range(10):
print(i) # i全局
while True:
a = 123 # a全局
3、局部名称空间
函数体代码运行之后产生的都是局部名称空间
# 存活周期
1、内置名称空间
python解释器启动与关闭而创建和销毁
2、全局名称空间
随着py文件的运行与结束而创建和销毁
3、局部名称空间
随着函数体代码的执行与结束而创建和销毁
名字的查找顺序
# 查找名字的时候,要先确定自己当前在哪
1、如果你在局部
局部 > 全局 > 内置
2、如果在全局
全局 > 内置
# 局部名称空间的嵌套
'''函数在定义阶段名字的查找顺序就已经固定死了(笔试)'''
x = 111
def f1():
x = 222
def f2():
x = 333
def f3():
x = 444
def f4():
x = 555
print(x)
# x = 555 特例
f4()
f3()
f2()
# 通过调用f1 执行所有的函数
f1()