#!/user/bin/env python
# -*- coding:utf-8 -*-
# 1.基本概念:函数的格式 def 开头 第二行注释后面跟逻辑代码块。最后是return返回值。不跟return返回值的叫做过程。
# def tex(x,y):
# r=x**y
# return r
# y=tex(3,2)
# print(y)
# def tex(x,y):
# r=x**y
# return r
# # y=tex(3,2)
# # print(y)
# a=3
# b=4
# y=tex(a,b)
# print(y)
#
# def tex(x,*y):
# print(x)
# print(y)
# y=tex(3,2)
# print(y)
# r=tex(2,3,4,5,6,7,8,9)
# 2.函数分为形参和实参,定义函数时候的参数为形参。而使用此函数时候写入的值为实参,形参不占内存。实参占内存空间
# 例如:
# def tex(x,y):#括号里的X和Y为形参
# r=x**y
# return r
# y=tex(3,2)#括号里的3和2为实参。
# print(y)
# 3.使用函数时写入的参数要与定义函数里的形参一一对应。这种一一对应的参数叫做位置参数,使用位置参数写入的实参不能多也不能少必须是一一对应
# 的,有多少个形参,使用的时候需要写入多少个实参。需要多个数值传入的话,我们可以使用扩展的*和**例如:
# def text(x,y,z):
# print(x)
# print(y)
# print(z)
# text(1,2,3) #写入的1,2,3实际上在此就是 x=1 y=2 z=3 里面定义的少了或多了都会报错。
# 4.关键字参数,在使用某个函数的时候。可以把形参直接通过=对应的形式写入例如:
# def tex(x,y,z):
# r=x+y-z
# print(z)
# return r
# # q=tex(3,4,2) #此为位置参数
# q=tex(z=4,y=3,x=2) #此为关键字参数
# print(q)
# 5.关键字参数和位置参数可以混合使用。但关键字参数必须在位置参数左边,并且参数要保证不能多也不能少
# 例如:
# def tex(x,y,z):
# r=x+y-z
# print(z)
# return r
# q=tex(x=3,4,5)#这样写是错误的会报错
# s=tex(3,y=4,5)#这样写也是错误的不被允许的
# w=tex(3,4,z=5)#这样写才是符合规则的
# w=tex(3,y=4,z=5)#这样写也可以。符合在位置参数左边,
# w=tex(3,4,z=5,y=6)#这样多写是错误的,
# w=tex(3,y=5)#一样会报错。因为少了最大前提。参数必须是对应,不能多也不能少的。
# print(w)
# 6.默认参数,定义形参的时候。已经定义的默认值,在不给它传入实参的时候,会按默认的值输出。例如
# def text(x,type="sql"):
# print(x)
# print(type)
# # text(2)#此时没有给type传入参数,则会按我们定义的默认值输出,
# text("nihao","大家伙")#当我们传入参数的时候,则会按我们传入的实参输出。
# 7.形参扩展,当我们不能确定定义这个函数到底会使用多少个值时候可以预留起来,一个为元祖*args,一个为字典**kwargs,也可以用别的名字。不过我们
# 最好是用这两个定义。例如:
# def fuc1(x,*args):
# print(x)
# print(args)
# print(args[0])
# fuc1(2,4,5,6,7) #2会直接传给X,剩下的几个数字会作为元祖赋值给args,我们也可以用索引取出来某个数值
# fuc1(3,[4,5,6,7],(8,9,10.1))#当我们直接传入一个列表的时候,会把列表作为一个整体传入给args,当我们在想取出4的时候就成了args[0][0]
# fuc1(9,{2:4,5:8,9:10},[2,3])#当我们传入字典和列表混合的时候,同样也是把整个字典和列表作为元祖一个元祖输出在用索引取字典的值会直接报错
#因为字典是无序的不能这样取值。
# fuc1(2,*[7,8.9,11])#当我们前面加上*号的时候则会把列表里的所有值遍历一遍输出给元祖,传入元祖也是同样的结果
# fuc1(4,*(9,10,11,12))#同上
# fuc1(3,*{4:3,5:6})#这样只能取出来key没有实际意义,如果想实现字典需要用**kwargs
# def fuc2(x,**kwargs):
# print(x)
# print(kwargs)
# fuc2(3,4,6,5)#当我们用**的时候这样传值是不允许的,**后面跟的是字典
# fuc2(2,a=3,b=4,c=5) 我们需要这样传值给它
# dict1={"a":4,"5":6,"7":8}
# fuc2(4,dict1)#传值是错误的。
# fuc2(3,**dict1)#这样使用才是正确的。
# 7.混合使用。需要遵守函数的基本规则。
def fuc3(x,*args,**kwargs):
print(x)
print(args)
print(kwargs)
fuc3(3,4,5,6,7,a=7,b=8,e=9)#按位置参数传值得出结果
# x输出3
# args输出(4, 5, 6, 7)
# kwargs输出{'a': 7, 'b': 8, 'e': 9}