第七章 函数+名称空间(一)

函数

函数的语法结构

"""
def 函数名(参数1, 参数2)
	'''函数注释'''
	函数体代码
	return 返回值
"""
1.def(必须的)
	是定义函数的关键字
2.函数名(必须的)
	是函数的名字  相当于变量名
    函数名的命名规范与风格遵循变量名的
3.括号(参数1,参数2)(可选)
	参数可以没有也可以有多个
    表示在使用函数之前需要满足的一些条件
4.函数注释(可选)
	类似于产品说明书
    主要用于介绍函数功能 参数使用 及其他情况
5.函数体代码(必须的)
	函数核心的代码逻辑(重点)
6.return返回值(可选的)
	使用函数之后反馈给用户的

函数的定义与调用

-------------------------------------------------------------------------
1.必须先定义再使用
2.函数在定义的时候只会检测你的语法不执行代码
3.函数在调用阶段才会执行函数体代码
	如何调用函数
    	函数名加括号 如果函数在定义阶段有参数则在调用阶段也需要给参数
--------------------------------------------------------------------------

函数在定义与调用阶段底层原理
1.在内存空间中申请一块空间存储函数体代码
2.将函数体代码所在的空间地址绑定给函数名
3.函数加括号则会执行函数体代码

函数分类

内置函数:
	python解释器自带的

自定义类型函数:   
    无参函数:在函数定义阶段括号内没有写入参数(变量名)
    def my_func():
        print('这个函数很🐮')

    有参函数:在函数定义阶段括号内写了参数(变量名)
    def my_func(a,b)
        print('这个函数更🐮')
    my_func(a,b)

    空函数:函数体代码为空(pass ...)
    '''
    虽然函数本身没有含义 但是空函数可以提前规定好编写的代码的思路
    '''
def run():
    pass
def fight():
    pass
def talk():
    pass

函数参数的两大类

	形式 参数
    		在函数定义阶段括号内所填写的参数  形参
    实际参数
    		在函数调用阶段括号内传入的参数  实参
        
    '''
    形参与实参的关系
    	1.可以将形参看成变量名  实参看成变量值
    			两者在函数调用阶段临时绑定 函数运行结束断开 
    '''

位置参数

位置参数
	按照从左往右的顺序依次填入的参数
位置形参
	在定义阶段括号内按照从左往右的顺序依次填入的变量名
位置实参
	在函数调用阶段括号内按照从左到右的顺序传入的数据值

  # 定义一个可以比较大小的函数(传入两个值 返回较大的)

关键字实参(可以打破位置顺序)
	在函数调用阶段通过形参名=数据值得形式指名道姓的传值

def max(a, b):		# a,b 位置形参
    if a > b:
        return a
    else:
        return b
# res = max(11, 22)  # 位置实参
res = max(b=22, a=11)  # 关键词字实参、
# res = max(111, a=222)  # 不能行,111会安装位置传给形参a,222会按照关键字实参也传给形参a。
# res = max(b=222, 111)  # 不可以,位置参数必须要在关键字 参数的前面
'''
格式越简单的越靠前,格式越复杂的越靠后!!!!
'''
print(res)  # 22
'''
1.位置形参与位置实参在函数调用阶段  按照位置一一对应绑定
2.位置参数在绑定的时候多一个不行少一个也不行
'''

默认参数

默认参数
	默认形参
    	函数在定义阶段就可以给形参赋值了
        	1.该形参在函数调用阶段如果不给值 则使用默认的
            2.该行参在函数调用阶段也可以继续给值 则使用你给的
            
# 定义学员注册功能
def register(name, age, gender='male'):
    print('%s:%s:%s' % (name, age, gender))
register('maby', 18)
register('jerry', 22)
register('zhangsan', 28)
register('lisi', 38)

"""
位置形参与默认值形参在定义的时候
	位置形参必须在默认值形参的前面
"""
'''格式越简单的越靠前 格式越复杂的越靠后'''

可变长函数

# 1.函数无论传入多少位置参数都可以正常运行
# 可变长形参
# def func(x,y,*a):
#     print(x,y,a)
# func()  # ()
# func(1)  # (1,)
# func(1, 2, 3, 4, 5, 6, 7)  # (1, 2, 3, 4, 5, 6, 7)
# func(1,2)  # 1 2 ()
# func(1,2,3,4,5,6,7,8,9)  # 1 2 (3, 4, 5, 6, 7, 8, 9)
# func(1,2)  # 1 2 (3, 4, 5, 6, 7, 8, 9)
"""
*号在形参中的使用
    用于接收多余的位置参数 并组织成元组的形式赋值给*号后面的变量名
"""


# 2.函数无论传入多少关键字参数都可以正常运行
# def index(x, y, **b):
#     print(x, y, b)
# index()  # {}
# index(a=1,b=2,c=3,d=4)  # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
# index(y=2, x=1)  # 1 2 {}
# index(y=2, x=1, u=222, k=111, l=444)  # 1 2 {'u': 222, 'k': 111, 'l': 444}
"""
**号在形参中的使用
    用于接收多余的关键字参数 并组织成字典的形式赋值给**号后面的变量名
"""
# 3.定义一个函数无论传入多少位置参数和关键字参数都可以正常运行
# def index(*a,**b):
#     print(a,b)
# index()  # () {}
# index(1,2,3,4)  # (1, 2, 3, 4) {}
# index(a=1,b=2,c=3)  # () {'a': 1, 'b': 2, 'c': 3}
# index(1,2,3,4,a=1,b=2,c=3)  # (1, 2, 3, 4) {'a': 1, 'b': 2, 'c': 3}
"""
墨守成规
    可变长形参 *与**后面的变量名其实是可以随便定义的
    但是python中推荐使用
        *args  
        **kwargs 
def index(*args, **kwargs):
    pass
"""


# def index(a, b, c):
#     print(a,b,c)
# new_list = [11,22,33]
# index(new_list)  # 肯定不行  列表是一个整体 相当于一个实参
# index(new_list[0],new_list[1],new_list[2])  # 可以
'''如果index形参是*args 列表里面有很多元素 如何实现按照位置一一传入'''
# def index1(*args):
#     print(args)
# new_list1 = [11,22,33,44,55,66,77,88,99]
# index1(*new_list1)  # index1(11,22,33,44,55,66,77,88,99)
"""
*号在实参中的使用
    会将列表、元组内的元素打散成位置参数的形式一一传值
"""

# def index2(**kwargs):
#     print(kwargs)
new_dict = {'username':'jason','pwd':123}
# index2(**new_dict)  # index2(username='jason',pwd=123)
# {'username': 'jason', 'pwd': 123}
"""
**号在实参中的使用
    会将字典内的键值对打散成关键字参数传入
"""

函数参数补充(了解)

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()
            len()
            ...
    2.全局名称空间
    	在py文件中顶格编写的代码运行之后都会存入全局名称空间
        	name = 'jason'  # 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-15 19:48  hai起奈  阅读(35)  评论(0编辑  收藏  举报