函数

函数:

具有特殊功能的指令的集合

函数的作用:

1、使编程模块化

2、增强代码的重用性

1.定义函数

你可以定义一个由自己想要功能的函数,以下是简单的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

Python 定义函数使用 def 关键字,一般格式如下:

def 函数名(参数列表):
    函数体

注意:

1、参数列表可以为空(没有参数)

2、函数如果没有return,则默认return None

3、函数可以返回多个值(return 1, 2)

2.函数的调用

返回值 = 函数名(实参列表)

def  func(a,b):
    return a+1, b+1
x, y = func(10, 11)

3.函数的参数

  • 位置参数(必须参数)
  • 关键字参数
  • 默认参数
  • 可变参数
  • 组合参数

位置参数(必须参数)

举例求一栋楼的层数

def  floor(h1, h2):
    return h1//h2
f = floor(30, 3)

注意:

1、h1, h2为函数floor的位置参数

2、传入的参数的个数必须和位置参数的个数一致

3、传入的参数的顺序必须和位置参数的顺序一致

在实际工作过程中,当一个函数有参数时,在函数体内一定要先对参数的合法性进行检查再使用参数!!!!

关键字参数

使用关键字参数允许函数调用传参的顺序和声明时不一致.

def  floor(h1, h2):
    return h1//h2
f = floor(h2=3, h1=10) 

默认参数

#函数在实现的时候,某些参数如果没有传递参数,就使用默认参数 默认参数:

在定义函数的时候,给参数一个默认值:

def  area(r, pi=3.14):
    return pi*r*r
s = area(10)
s = area(10, 3.1415)

如果传参时没有对pi进行赋值,则pi使用默认值3.14

默认参数使用注意事项: 默认参数必须在位置参数后!

可变参数

传入的参数的个数是可变的

def  cal(*args):
    for item in args:
        print(item)
cal(1,2,3)

在函数内部参数 args 接收到的是一个 tuple

#如果传入的参数本身是个list该如何处理?

传参的时候在list前加*

arr = [1,2,3,4]
cal(*arr)

*取列表中的所有的元素

组合参数

在 Python 中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这 5 种参数都可以组合使用

参数定义的顺序必须是:位置参数、默认参数、可变参数和关键字参数

比如定义一个函数,包含上述若干种参数:

def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
def f2(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)

在函数调用的时候,Python 解释器自动按照参数位置和参数名把对应的 参数传进去。

f1(1, 2)
结果:a = 1 b = 2 c = 0 args = () kw = {}
f1(1, 2, c=3)
结果:a = 1 b = 2 c = 3 args = () kw = {}
f1(1, 2, 3, 'a', 'b')
结果:a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
f1(1, 2, 3, 'a', 'b', x=99)
结果:a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}

4.高阶函数

高阶函数英文叫 Higher-order function。

一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数。

参数为函数
def bar():
    print("in the bar..")
def foo(func):
    func()
    print("in the foo..")

foo(bar)
返回值为函数
def bar():
    print("in the bar..")
def foo():
    print("in the foo..")
    return bar

res=foo()
res()

函数名的含义:函数的入口地址。

5.函数的递归

递归函数:在函数内部调用函数本身!

#求n的阶乘
def jiecheng(n):
    if n == 1:
        return 1
    return n*jiecheng(n-1)

print(jiecheng(5))

#求斐波那契数列的第n项
#1 1 2 3 5 8 13 21 34 55 89
def Fibonacci(n):
    if n == 1 or n == 2:
        return 1
    #第n项=第n-1项+第n-2项
    return Fibonacci(n-1)+Fibonacci(n-2)

print(Fibonacci(5))

#计算斐波那契数列的前n项的和
def Fibonacci_add(n):
    if n == 1 or n == 0:
        return n
    #第n项+前n-1项的和
    return Fibonacci(n) + Fibonacci_add(n-1)
print(Fibonacci_add(5))

6.闭包函数

如果一个函数定义在另一个函数的作用域内,并且引用了外层函数的变量,则该函数称为闭包:

def outer():
    name = "python"
    def inner():
        print(name)
    return inner

res = outer()
res()

1.闭包的原理:

#在Python中,函数对象有一个__closure__属性;

print(res.__closure__)

#通过cell_contents查看具体内容:

print(res.__closure__[0].cell_contents)

当内嵌函数引用了包含它的函数中的变量后,这些变量会被保存在内嵌函数的__closure__属性中,成为内嵌函数本身的一部分。

2.闭包的创建条件:

  1、函数内嵌函数

  2、内嵌函数(内函数)需要引用外围函数(外函数)中的变量

  3、外围函数必须返回内嵌函数

7.匿名函数

关键字:lambda

语法:

lambda   参数列表:表达式

lambda   a, b : a+b
lambda   a, b : a if a > b else b

注意:lambda函数不需要使用return,函数的返回值就是表达式的结果。

匿名函数的作用:

1、省去函数的定义过程,使代码更加精简

2、如果某个简单的功能不会被重复使用到,可以使用匿名函数实现

posted @ 2020-04-24 18:06  独剑飞行天下  阅读(282)  评论(0)    收藏  举报