函数基础

函数基础

1. 函数基础

1.1 什么是函数
	函数是保存代码的工厂,也可以说是一个保存代码的容器,把具体功能封装到一个函数里面  方便以后调用  
1.2为何要用函数
	为了减少代码冗余,增加代码可读性
    为了便于维护 
1.3如何用函数
	1.3.1定义函数 语法  定义函数发生的事情
    	函数的使用原则 先定义.后调用
        #语法
    	def 函数名(形参1,形参2.....):    #形参可有可无  看具体情况
        	```
            这个函数的介绍
            ```
            代码体1
            代码体2
            代码体3
            .......
            return   # 可有可无  看具体情况
        #定义函数发生的事情1:申请一块内存区域,代码体放进去
        (2:把内存地址赋值给,函数名
	1.3.2调用函数 
    	函数名字()
        根据函数名绑定的内存地址 指向保存代码的内存区域 执行代码体
        也可以这么说,函数的内存地址()触发函数体代码的运行
	1.3.3函数定义阶段:只检测语法不执行代码
        def name():
        	asdfg  # 这是一个变量名,语法没错误 
        	print("今天心情真高兴")
            print("哈圣诞节哦我"          #报错 语法错误
            结:asdfg语法没有错误, ,,,, print("哈圣诞节哦我"  : 有语法错误 
	1.3.4函数调用阶段:才会执行函数体代码
        def name():
              # 这是一个变量名,没有给他赋值,就引用
            print("今天心情真高兴")
            pwd()
        #name()
        def pwd():
            print('from pwd')

        #2 name() 
        结论:调用name正常运行      在pwd之上调用报错显示pwd未定义     
        

2.函数定义与调用

2.1函数定义三种形式
	2.1.1有参函数
    def zhang(x,y):
    	print(x + y)
    zhang(1+22.2.2无参函数
    def zhang():
    	print('好好学习,天天向上')
    2..2.3空函数
    def zhang()
    	pass
#储备知识  函数返回值 return
# 注意:函数体内可以有多个return,但是只要执行一次整个函数就会立即终止并且将其后之当做本次的结果返回
return有三种形式 如下
#return 值:返回一个值
	def haha(x):
        return x
    x=haha(5)
    print(x)
返回结果 5
#return 值1,值2,值3:返回一个元组
	def haha(x,y,z):
        return x ,y,z
    x=haha(5,6,2)
    print(x)
返回结果(5, 6, 2)  返回多个值就自动存成元组
#没有return:默认返回None
	def haha(x):
        pass
    x=haha(5)
    print(x)
返回结果 None  没有return默认返回None
#return None 返回None
def haha(x):
    return  None
x=haha(5)
print(x)
返回结果 Nonereturn返回None
2.2函数调用三种形式
	def foo(x,y):
    return x + y	
	2.2.1语句形式
     foo(1,2)
	2.2.2表达式
    res = foo(1,2) * 10
    print(res)
	2.2.3函数的调用可以当做一个参数传给另外一个函数
    res = foo(foo(1,2),3)
	print(res)

3.函数参数

函数的参数分为两大类
1、形参: 在函数定义阶段括号内指定的参数(变量名),称之为形式参数,简称形参
2、实参: 在函数调用阶段括号内指定的参数(变量值),称之为实际参数,简称实参
形参分为 
	3.1	位置形参:在函数定义阶段,按照从左到右的顺序依次定义的“变量名”
#    特点:必须被赋值,多一个不行少一个也不行
        def meng(x,y,z):
            print(x,y,z)
        meng(1,2,3)
        ---------------------------------------------------------
	3.2默认形参:在函数定义阶段,就已经为某个形参赋值了,该形参称之为默认形参
#特点:调用阶段可以不用为其赋值,可以赋值,会被之前的覆盖掉
    	def meng(x,y=18):
   		    print(x,y)
	        meng(10)
     #注意 
		#1可以混用位置形参与默认形参,但是默认形参必须放在后面
          def foo(y=22,x):  # 错误
		#2大多数情况传入的值都没变化,就应该将对应的形参定义为默认形参
        def foo(x,y=222):
        #对于每次传入的值都可能不一样的,就将其对应的形参定义为位置形参
        def meng(x,y,z)
		#3默认形参的值尽量定义成不可变类型
        def foo(x,y=222):   y尽量是不可变类型  不要用字典列表 集合
---------------------------------------------------------
    3.3 位置实参:在函数调用阶段,按照从左到右的顺序依次传入的“变量值”
    def meng(x,y,z):
        print(x,y,z)
    meng(1,2,3)
    ---------------------------------------------------------
    3.4 关键字实参:在函数调用阶段,按照key=value的形式赋值
    def meng(x,y,z):
        print(x,y,z)
   meng(y=12,z=33,x=10)
     #注意:可以混用位置实参与关键字实参,但是1、关键字实参必须在后 2、不能给同一个形参重复赋值
    def foo(x,y,z):
    	print(x,y,z)
	foo(10,20,30,y=40)
    ----------------------------------------------------------
    3.5*args与**kwargs用在形参中:汇总行为
    	3.5.1 *用在形参中: *会将溢出的位置实参存成元组然后赋值给紧跟其后的形参名
		def foo(x,*args):       #个人理解*输出元组,,,赋值时候直接给value就好
			print(x)
			print(args)
		foo(20,30,50,4,134,46)
        输出结果
         20
		(30, 50, 4, 134, 46)
          ---------------------------------------------------------  
        3.5.2 **用在形参中:**会将溢出的关键字实参存成字典然后赋值给紧跟其后的形参名
        def foo(x,**kwargs):       #个人理解key=value赋值给字典  ,key可以随便指定abcdefg....
			print(x)
			print(kwargs)
		foo(1,y=2,z=4,s=50)
        输出结果
         1
		{'y': 2, 'z': 4, 's': 50}
        ---------------------------------------------------------	
    3.6***用在实参中:打撒
    	3.6.1 *用在实参中: *会将紧跟其后值打撒成位置实参
            def foo(x,y,z):    
                print(x,y,z)
            foo(*(11,22,33))    #相当于foo(111,222,333)   输出 111 222 333
            foo(*"hello")       # 相当于 foo('h','e','l','l','o')会报错,因为给的值太多了,接受只有三个     报错信息takes 3 positional arguments but 5 were given
         ---------------------------------------------------------   
        3.6.2**用在实参中: **后只能跟字典,**会将紧跟其后字典打撒成关键实参
            def foo(x,y,z):
            print(x,y,z)
            foo(**{'x':111,'y':222,'z':333})  # 相当于 foo(x=111,z=333,y=222)
          ---------------------------------------------------------  
            
posted @ 2021-08-06 19:29  迪迦张  阅读(66)  评论(0编辑  收藏  举报