#今天来学习一下函数,function
# 定义一个函数的时候,函数不会被执行,只有调用函数,函数才会执行
#
# 定义函数
# # 1、def是创建函数的关键字,创建函数
# # 2、函数名
# # 3、()
# # 4、函数体
# # 5、返回值
#
#
# try:
# 扑捉这段代码的执行
# except:
# 如果失败,则执行这里的语句
#
# else:
# 如果成功,则执行这里的语句
#
# 执行函数
#
# 函数名()
#
# 类似这样定义一个函数
#
#
# def 取快递():
#
#
# xxxxx
# xxxxx
# xxxxx
#函数遇到return后就不会继续执行后面的语句
# def my_first_function ():
# username = 'Bob'
# _username = input('Input name:')
# if _username == username:
# return "Welcome login"
# else:
# return "Username is Invalid"
#
# result = my_first_function()
# print(result)
#如果在函数中没有定义任何一个return,则python会给一个默认的返回值,none
# def f2():
# print("hi,everybody")
# ret = f2()
# print(ret)
#学习一下形参和实参,这里要注意,形参是定义函数的时候定义的,实参是调用函数的传给函数的,实参和形参要一一对应,且顺序要一致,第一个实参对应第一个形参,第二个
#实参对应第二个形参,以此类推
# def send(address,content,name): #这里是形参
# print('send to',address,'成功','内容是',content,'名字是',name)
# return True
# while True:
# em = input("input address:")
# result = send(em,'SB','Bob') #这里是实参
# if result == True:
# print('发送成功')
# else:
# print('发送失败')
#函数的默认参数,如果形参有三个参数,而其中有一个是默认参数,则实参只需要传2个或者3个都可以,如果是2个,则第三个参数用默认值来显示,如果传三个参数,则第三个参数
#用传递的参数代替,这里有个重点,就是如果要设置默认参数,则必须要放在形参的最后面,可以有多个默认的形参,但是都要放在最后面
#这里是定义了三个参数,其中name这个参数是默认参数,有默认值,但是实参传了三个参数,所以就没有使用默认值
# def send(address,content,name='Bob'):
# print('send to',address,'成功','内容是',content,'名字是',name)
# return True
# while True:
# em = input("input address:")
# result = send(em,'SB','ale')
# if result == True:
# print('发送成功')
# else:
# print('发送失败')
#这里是定义了三个参数,其中name这个参数是默认参数,有默认值,但是实参传了两个个参数,所以name就使用了默认参数
# def send(address, content, name='Bob'):
# print('send to', address, '成功', '内容是', content, '名字是', name)
# return True
# while True:
# em = input("input address:")
# result = send(em, 'SB')
# if result == True:
# print('发送成功')
# else:
# print('发送失败')
#指定参数,前面是默认实参和形参的是按照顺序一一对应的,下面可以指定哪一个形参对应哪个实参,不需要按照顺序一一对应
# def send(address, content):
# print('send to', address, '成功', '内容是', content)
# return True
# while True:
# em = input("input address:")
# result = send(address='55666@126.con',content=em)
# if result == True:
# print('发送成功')
# else:
# print('发送失败')
# *号,表示可以接受n个实参,然后放在把所有的实参放到一个叫args的tuple中
# def f1(*args):
# print(args)
# print(type(args))
# f1(11,22,33,'aaad','bbbb')
#这里也可以传一个列表进去,但是把这个列表当做元组的一个元素
# list1 = [11,22,33,44]
# list2 = [66,77,8,8]
# def f1(*args):
# print(args)
# print(type(args))
# f1(list1,list2)
#如果传递的实参的前面有个*号,我们来看下效果,不论传递的是list和str,相当于一个for循环,把list中或者字符串的每个元素当做形参的一个元素
# name = '1234'
# list1 = [11,22,33,44]
# def f1(*args):
# print(args)
# f1(list1)
# f1(*list1)
# f1(*'abcd')
# f1(*name)
#前面的形参是有一个*号,其实还可以形参前也可以有两个*号,那么在调用函数的时候传递实参的时候要用dict的方式传递实参,不然会报错,这里要注意下传递形式,传参的使用要用
#=号
# def f1(**args):
# print(args)
# print(type(args))
#
# f1(n1='cccc',n2='dddd')
#直接传递一个dict进去,如果用这样的方式,是把整个dict当做一个元素
# dict1 = {'name':'Bob','age':12,'job':'it'}
# def f1(**args):
# print(args)
# print(type(args))
#
# f1(k=dict1)
#如果实参中有两个*号,则把dict中的每个元素当做一个元素传递给形参
# dict1 = {'name':'Bob','age':12,'job':'it'}
# def f1(**args):
# print(args)
# print(type(args))
#
# f1(**dict1)
#总结下函数传参
# 1、普通参数,严格按照输入的顺序,将实参和形参一一对应
# 2、默认参数,必须放在形参的最后
# 3、指定参数,将实际参数赋值给形参
# 4、动态参数
# 4-1、* 默认将传入的参数,全部放到列表中,如果传实参的加一个*,会对list或者字符串做一个for循环,把把实参的每一个元素当做一个元素传递给形参
# 4-2、**默认将传入的参数,全部放到字典中,如果传实参的加一个**,会对dict做一个for循环,把把实参的每一个元素当做一个元素传递给形参
# 5、万能参数,就必须下面的列子,会自动把list或者str的参数传递给args,把dict传递给kwargs,且在写形参的时候,一定要把一个*args放在前面,**kwargs
# 放在后面
# def f1(*args,**kwargs):
# print(args)
# print(kwargs)
#
#
# f1(11,22,33,44,k1='bob',k2='ale')
#其中python中的另外一个格式化输出就用到万能传参的方法
# def format(self, *args, **kwargs): # known special case of str.format
# s = 'i am {0},age is {1}' .format('bob',34)
# print(s)
#
# s = 'i am {0},age is {1}' .format(*['bob',34])
# print(s)
# s = 'i am {name},age is {age}' .format(name='Bob',age='23')
# print(s)
# dict = {'name':'Bob','age':12}
# s = 'i am {name},age is {age}' .format(**dict)
# print(s)