Python是个啥-第五章 函数(1)

第五章 函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

5.1 函数介绍

5.1.1 函数特征

​ 将N行代码拿到别处并命名,通过代码调用的方式执行。

5.1.2 使用场景

  • 代码重复执行。
  • 代码量特别多(超过一屏),可用函数分割。

5.2函数的基本结构

5.2.1函数定义

def 函数名 ():  #函数名的命名规则和变量一致
    #函数描述
    pass
函数名()  #函数执行
def check():
    #check函数测试
    print('111')
check()   #函数调用,如果函数不被调用,则函数代码永远不会执行

5.2.2 函数的返回值

return() #返回值,如果没有定义返回值,返回值默认返回Null。

print和return的区别:print 仅仅是打印在控制台,而 return 则是将 return 后面的部分作为返回值作为函数的输出,可以用变量接走,继续使用该返回值操作。

函数在执行过程中如果遇到了return,则后面的代码不再继续执行。

#输入一个字符串计算X的个数
def lences(arg):
    data = input(">>")
    if len(data) == 0:
        return False
    else:
        count=data.count(arg)
        return True
print(lences('X'))

5.2.3 函数作用域

作用域即作用的区域,也可以理解为全局参数局部参数。全局作用域作用域全局,一般放在页面的头部,局域作用域作用域区域内部,例如函数作用域,即函数内部的参数,只作用域函数内部。

作用域查找规则,有限自己的作用域查找,如果没有就去父作用域超找,如果还是没有就想再上级的作用域超找,直至根作用域(全局变量)。

python中一个函数是一个作用域.

定义规范:全局变量改成全大写

x=1
def list1():
    print('x=%s'%x)
def list2():
    # print(x)  #这样会报错,如果函数内部没有定义全局参数则可以直接调用,如果函数内部有对全局参数重新定义则需要先定义之后再调用,所以变量需要定义在函数的起始位置
    x=0
    print('x=%s'%x)
list1() #x=1
list2() #x=0
print('x=%s'%x) #x=1

5.2.4 强制作用域 (强力建议不要这样用)

函数内部定义的变量强制作用域全局输入global 变量名,定义变量。

x=1
def list1():
    global x
    x=0
    print('x=%s'%x)
list1() x=0
print(x) x=0

nonlocal 作用于父域,应用于函数嵌套


5.3 函数的参数

5.3.1 函数参数介绍

函数参数包含形参和实参两种,可以是任意数,任意类型。

  • 形式参数(形参)

  • 实际参数(实参)

    def check(msg): #msg形参
      #check函数测试
      print(msg)
    check('实参')   #函数调用,如果函数不被调用,则函数代码永远不会执行
    

5.3.2 位置参数

  • 关键字穿参,

    def func(name,age):
    print(name,age)
    func(age=99,name='playon',) #关键字传参,参数位置可以不按照顺序
    
  • 位置传参,位置一一对应

    def func(name,age)
    print(name,age)
    func('playon','99') #位置传参必须以一对应
    
  • 混合传参
    位置参数必须在关键字传参前面,否则会报错。

    def func(name,age):
      print(name,age)
    func('allen',age=99) #位置参数必须在关键字传参前面,否则会报错。
    #func(age=99,'allen',)  #错误
    #func(name='allen',19)  #错误
    
  • 默认参数
    默认参数可以传入实参也可以不传入实参,不传入的时候按照默认值执行。

    def func(name,age=23):
        print(name,age)
    func('allen') #按照默认执行age=23
    func('allen','21') #实参传入age=21
    func('allen',age=22) #关键字传参,实参传入age=22
    
  • 万能参数( * 和 ** )
    *args(一般规范):可以接受任意一个数的参数,并将参数转换成元组,并且只能用位置传参.

    **kwargs (一般规范):可以接受任意个数的关键字参数,并将其转换为字典。

    def func(*args):
        print(args)
    func(1,2,3,4,5,['age','sex',1],'allen') 
    func(*(1,2,3,4,5,['age','sex',1],'allen',)
    #(1, 2, 3, 4, 5, ['age', 'sex', 1], 'allen'),多值以元组传入函数
    
    def func(a1,*args,a4):
        print(args)
        print(a4)
    func(1,2,3,4,3,a4=55) #a1=1,args=(2,3,4,3),a4=55
    
    def func(**kwargs):
        print(kwargs)
    func(**{'k1':'1','k2':2})  # kwargs = {'k1': '1', 'k2': 2}
    func(k1='1',k2=2) #kwargs = {'k1': '1', 'k2': 2}
    
  • 综合应用

    def func(*args,k2=0,**kwargs):
        print(args)
        print(k2)
        print(kwargs)
    func(k1='1',k2=2,k3='val') #args=(),k2=2,kwargs={'k1': '1', 'k3': 'val'}
    
    def func(*args,k2=0,**kwargs):
        print(args)
        print(k2)
        print(kwargs)
    func(1,2,3,4,5,k1='1',k2=2,k3='val') #args=(1,2,3,4,5),k2=2,kwargs={'k1': '1', 'k3': 'val'}
    func(*[1,2,3,4,5],k1='1',k2=2,k3='val') #args=(1,2,3,4,5),k2=2,kwargs={'k1': '1', 'k3': 'val'}
    
  • 注意事项

    函数的默认参数不要写成可变类型,否则会有陷阱。

    def func(a,b=[]):  #默认参数包含可变内容
        b.append(a)
        return b
    v1=func(2)
    v2=func(2,[11,12])
    v3=func(22)
    print('v1=',v1) #[2] 原则上应该是[2]  
    print('v2=',v2) #[11, 12, 2] 原则上应该是[11,12,2]
    print('v3=',v3) #[2, 22] 原则上应该是[22] 
    print('v1=',v1) #[2, 22] 原则上应该是[2]
    
  • 递归限制

    python默认递归限制1000次

    #递归示例
    def func():
        print(1)
        func()
    func()
    

函数类型

高阶函数

装饰器

案例

posted @ 2019-07-19 16:30  PlayOn  阅读(103)  评论(0编辑  收藏  举报