函数知识点汇总

格式

def 函数名([参数]):

        代码

参数:向函数中传递值

默认参数: def 函数名(参数1,参数2,参数3=值,参数4=值

无默认值的参数必须赋值,有默认值参数的可以不赋值

无默认值的参数一定要在有默认值的参数前方  

缺省参数在*args的后面

如果有多个默认值参数,又想修改指定的参数,可使用关键字参数赋值,例如:

def num(a, b, c=3, d=4):
    print(a, b, c, d)


num(1, 2, d=3)

1 2 3 3

可变参数

*args 将多个参数以元组形式传入函数中

def get_num(*args):
    print(args)


get_num(1, 2, 3, 4, 5)

(1, 2, 3, 4, 5)


list1 = [1, 3, 5, 123, 5, 123, 5]
get_num(*list1)  # 传参时可将参数拆包上传

(1, 3, 5, 123, 5, 123, 5)

**kwargs 关键字参数,将键值对传入函数中

def show_book(**kwargs):
    for k, v in kwargs.items():
        print(k, v)


show_book(name='青春', author='韩寒')  # kwargs类型需传入键值对
book_1 = {'name': '三重门', 'author': '韩寒'}
show_book(**book_1)  # 字典拆包

name 青春
author 韩寒
name 三重门
author 韩寒

返回值

使用return,会终止函数调用,可单独使用,不设置返回值默认输出None

格式

def 函数名([参数]):

        代码

        return 返回值

返回单个返回值举例

def get_sum(*args):
    total = 0
    for i in args:
        total += i
    return total


print(get_sum(1, 2, 3, 4, 5))

15

返回多个返回值(冒泡排序返回列表最大最小值)

返回多个值的时候默认返回值为元组,可自行定义元组、列表、字典。可使用多个变量来接收返回值

def maxandmin(numbers):
    for i in range(0, len(numbers) - 1):
        for j in range(0, len(numbers) - 1 - i):
            if numbers[j] > numbers[j + 1]:
                numbers[j], numbers[j + 1] = numbers[j + 1], numbers[j]
    min = numbers[0]
    max = numbers[-1]
    return min, max


list1 = [11, 21, 3, 43, 15, 90]
a, b = maxandmin(list1)
a_b = maxandmin(list1)
print(a, b)
print(a_b)

3 90
(3, 90)

全局变量&局部变量

声明在函数外的为全局变量(查看全局变量命令:globals()),声明在函数内部的为局部变量(查看局部变量:locals()

1.调用函数时优先返回局部变量,举例:

a = 100

def test1():
    a = 0
    print('a=', a)

test1()

a= 0

2.如何在函数中修改全局变量

a = 100

def test1():
    global a
    a = 10
    print('a=', a)

test1()

a= 10

3.不可变的类型才需要添加global,可变的类型不需要加global

不可变类型有:内容发生改变,地址也发生改变

int str float bool tuple 

可变类型:内容发生改变,地址没有发生改变

list dict set 

a = 10
print(id(a))
a = 100
print(id(a))

list1 = [1, 2, 3, 4]
print(id(list1))
list1 += [2, 3, 4, 5]
print(id(list1))

140731742650928
140731742653808
2032750711304
2032750711304

函数注释:

在函数定义后加''' ''',系统会自带注释格式

def 函数名(参数):

        基本注释 ‘注释内容’

        高级注释

        '''

        函数的说明

        参数说明:

        参数一:

        参数二:

        返回值说明:

        return:

        '''

引用

1.不在函数中引用,可以通过sys.getrefcount(变量)   查看引用次数

del 变量名    来删除引用

2.函数的引用,分清传递的参数是可变/不可变类型。可变类型会引起全局的改变,不可变类型则不影响

函数的嵌套和闭包

在函数中定义函数,如果内部函数需要外部函数中的变量,需要添加nonlocal

def outer():
    a = 100

    def inner():
        nonlocal a  # 修改outer内a的定义
        a += 50
        b = 200
        print('我是内部函数')

    inner()

    result = locals()
    print(result)


outer()

我是内部函数
{'inner': <function outer.<locals>.inner at 0x00000258FE7F7708>, 'a': 150}

函数检索顺序

内层函数 ---》外层函数 ---》全局 ---》系统builtins

闭包的定义

1.嵌套函数

2.内部函数引用了外部函数的变量

3.返回值是内部函数

目的:将内部函数抛出外部函数。通常配合装饰器使用。

def outer(n):
    a = 10

    def inner():
        b = a + n
        print('内部函数', b)

    return inner

r = outer(10)
print(r)
r()

<function outer.<locals>.inner at 0x0000016E1AE454C8>
内部函数 20

装饰器

遵循开放封闭原则,在不改变原函数的情况下,扩展了函数的功能。

功能:

1.引入日志

2.函数执行时间统计

3.执行函数前预备处理

4.执行函数后清理功能

5.权限校验

...

@装饰器名

def 原函数()

       pass

举例

def decorater(func):
    def warpper():
        func()
        print('装修')
        print('入住')

    return warpper


@decorater
def house():
    print('毛坯房')


house()

毛坯房
装修
入住

如果原函数有参,则装饰器内部函数也需要添加参数,一般内部函数都会使用*args, **kwargs进行传参。举例

def decorater(func):
    def warpper(*args, **kwargs):
        func(*args, **kwargs)
        print('装修')
        print('入住')

    return warpper


@decorater
def house(address):
    print('毛坯房在{}'.format(address))


@decorater
def big_house(address, area, money=1500):
    print('毛坯房在{},有{}平米大,花了{}万'.format(address, area, money))


house('北京')
big_house('上海', area=200)

毛坯房在北京
装修
入住
毛坯房在上海,有200平米大,花了1500万
装修
入住

带返回值的装饰器,举例

def decorater(func):
    def warpper(*args, **kwargs):
        s = func(*args, **kwargs)
        re = s + 10
        return re
    return warpper

@decorater
def sum(a, b):
    s = a + b
    return s


result = sum(10, 20)
print(result)

40

递归函数

如果一个函数在内部不调用其他的函数,而是自己本身的话,这个函数就是递归函数

举例:利用递归函数打印1到10的值

def test(a):
    if a < 10:
        print(a)
        a += 1
        test(a)
    else:
        print(a)


test(1)

1
2
3
4
5
6
7
8
9
10

举例:利用递归函数完成1到10的累加和

def test1(i):
    if i == 10:
        return 10
    else:
        return i + test1(i + 1)


r = test1(1)
print(r)

55

举例:输出斐波那契数列的某一项

def fibonacci(n):
    if n <= 2:
        return 1
    else:
        return fibonacci(n - 2) + fibonacci(n - 1)


r = fibonacci(10)
print(r)

55

匿名函数

lambda关键词能创建小型函数,叫做匿名函数(使用较少,可以一致都使用def),可以接收多个参数但是只能返回一个值

lambda 参数列表:运算表达式(返回值)

举例

r = lambda a: a + 1
print(r(1))

2

高阶函数

一个函数的参数中存在另一个函数,或返回值为另一个函数

系统的高阶函数:max min sorted

dict1 = {'a': 10, 'b': 11, 'c': 22, 'd': 33}
m = max(dict1, key=lambda x: dict1[x])  # 使用高阶函数求字典value的最大值,返回对应key
print(m)
list1 = [('a', 10), ('b', 20), ('c', 30)]
m = max(list1, key=lambda x: x[1])  # 使用高阶函数求列表中元组下标为1的元素最大值,返回对应元组
print(m)
s = sorted(list1, key=lambda x: x[1], reverse=True)  # 使用sorted高阶函数排序
print(s)

d
('c', 30)
[('c', 30), ('b', 20), ('a', 10)]

filter  要求函数的返回值必须是bool类型,为Ture时符合过滤条件

list1 = [('a', 10), ('b', 20), ('c', 30)]
f = filter(lambda x: x[1] > 10, list1)  # 通过filter高阶函数实现筛选
print(list(f))

[('b', 20), ('c', 30)]

map

list1 = [('a', 10), ('b', 20), ('c', 30)]
m = map(lambda x: x[0].upper(), list1)  # 通过map高阶函数提取list中对应元素并加工输出
print(list(m))

['A', 'B', 'C']

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值