函数与参数

函数

函数前戏

name_list = ['moon','jack','tony']
# print(len(name_list))
"""len突然不能用了"""
count = 0
for i in name_list:
    count+=1
    print(count)
"""统计列表内数据值个数的代码需要在很多地方使用"""
#相同代码需要在不同的位置反复执行

"""
循环
    相同的代码在相同的位置反复执行   
函数
    相同的代码在不同的位置反复执行
    ps:相同的代码不是真正一模一样而是可以通过传入的数据不同而做出不同的改变
"""
def my_len():
    count = 0
    for i in name_list:
        count += 1
	 print(count)
my_len()
"""
函数相当于工具(具有一定功能)
	不用函数
		修理工需要维修器件要用工具 原地打造 每次用完就丢掉 下次用再继续打造
	用函数
		修理工提前准备好工具 什么时候想用就什么时候用
"""

函数的语法结构

def 函数名(参数):
    '''函数注释'''
    函数体代码
    return 返回值

1.def
	定义函数的关键字
2.函数名
	命名等同于变量名
3.参数
	可有可无 主要是在使用函数的时候规定要不要外界传数据进来
4.函数注释
	类似于工具说明书
5.函数体代码
	是整个函数的核心 主要取决于程序员的编写
6.return
	使用函数之后可以返回给使用者的数据 可有可无		

函数的定义与调用

1.函数在定义阶段只检测语法 不执行代码
	def func():
       pass
2.函数在调用阶段才会执行函数体代码
	func()
3.函数必须先定义再调用
4.函数定义使用关键字def函数调用使用>>>:函数名+()
    如果有参数则需要在括号内按照相应的规则传递参数(后续会详细讲讲)

函数的分类

1.空函数
	函数体代码为空 使用pass或者...补全的
 	空函数主要用于项目前期的功能框架搭建
    def register():
        """注册功能"""
        pass
    
2.无参函数
	定义函数的时候括号内没有参数
    def index():
        print('from index function')
        
3.有参函数的时候括号内写参数 调用函数的时候括号传参数
	def func(a):
        print(a)

函数返回值

1.什么是返回值
	调用函数之后返回调用者的结果
2.如何获取返回值
	变量名 赋值符号 函数的调用
    res = func() #先执行func函数 然后将返回值赋值给变量res
3.函数返回值的多种情况
	3.1 函数体代码中没有return关键字 默认返回None
 	3.2 函数体代码有return 如果后面没有写任何东西还是返回None
 	3.3 函数体代码有return 后面写什么就返回什么
  	3.4 函数体代码有return并且后面有多个数据值 则会自动组成元组返回
  	3.5 函数体代码遇到return会立刻结束

函数的参数

形式参数
	在函数定义阶段括号内填写的参数 简称'形参'
    
实际参数
	在函数调用阶段括号内填写的参数 简称'实参' 

形参和实参的关系

形参和实参的关系
	形参类似于变量名 在函数定义阶段可以随意写 最好是见名知意
    def register(name,pwd):
        pass
    
    实参类似于数据值 在函数调用阶段与形参临时绑定 函数运行结束后立刻解除绑定	
    register('moon',123)	
    形参name与实参moon绑定 形参pwd与123绑定

作业

1.整理两天的内容 完成相应作业考核
2.使用函数将员工管理系统和文件进阶注册登录封装
def register():
    """注册功能"""
    username = input('请输入用户名:').strip()
    password = input('请输入密码:').strip()
    with open(r'userinfo.txt','r',encoding='utf8')as f:
        for line in f:
            real_name,real_pwd =line.split('|')
            if username == real_name:
                print('用户已存在,请重新注册')
            if username == line.split("|")[0]:
                print('用户已存在,请重新注册')

        else:
            with open(r'userinfo.txt','a',encoding='utf8')as f1:
                f1.write(f'{username}|{password}\n')
                print('注册成功')


def login():
    """登陆功能"""
    username = input('请输入用户名:').strip()
    password = input('请输入密码:').strip()
    with open(r'userinfo.txt','r',encoding='utf8')as f:
        for line in f:
                real_name,real_pwd = line.split('|')
                if real_name == username and real_pwd.strip('\n') == password:
                    print('登陆成功')
                    break
        else:
            print('登陆失败,用户名或密码错误')


while True:
    print("""
    1.注册
    2.登陆
    """)
    choice = input('请输入想要实现的功能编码:').strip()
    if choice == '1':
         register()
    elif choice == '2':
        login()
    else:
        print('没有此功能编号')

3.预习明日内容
	参数、名称空间、作用域

位置参数

"""
补充:当子代码只有一行并且很简单的情况下 可以直接在冒号后编写 不用换行
"""

位置形参
	函数定义阶段括号内从左往右依次填写变量名
    def fuc1(a, b, c):pass
位置实参
	函数调用阶段括号内从左往右依次填写的数据值
    func1(1, 2, 3)
    
def func1(a,b):
    print(a,b)
    
# func1(1,2)  # 按照位置一一对应传值
# func1(1)	 # 少一个不行
# func1(1,2,3)	#多一个也不行
# func1(b=1,a=2)	#关键字传参(实参)(指名道姓的传)
# func1(b=1, 2)	#关键字传参一定要跟在位置传参的后面 报错
# func1(2,b=1)	#可以
#func1(1,a=2, b=3)	# 同一个形参在调用的时候不能多次赋值

