# -*- coding:utf-8 -*-
#yys
#python 3.7.2
# 1.定义函数、调用函数
# 函数:组织好的、可重复使用的、用户实现单一或者关联功能的代码段。
# 函数能够提高应用的模块性和代码的重复利用率。
# Python提供了很多内置的函数,比如len等等,
# 另外也可以根据自己的业务需求进行用户自定义函数的创建。
# 1.1 函数的定义规则
# 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
# 任何传入参数和自变量必须放在圆括号中间。
# 函数的第一行语句可以选择性地使用文档字符串---用于存放函数说明。
# 函数内容以冒号起始,并且缩进。
# 语法如下:
# def 函数名([参数列表]): #参数列表可选项
# 函数体
def f1():
print("good night")
def f2(x1,x2):
x3=x1+x2
print("函数体内部")
return x3
f1()#调用函数
# good night
x=f2(1,2)
print(x)
#函数体内部
#3
# 1.2 调用函数
# Python内置了很多函数,内置函数可以直接调用。
# 调用一个函数需要知道函数的名称和函数的参数。
# 语法:
# 函数名([参数列表])
# 函数名其实就是指向一个函数对象的引用,完全可以把函数名赋值给一个变量,相当于给这个函数起了一个别名
list1=[2,3,4,5,6]
a=len #变量a指向len函数
print(a(list1))
# 5
# 2.函数参数
# 2.1 形参和实参的概念
#def定义的函数中参数是形参(形式参数),函数调用传入的是实参(实际参数)
#定义函数
def fun0(Name):#Name为形参
print("hello"+Name)
#调用函数
fun0('yys')#yys为实参
# helloyys
# 2.2 针对形参、实参进一步分类有 :
# 函数参数分类
# 2.2.0必备参数
# 函数定义中允许拥有多个形参,因此函数在调用的时候,也可能包含多个实参。
#这些必须要传入函数的参数即必备参数;(不传入就会报错)
# 向函数传递参数的方式有很多,通过实参和形参的顺序对应,这就是位置实参。
# 只有位置一致,才能被正确匹配。位置实参是最简单也最常用的关联方式。( (arg1, arg2), 注意数量和顺序)
def fun1(a): #必备参数
print('必须传参数') #'调用:fun1(a)必须传参数
# 2.2.1 默认参数
# 函数定义的时候,设置的参数是形参。那么也可以给每个形参指定一个默认值。
# 当调用函数时,如果没有传入实参,就使用形参的默认值。
# 如果调用的时候传入了实参,那么程序将使用传入的实参,有默认值的放右边。
#即参数可传可不传,即可指定;当不传入参数是,该参数为之前指定的参数;
def fun2(a=3): #参数可传可不传,可指定
print(a,'默认参数')
fun2()
# 2.2.2关键字参数(关键字实参)
# 关键字实参是传递给函数的名称 = 值对。
# 直接在实参中将名称和值关联起来,因此向函数传递实参时不会混淆。
# 函数调用使用关键字参数来确定传入的值。
# 使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为Python解释器能够用参数名匹配参数值.
def fun3(pet1,pet2):
print(pet1,pet2)
fun3(pet1="猫猫",pet2="狗狗")
# 猫猫 狗狗
# 2.2.3 不定长参数
# 你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数。
#第一种不定常参数函数
def fun4(*arg): #结果都包装成元祖; (传0个或者0个以上的参数)
print(arg)
fun4(1,2,3,4) # (1, 2, 3, 4)
# 第二种不定常参数函数
def fun5(**kwarg): #参数可传可不传, 结果包装成字典; (传0个或者0个以上的参数)
print(kwarg,'可传可不传')
fun5()#{} 可传可不传
fun5(a="字典1") #注意实参的第一个为变量,形式为变量=value的形式
# {'a': '字典1'} 可传可不传
fun5(a="字典1",b="字典2")# #注意实参的第一个为变量,形式为变量=value的形式
# {'a': '字典1', 'b': '字典2'} 可传可不传
fun5(**{'c':1,'d':2,"4":4}) #加两个* 号,可以传递字典作为参数。键必须是字符类型。
# {'c': 1, 'd': 2, '4': 4} 可传可不传
dict1={1:2}
print(dict1)
# {1: 2}
#2.2.4 混合参数1
def fun6(e,f=1): #必备参数必须放在前面,否则报错
print(e+f)
fun6(e=2,f=3)
# 5
fun6(e=6)
# 7
fun6(9,10)
# 19
fun6(12)
# 13
# 2.2.5 混合参数函数2
# 要点,
# 定义的时