函数的参数python教程

一:函数
什么是函数?
image

函数就类似于工具 提前定义之后可以反复使用
代码冗余 结构清晰 修改繁杂等问题
二:函数的语法结构
def 函数名(参数1,参数2)
'''函数注释'''
函数体代码
return 函数返回值

1.函数必须先定义后调用
2.函数在定义阶段只会检测函数体语言 不会检测函数体代码
3.函数在调用阶段才会执行函数体代码
image
三:函数的分类

无参函数
	函数在定义阶段括号内没有参数
有参函数
	函数在定义阶段括号内要参数
空函数
	函数在定义阶段括号内没有参数并且函数体代码为(pass)
	

# 搭建框架 
# 注册登录功能   先空函数先出来

# 定义函数
def register():
    pass
# 定义函数
def login():
    pass

# 定义一个空字典

func_dic = {'1': register, '2':login}

# 定义循环
while True:
    # 定义功能选项
    print('''
        1.注册
        2.登录
        ''')
        # 让用户输入选项
    choice = input('请输入您的选项:').strip()
    # 判断用户输入在不在字典里面
    if choice in func_dic:
        # 字典暴露外界的是k,根据字典1拿到函数名
        func_naem = func_dic.get(choice)
        # 拿到函数名后执行
        func_naem()
    # 用户输入的编号不存在进入该下
    else:
        print('功能编号不存在')

image
四:函数返回值

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

image
五:函数的两大分类

形式参数
	在函数定义阶段括号内所填写的参数 简称'形参'
	def func(a, b):
	pass
	a和b就是函数func的形参
实际参数
	在函数调用的阶段括号内传入的参数 简称'实参'
	func(1, 2)
	数据1和2就是函数func的实参
	
形参与实参的关系
	我们可以将形参看成是变量名 实参看成是变量值
		两者在函数调用阶段临时绑定 函数运行结束断开
		
		
形参的表现形式只要一种就是变量名
实参的表现形式有很多种(但是把握核心 就是 数据值\变量值)


image
六:位置参数

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

定义一个可以比较大小的函数(传入两个值 返回比较大小)
def choin(a,b):
    if a > b:
        return a
    else:
        return b

res = choin(1,2)
print(res)

关键字实参(可以打破位置顺序)
	在函数调用阶段通过形参名=数据值的形式指名道姓的传值
	
1,位置形参与位置实参在函数调用阶段 按照位置一一对应绑定
2,位置参数在绑定的时候多一个不行少一个也不行

	格式越简单的越靠前 格式越复杂的越靠后

image

七:默认参数

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

定义一个可以比较大小的函数(传入两个值 返回比较大小)
def choin(a,b):
    if a > b:
        return a
    else:
        return b

res = choin(1,2)
print(res)

关键字实参(可以打破位置顺序)
	在函数调用阶段通过形参名=数据值的形式指名道姓的传值
	
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('ly', 18, gender='female')

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

笔试题
默认形参如果绑定的是一个列表 那么指向的是固定的一个地址
def func(name, age, hobby=[]):
    将age的数据添加到hobby的尾部
    hobby.append(age)
    print('%s:%s:%s' % (name, age, hobby))

func('jason', 18, [])
func('kevin', 28, [])
func('tony', 38, [])

image
八:可变长参数

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}

**号在实参中的使用
	会将字典内的键值对打散成关键字参数传入

image

九:函数参数补充(了解)

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.局部名称空间
			随着函数体代码的执行与结束而创建和销毁

image

十:名字的查找顺序

	在查找名字的时候 要先确定自己当前在哪
	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()

image

posted @ 2021-11-15 23:08  AlexEvans  阅读(62)  评论(0编辑  收藏  举报