name = 'moon'
pwd = '123'
func1(name,pwd) # 实参没有固定的定义 可以传数据值 也可以传绑定了数据值的变量名

func1(a=name, b=pwd) # 实参没有固定的定义 可以传数据值 也可以传绑定了数据值的变量名

"""
越短的越简单的越靠前
越长的越复杂的越靠后

但是遇到下列情况除外
	同一个形参在调用的时候不能多次赋值
"""

默认参数

本质就是关键字形参(关键字实参在'位置参数'讲过了)
	别名交默认参数:提前就给了 用户可以传 也可以不传
        
'''默认参数的定义也遵循短的简单的靠前 长的复杂的靠后'''
def register(name, age, gender='male'):
    print(f"""
    -------------学员信息-------------
    姓名:{name}
    年龄:{age}
    性别:{gender}
	----------------------------------    
    """)
    register('moon',18)
    register('tony',28)
    register('玛丽',28, 'female')
    register('玛丽',28, gender='female')

可变长形参

 '''*的使用'''
def func1(*a):
    print(a)
# func1()   # ()
# func1(1)    # (1,)
# func1(1,2)  # (1, 2)

 def func2(b, *a):
    print(a, b)
# func2()  # 函数至少需要一个参数给到b
# func2(1)  # () 1
# func2(1, 2, 3, 4)  # (2, 3, 4) 1

"""
*号在形参中
	用于接收多余的位置参数 组织成(元组)赋值给*号后面的变量名
"""
'''**的使用'''
def func3(**k):
    print(k)
# func3()  # {}
# func3(a=1)  # {'a': 1}
# func3(a=1, b=2, c=3)  # {'a': 1, 'b': 2, 'c': 3}


 def func4(a,**k):
    print(a,k)
# func4() # 报错 函数至少需要一个参数给到a
# func4(a=1)  # 1 {}
# func4(a=1,b=2,c=3)  # 1 {'b': 2, 'c': 3}
# func4(a=1, b=2, c=3, x='jason', y='kevin')  # 1 {'b': 2, 'c': 3, 'x': 'jason', 'y': 'kevin'}

"""
**号在形参中
	用于接收多余的关键字参数 组织成{字典}的形式赋值给**号后面的变量
"""
 def func5(*a, **k):
    print(a, k)

# func5() # () {}
# func5(1, 2, 3)  # (1, 2, 3) {}
# func5(a=1, b=2, c=3)    # () {'a': 1, 'b': 2, 'c': 3}
# func5(1, 2, 3, a=1, b=2, c=3)  # (1, 2, 3) {'a': 1, 'b': 2, 'c': 3}


def func5(n, *a, **k):
     print(n,a, k)

# func5()  # 报错 函数至少需要一个参数给到n
# func5(1, 2, 3)  # 1 (2, 3) {}
# func5(111,a=1, b=2, c=3)    # 111 () {'a': 1, 'b': 2, 'c': 3}
# func5(a=1, b=2, c=3,n=111)  # 111 () {'a': 1, 'b': 2, 'c': 3}
# func5(1, 2, 3, a=1, b=2, c=3)   # 1 (2, 3) {'a': 1, 'b': 2, 'c': 3}

可变长实参

'''*的使用'''
def index(a, b, c):
    print(a, b, c)


# l1 = [11, 22, 33]
# t1 = (33, 22, 11)
# s1 = 'tom'
# se = {123, 321, 222}
# d1 = {'username': 'jason', 'pwd': 123, 'age': 18}
'''将列表中三个数据值取出来传给函数的三个形参'''
# index(l1[0], l1[1], l1[2])  # 11 22 33
# index(*l1)  # index(11, 22, 33)
# index(*t1)  # index(33, 22, 11)
# index(*s1)  # index('t','o','m')
# index(*se)  # index(321 123 222) 无序的
# index(*d1)  # index('username','pwd','age')
"""
*在实参中
	类似于for循环 将所有循环遍历出来的数据按照位置参数一次性传给函数
"""
'''**的使用'''(只针对字典)
def index(username, pwd, age):
     print(username, pwd, age)
 d1 = {'username': 'jason', 'pwd': 123, 'age': 18}
方法1:
 index(username=d1.get('username'), pwd=d1.get('pwd'), age=d1.get('age'))
方法2:**的使用
 index(**d1)  # index(username='jason',pwd=123,age=18)

"""
**在实参中
	将字典打散成关键字参数的形式传递给函数
"""
def index(*args, **kwargs):
    print(args)  # (11, 22, 33, 44)
    print(kwargs)  # {}
    
# index(*[11, 22, 33, 44])  # index(11, 22, 33, 44)
# index(*(11, 22, 33, 44))  # index(11, 22, 33, 44)

命名关键字参数(了解)

'''形参必须按照关键字参数传值>>>:命名关键字参数'''


def index(name, *args, gender='male', **kwargs):
    print(name, args, gender, kwargs)

index('jason',1,2,3,4,a=1,b=2) 
# jason (1, 2, 3, 4) male {'a': 1, 'b': 2}
index('jason', 1, 2, 3, 4, 'female', b=2)
# jason (1, 2, 3, 4, 'female') male {'b': 2}
posted @ 2022-10-09 19:22  Super小赵  阅读(63)  评论(0编辑  收藏  举报
****************************************** 页脚Html代码 ******************************************