9、Python函数的定义与使用

Python函数的定义与使用

1、函数的分类

  • 内置函数

    print id int str max min range

  • 自定义函数

    通过关键字def的功能实现python中函数的创建

2、通过关键字def定义函数

def name(args…):

​ todo something..

​ 返回值

3、关键字def函数的执行

def say_hello():
	print('hello world')
say_hello() # 函数名+小括号执行函数

4、函数结果的返回——return

  • 将函数结果返回的关键字
  • return只能在函数体内使用
  • return支持返回所有的python类型
  • 有返回值的函数可以直接赋值给一个变量

举例:

def add(a,b):
	c = a + b
	return c
result = add(a=1, b=1) #参数按顺序传递
print(result)
  • return与print的区别
    1. print只是单纯的将对象打印,不支持赋值语句
    2. return是对函数执行结果的返回,也支持赋值语句

5、函数的传参

  • 形参与实参

    函数名中定义的参数为形参,在函数调用的时候,给函数名中的形参传递的参数为实参

  • 必传参数

    在定义函数的时候,没有默认值且必须在函数执行的时候传递进去的参数,实参的数量和形参的数量保持一致

    1. 函数中定义的参数没有默认值,在调用函数时如果不传入则报错
    2. 在定义函数的时候,参数后边没有等号与默认值

    错误:def add(a=1, b=1) x

  • 默认参数

    在定义函数的时候,定义的参数含有默认值,就说他是一个默认参数

  • 不确定参数——可变参数

    1. 没有固定参数的函数,需要传递不确定参数(不知道要传的参数名具体是什么)

    2. *args 代表: 将无参数的变量合并成元组

    3. **kwargs 代表将有参数与默认值的赋值语句合并成字典

  • 传入元组及列表类型的数据

    当调用函数时参数是元组或列表类型的数据时,可以在变量名前添加*进行解包

  • 传入字典类型的数据

    当调用函数时参数是字典类型的数据时,可以在变量名前添加**进行解包

  • 关键字参数

    注意:关键字和形参能够匹配上,并且实参的顺序可以任意

  • 参数规则

    def add(a, b=1, *args, **kwargs)

    1. 参数的定义从左到右依次是 必传参数,默认参数,可变元组参数,可变字典参数
    2. 函数的参数传递非常灵活
    3. 必传参数与默认参数的传参多样化

6、函数的参数类型定义

  • 参数类型定义的方法

    1. 参数名+冒号+类型函数
    2. 参数名+冒号+类型函数+等号+默认值
    def person(name:str, age:int=33):
        print(name, age)
    
  • 函数定义在python3.7之后可用

  • 函数不会对参数类型进行验证

7、局部变量与全局变量

  • 全局变量

    # coding:utf-8
    name = 'david'  # 在python脚本最上层代码块的变量就是全局变量
    def test():
        print(name) # 全局变量可以在函数内被读取使用
    
  • 局部变量

    # coding:utf-8
    def test():
        name = 'david' # 在函数体内定义的变量就是局部变量
        print(name) # 局部变量无法再自身函数以外使用
    
  • global

    将全局变量可以在函数体内进行修改

    # coding:utf-8
    name = 'jay'
    def test():
        name = 'david'
        print(name)
    test()
    

    以上的全局变量name无法在函数体内修改,需使用global来进行修改,如下

    # coding:utf-8
    name = 'jay' # 定义一个全局变量
    def test():  # 定义函数
        global name # global+全局变量名
        name = 'david' # 函数体内给全局变量重新赋值
        print(name)
    test()
    

    在工作中,不建议使用global对全局变量进行修改

8、函数的递归

  • 什么是递归函数

    一个函数不停的将自己反复执行

  • 递归的定义方法

    # coding:utf-8
    def test(a):
        print(a)
        return test(a) # 通过返回值,直接执行自身函数
    
  • 递归函数的说明

    1. 内存溢出

      内存溢出简单点说就是内存不够用了,当可使用的内存大于程序需要使用的内存时,就会发生内存溢出的情况。函数调用是通过栈这种数据结构实现的,每分配一个栈就需要消耗一部分内存,在递归调用中,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出

      如以下例子,传递参数是 100 时,递归结果为 5050,可以正常算出结果

      当传递参数是 1000 时,递归系统报错,超过最大递归深度

    2. 避免滥用递归

9、匿名函数lambda

  • lambda功能

    1. 定义一个轻量化的函数
    2. 用即删除,很适合需要完成一项功能,但是此功能只在此一处使用
  • lambda用法

    1. 无参数

      f = lambda:value
      f()
      
    2. 有参数

      f = lambda x,y: x*y
      f(3,4)
      

转载请注明来源