函数
 
什么是函数?
 
function  英文  ->  函数,功能
函数就是一个具有特定功能的语法结构。
作用:提高代码的复用率,提高开发效率,减少后期的维护成本
 
定义函数
 
【基本结构】:
def 函数名():
    实现函数功能的代码
    实现函数功能的代码
    实现函数功能的代码
    ...
 
举个例子:
 
def man(name
,sex
):
    '''
    这个函数的功能是造一个奥特曼
    name:这里写你给奥特曼取得名字
    sex:这里写奥特曼的性别
    '''
    print(name
)
    print(sex
)
man
("大锤","男")
 
特征:
    1.函数不调用不会执行
    2.函数可以调用N次不受次数限制
函数名的定义:
    1.推荐使用英文,可以使用拼音,不可以使用汉字
    2.可以使用数字,但是不能以数字开头
    3.不可以使用特殊字符,除了下划线_
    4.函数名严格区分大小写
    5.函数命名要有意义
    6.函数名不能和系统保留关键字冲突
    7.函数名尽量不要和系统已存在的内建函数同名,以免覆盖内建函数
 
函数的参数
 
(1)函数参数概念及分类
    函数参数:调用时需要传递的数据.
    函数参数大类分为形参和实参:
        形参意思: 函数定义时的参数
        实参意思: 函数调用时的参数
    形实关系:函数调用时,形参和实参个数需要一一对应
    形参种类: 普通参数,默认参数,普通收集参数,命名关键字参数,关键字收集参数
    实参种类: 普通实参,关键字实参
(2)普通参数(位置参数)普通的参数,接收实参传递的值
(3)默认参数:位于普通参数后面,具有默认值的参数
		语法:(x,y=2)   y就是默认参数
(4)收集参数:
	普通收集参数:用于专门收集多余普通参数的是普通收集参数,形成一个新的元组
		语法:参数前面加*	例:*args
	关键字收集参数:用于专门收集多余关键字实参的是关键字收集参数,形成一个新的字典
		语法:参数前面加**	例:**kwargs	
(5)命名关键字参数:定义时放在*号后面的参数,调用时强制必须传入指定参数名才能调用
		语法:(a,*,x) x是命名关键字参数
   如果函数参数中已经有了收集参数,那么收集参数后面的参数即为命名关键字参数
   		语法:(*args,x,y)
(6)形参声明的位置顺序:
	普通参数 -> 默认参数 -> 收集参数 -> 命名关键字参数 -> 关键字收集参数
	def func(a,b,c=1,*args,d,**kw)
	a,b为普通参数,c是默认参数,args是收集参数,d是命名关键字参数,kw是关键字收集参数
	极少出现五种参数同时出现的情况
	def func(a,b=2,*,c,d,**kw)
	a为普通参数,b是默认参数,c,d是命名关键字参数 ,kw是关键字收集参数
(7)#注意:实参将值传递给形参的过程,本质上就是变量赋值操作
 
所有参数的摆放问题:
 
1.实参:普通实参在前,关键字参数在后
2.形参:
    关键字收集参数一定在最后出现
    收集参数推荐在普通参数之后使用
    推荐顺序:普通形参,收集参数,关键字收集参数
 
函数文档
 
1.使用help函数查看
	help(函数名)
2.函数名.__doc__
	print(id.__doc__)
 
接下来就使用之前的那个代码来试验一下help函数查看:
 
def man(name
,sex
):
    '''
    这个函数的功能是造一个奥特曼
    name:这里写你给奥特曼取得名字
    sex:这里写奥特曼的性别
    '''
    print(name
)
    print(sex
)
man
("大锤","男")
print(help(man
))
 
函数的返回值
 
函数执行完毕之后可以得到一个结果,该结果可以被接受或者使用
 
函数划分为两大类:
 
执行过程函数:函数执行之后没有任何结果可以在函数之外接收到(没有return语句的函数)
 
res 
= print("你好")
print(res
)
None 空值
 
具有返回值的函数:函数执行之后可以返回一个结果到函数之外被接收或者使用(具有return语句)
 
 
res 
= id(1)
print(res
)
 
 
def play(name
):
    print(name
,"要变身啦!")
    return name
+"变成了假面骑士"
res 
= play
("小刚")
print(res
+"小智吓傻了")
print(play
("小刚"))
 
 
return:返回的意思
执行过程函数:送外卖的,把外卖送给客户,结束了(送外卖是过程,送完之后没得到任何东西)
具有返回值的函数:送外卖,把外卖送给客户,结束了得到了钱(送外卖是过程,送完之后得到了钱)
return的另外一个作用:
终止函数执行,函数运行过程中一旦执行了return语句,那么函数就会结束执行。
 
 
def play():
    print("hello")
    return 1
    print("世界")
play
()
 
 
id()  具有返回值的函数
type() 具有返回值的函数
int()  具有返回值的函数
....
所有函数都是有返回值的,只是执行过程函数的返回值是None
例:print() 执行过程函数   没有返回值 只有一个None值 (None表示没有值)
return四问:
1.可以在函数里面写多个return 语句吗? 可以,但不能是在同个作用域下
 
def func(name
):
    if name 
== "小红":
        return "小红你来啦"
    elif name 
== "小明":
        return "小明滚出去"
    elif name 
== "小强":
        return "杀虫剂呢?"
    else:
        return "名字未出现在名单中"
res 
= func
("小绿")
print(res
)
 
2.拓展之后我们还可以写一个具有返回值的函数,模拟其他数据类型转换成字符串的函数
 
def str1(input_str
):
    return str(input_str
)
list1 
= [1,2,3,4]
res 
= str1
(list1
)
print(res
,type(res
))
 
3.而我们大家知道其他数据类型转换为list,int类型转换时是会报错的,但是我们可以写一段代码让它们在转换的时候不会报错
 
def list1(input_type
):
    if isinstance(input_type
,int):
        
return "对不起,int类型无法转换成列表"
    else:
        return list(input_type
)
num 
= 1
res 
= list1
(num
)
print(res
)
 
4.return 可以返回多个值吗?可以,会组成一个元组
 
def func():
    return "你好",1,"world",[1,2,3,4]
res 
= func
()
print(res
,type(res
))