1 2 3 4

【Python】函数

简介

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

函数能提高应用的模块性和代码的重复利用率。

内置函数

Python有很多内置函数可以供开发者直接使用。
也可以在交互式命令行通过help(函数名)查看函数的帮助信息。
Python内置函数

自定义函数

定义函数

自定义函数规则:

  1. 定义函数以 def 关键词开头,依次写函数名、括号、括号中的参数和冒号。
  2. 函数体的第一行语句应使用文档字符串存放函数说明。
  3. 通常用return结束函数并返回函数的返回值。
    在这里插入图片描述

调用函数

调用Python的函数,需要根据函数定义,传入正确的参数。

def area(width, height):
    # 计算面积函数
    return width * height

width = int(input('宽:'))
height = int(input('长:'))
print('面积是:{0}'.format(area(width,height)))

参数

  • 位置参数

位置参数须以正确的顺序传入函数,且调用时的数量和声明时一样

area(5,10)
  • 关键字参数

关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict

关键字参数的表现形式:

1. 在参数前加两个*,可以传入任意不受限制的关键字参数
2. 命名关键字参数,限制传入关键字参数的名字,命名关键字参数需要一个特殊分隔符*
def persion(name,age,**others):
    print('Name:',name,'age:',age,'other:',others)
persion('Henry-chr',26,city = 'Beijing',source = 96)
def persion1(name,age,*,city):
    print('Name:',name,'age:',age,'city:',city)
persion1('Henry-chr',26,city = 'Beijing')
  • 默认参数

默认参数可以简化函数的调用,降低调用函数的难度

设置默认参数时需要注意以下几点:

1. 默认参数必须指向不可变对象
2. 默认参数必须放在必须参数后
3. 当存在多个默认参数时,如果某个参数非默认值,需要把参数名写上
def persion2(name,age,gender = 'M',city = 'Shanghai'):
    name = name
    age = age
    gender = 'boy' if gender == 'M' else 'girl'
    city = city
    print('My name is {0}.\nI am {1} years old.\nI am {2}.\nI am from {3}.'.format(name,age,gender,city))
persion2('Henry-chr',26,city = 'Beijing')
  • 可变参数

可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。

可变参数有两种表现形式:

1. 定义位置参数,调用的时候,先组装成一个list或tuple
2. 定义可变参数,在参数前加一个*,调用时可以传任意个参数也可以在list或tuple前加*传入
def sumall1(numbers):
    sum = 0
    for i in numbers:
        sum = sum + i*i
    return sum
sumall1((1,3,5))
def sumall(*numbers):
    sum = 0
    for i in numbers:
        sum = sum + i*i
    return sum
list = [2,4,5]
sumall(*list)

参数组合

Python中各种参数可以组合使用,但定义顺序必须是:位置参数、默认参数、可变参数、命名关键字参数和关键字参数。

建议不要同时使用太多的参数组合,否则函数接口的可理解性很差。

参数小结

默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!

*args是可变参数,args接收的是一个tuple;

**kw是关键字参数,kw接收的是一个dict

命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。

定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。

匿名函数

Python也可通过lambda创建函数,不需要像def那样标准的形式去定义

lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。

语法格式如下:

lambda [arg1 [,arg2,.....argn]]:expression

for_x = lambda arg1,arg2: arg1*arg2

for_x(5,10)

递归函数

函数在内部调用自身本身

递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。

每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。


在这里插入图片描述

posted @ 2021-08-12 14:49  As-before-如初  阅读(161)  评论(0编辑  收藏  举报