python | 函数

# encoding: utf-8

import functools


# ************************************************不定长参数************************************************
# def 函数名(*args):
# ************************************************************************************************


def my_tup(*args):
    for v in args:
        print(v)


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


# ************************************************不定长参数************************************************
# def 函数名(**kwargs):
# ************************************************************************************************


def my_dic(**kwargs):
    print(kwargs, type(kwargs))


my_dic(name="admin", age=18)


# ************************************************引用传递************************************************
# pyhton中,只有引用传递,没有值传递
# 如果数据类型是可变类型,则可以改变原件
# 如果数据类型是不可变类型,则不可以改变原件
# ************************************************************************************************


def change(num):
    num = 666


a = 20
change(a)
print(a)

# ************************************************偏函数************************************************
# 函数的某个参数偏爱使用某个值
# ************************************************************************************************


num_str = "100010"
result = int(num_str)
print(result)
# 今后的一段时间内
# 都需要把一段二进制字符串转换为十进制数据
int_2 = functools.partial(int, base=2)
print(int_2(num_str))

# ************************************************高阶函数************************************************
# 函数的一个参数可以接受另一个函数
# ************************************************************************************************


s = [{"name": "admin", "age": 18}, {"name": "admin", "age": 17}, {"name": "admin", "age": 16}]


def get_key(x):
    return x["age"]


# 根据年龄排序该列表
print(sorted(s, key=get_key))


# ************************************************
def caculate(num1, num2, caculate_fun):
    return caculate_fun(num1, num2)


def add(num1, num2):
    return num1 + num2


def sub(num1, num2):
    return num1 - num2


print(caculate(10, 5, add))
print(caculate(10, 5, sub))


# ************************************************返回函数************************************************
# 一个函数内部,它的返回值是另外一个函数
# ************************************************************************************************


def get_fun(flag):
    # 定义两个函数
    def add(num1, num2):
        return num1 + num2

    def sub(num1, num2):
        return num1 - num2

    # 根据不同的flag值,返回不同的函数
    if flag == "+":
        return add
    elif flag == "-":
        return sub


new_function = get_fun("+")
print(new_function(1, 2))

# ************************************************匿名函数************************************************
# 没有名字的函数,不能直接return
# 语法:lambda 参数1, 参数2... : 表达式
# 表达式就是返回值
# 只适用于一些简单的操作处理
# ************************************************************************************************


s = [{"name": "admin", "age": 18}, {"name": "admin", "age": 17}, {"name": "admin", "age": 16}]
# 根据年龄排序
print(sorted(s, key=lambda x: x["age"]))


# ************************************************闭包************************************************
# 在函数嵌套的前提下
# 内层函数引用了外层函数的变量
# 外层函数又把内层函数当做返回值进行返回
# 应用场景:外层函数根据不同的参数来产生不同功能的函数
# 注意事项:如果要修改引用的外部变量,需要使用nonlocal申明该变量
# 注意事项:当闭包内引用了一个后期会变化的变量时,一定要注意
# ************************************************************************************************


def test():
    a = 10

    def test2():
        print(a)

    return test2()


test()


# ************************************************


def out_fun():
    num = 233

    def in_fun():
        # 使用nonlocal申明num
        # 使外部num可被内部修改
        nonlocal num
        num = 666
        print(num)

    print(num)
    in_fun()
    print(num)


out_fun()


# ************************************************装饰器************************************************
# 在函数名以及函数体不变的前提下,给函数附加一些额外代码
# ************************************************************************************************


def check_submit(func):
    def inner():
        print("登录检查")
        func()

    return inner


@check_submit
def show_message():
    print("hello word")


show_message()


# ************************************************
# 装饰器的叠加


def decorator_line(func):
    def inner():
        print("------------------")
        func()

    return inner


def decorator_star(func):
    def inner():
        print("******************")
        func()

    return inner


@decorator_line
@decorator_star
def show_message():
    print("hello word")


show_message()


# ************************************************
# 装饰有参数的函数


def check_submit(func):
    def inner(num1, num2):
        print(num1 + num2)
        func(num1, num2)

    return inner


@check_submit
def show_message(num1, num2):
    print(num1, num2)


show_message(1, 2)


# ************************************************


def check_submit(func):
    def inner(*args):
        print('-----')
        func(*args)

    return inner


@check_submit
def show_message(num1, num2, num3):
    print(num1, num2, num3)


@check_submit
def show_message2(num1):
    print(num1)


show_message(1, 2, 3)
show_message2(1)


# ************************************************
# 装饰器生成函数


def get_decorator(char):
    def decorator(func):
        def inner():
            print(char * 10)
            func()

        return inner

    return decorator


@get_decorator('-')
@get_decorator('*')
@get_decorator('x')
def show_message():
    print("hello word")


show_message()

# ************************************************生成器************************************************
# 是一个特殊的迭代器(迭代器的抽象层级更高)
# 生成器只会遍历一次
# 如果碰到return会直接终止
# ************************************************************************************************


# ************************************************
# 生成器创建:生成器表达式


l = (i for i in range(1, 100) if i % 2 == 0)
for i in l:
    print(i)


# ************************************************
# 生成器创建:生成器函数


def test():
    yield 1
    print('a')

    yield 2
    print('b')

    yield 3
    print('c')

    yield 4
    print('d')


g = test()
print(next(g))
print(next(g))
print(next(g))


# 关闭生成器
# print(g.close())
# print(next(g))


# ************************************************递归函数************************************************
# 函数内部继续调用该函数
# ************************************************************************************************


# ************************************************
# 求阶乘


def factorial(n):
    if n == 1:
        return 1
    return n * factorial(n - 1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值