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()
posted @ 2021-11-12 22:50  elijah_li  阅读(32)  评论(0编辑  收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中