Python知识十函数(函数参数的两大分类 位置参数与关键字参数 默认参数 可变长参数(重点) 其他函数参数补充(了解) 名称空间的概念)

上周内容回顾

  • 文件内光标的移动

    f.seek(offset,whence)
    f.tell()
    
    # 如何检测文件内内容是否有变化
    	1.打开文件然后让光标直接先移动到文件末尾
        2.写循环从文件末尾开始读取内容
        3.如果文件新增了内容那么就可以立刻读取没有则间隔一段时间继续
    
  • 文件内容的修改

    # 硬盘存取数据的本质
    	占有态 自由态
    
    # 方式1  覆盖写
    1.先读取文件内容 绑定给一个变量
    2.之后利用字符串替换 修改该变量绑定的值中内容
    3.再使用写的方式打开源文件 写入
    
    # 方式2  替换写
    1.先创建一个小文件
    2.然后循环读取老文件内容 一行行写入新文件
    3.删除老文件 将新文件重命名为老文件
    
  • 函数前戏

    函数就类似于是工具 提前定义之后可以反复使用
    在代码中函数可以解决
    	代码冗余 结构清晰 修改繁杂等问题
    
  • 函数的语法结构

    def 函数名(参数1,参数2):
        '''函数注释'''
        函数体代码
        return 返回值
    """
    1.函数必须先定义后调用
    2.函数在定义阶段只检测函数体语言  不执行函数体代码
    3.函数在调用阶段才会执行函数体代码
    	如何调用
    		函数名加括号(如果需要额外的条件则传入额外的条件)
    """
    
  • 函数的分类

    无参函数
    	函数在定义阶段括号内没有参数
    有参函数
    	函数在定义阶段括号内有参数
    空函数
    	函数在定义阶段括号内没有参数并且函数体代码为空(pass)
    def register():
        pass
    
    def login():
        pass
    
    func_dic = {'1': register, '2': login}
    while True:
        print("""
        1.注册
        2.登录
        """)
        choice = input('please>>>:').strip()
        if choice in func_dic:
            func_name = func_dic.get(choice)
            func_name()
        else:
            print('功能编号不存在')
    
  • 函数的返回值

    1.函数体代码没有return关键字
    	默认返回None
    2.函数体代码只有关键字return后面没有跟内容
    	默认也是返回None
        函数体代码遇到return立刻结束
    3.函数体代码有关键字return并且后面跟了数据
    	跟了啥就返回啥
        如果跟了多个数据逗号隔开会自动组织成元组返回
    

今日内容概要

  • 函数参数的两大分类
  • 位置参数与关键字参数
  • 默认参数
  • 可变长参数(重点)
  • 其他函数参数补充(了解)
  • 名称空间的概念

今日内容详细


函数参数的两大分类

\\\#形式参数
	在函数定义阶段括号内所填写的参数 简称"形参"
    	def func(a, b):
            pass
       	# a和b就是函数func的形参
        
\\\#实际参数(可理解为调用函数时被赋值的参数)
	在函数'调用阶段'括号内传入的参数 简称"实参"
    	func(1,2)
        # 数据1和2就是函数func的实参
        
        

形参与实参的关系
	#我们可以将形参看成是变量名 实参看成是变量值
		两者在函数调用阶段临时绑定 函数运行结束断开	
	
形参的表现形式只有一种就是变量名
#实参的表现形式有很多种(但是把握核心 就是 数据值)

位置参数

\\\\'''位置参数'''
	按照从左往右的顺序依次填入的参数
位置形参
	在函数定义阶段括号内按照从左往右的顺序依次填入的变量名
位置实参
	在函数调用阶段括号内按照从左往右的顺序依次传入的数据值
 
# 定义一个可以比较大小的函数(传入两个值 返回较大的)
	
 
\\\\'''关键字实参'''(可以打破位置顺序)
	在函数调用阶段通过形参名=数据值的形式指名道姓的传值 	
    
"""
1.位置形参与位置实参在函数调用阶段 按照位置一一对应绑定
2.位置参数在绑定的时候多一个不行少一个也不行
"""
   
'''格式越简单的越靠前 格式越复杂的越靠后'''

默认参数

默认参数
	默认形参
    	函数在定义阶段就可以给形参赋值了
        	1.该形参在函数调用阶段如果不给值 则使用默认的
            2.该形参在函数调用阶段也可以继续给值 则使用你给的
        
# 定义学员注册功能					\\\\
	def register(name, age, gender='male'):
    	print('%s:%s:%s' % (name, age, gender))
    register('jason', 18)
    register('tony', 28)
    register('kevin', 38)
    register('lili', 18, 'female')
    register('lili', 18, gender='female')
 
"""
位置形参与默认值形参在定义的时候
	位置形参必须在默认值形参的前面
"""
'''格式越简单的越靠前 格式越复杂的越靠后'''

可变长参数

# 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
print(x)
def f1():
    x = 222
    print(x)
    def f2():
        x = 333
        print(x)
        def f3():
            x = 444
            print(x)
            def f4():
                x = 555
                print(x)
                # x = 555  特例
            f4()
        f3()
    f2()
# 通过调用f1 执行所有的函数
f1()
print(x)

作业

1.整理今日内容及博客
2.预习明日内容
	https://blog.sholdboyedu.com/?p=3377
    https://blog.sholdboyedu.com/?p=3386
3.多用户登录注册没有掌握的继续练习
posted @ 2021-11-15 21:23  弑悟  阅读(9)  评论(0)    收藏  举报