周大胖子 发表于 2023-8-25 17:16:39

python 函数与 装饰器

本帖最后由 周大胖子 于 2023-9-9 15:38 编辑


# 这是一个示例 Python 脚本。
import copy

import datetime


# 按 Shift+F10 执行或将其替换为您的代码。
# 按 双击 Shift 在所有地方搜索类、文件、工具窗口、操作和设置。


def print_hi(name):
    # 在下面的代码行中使用断点来调试脚本。
    print(f'Hi, {name}')# 按 Ctrl+F8 切换断点。


# 按间距中的绿色按钮以运行脚本。
# if __name__ == '__main__':
#   print_hi('PyCharm')

# 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助

def d(q):
    print(q)


name = [('1', '2'), 'n']


# 1、函数定义从def 开始。
#
# 2、def后面是函数名称,空格分隔,命名规则参考变量命名。
#
# 3、函数名称后面是括号,根据需要设置参数。
#
# 4、括号后面是冒号。
#
# 5、函数体自动向右缩进

# 6.默认值参数的写法
# def t(a,b=2)

# 7关键字写法
# 使用函数时 ,把参数名带进去
# 例如t(b=6,a=1)顺序无所谓

# 形参 函数括号里的
# 实参 调用时传递的

# 8.可变参数
# 可变参数*args和 关键字参数**kwargs
# *args中 关键是星号(*),表示来接收可变数量的参数 例如
# **kwargs使用两个星号来传递可变数量的键值对参数
# 参考地址https://baijiahao.baidu.com/s?id=1759961023284275987&wfr=spider&for=pc

# 9.全局和局部变量:
# gLobal关罐字的添加:
# 只有不可变的类型才需要派加gLobal
# 可变的类型不需要添加global
# 可变与不可变:
#   不可变: 当改变变量的值时,内存id(数据)地址发生了改变 类型 :int str float bool tuple
#   可变 : 里面的内容发生了改变,但是地址没有发生改变 类型:list dict set


# 10注释的用法
# 注释的用法 (三个引号 )
# def dologin(username, password):
#   """
#   :param username: 用户名
#   :param password: 密码
#   :return:
#   """
#   print(username)
#   print(password)

# 11 外部变量的引用:
# 1.不是在西最中使用,可以通过sys.getrefcount(a] 引用个最del 交量
# 表示副联了一个引用
# 2,西教的引用:
# 必须要分清盘传递的值是可变美型还是不可变类型
# 如果是可变,里面发生改受,外层就能看到改受后内容如果是不可变,更面发生改变不会影响外部得到交量营


# 12 .local()
# result = Locals() # Locals() 表示查看函数中的局部变量,以字典得形式返回
# print(result)
def tellmewhy():
    return 5


s = tellmewhy()
d(s ** 2)


def tell2():
    l = tellmewhy()
    d(l * 3)


tell2()


# 默认值参数
def tel3(t, t2, t3=False):
    print(t, t2, t3)


tel3(1, 2)


def tell4(*args):
    print(args)


tell4('6', '7', '8')


# ('6', '7', '8')

# tell4((98, 99))
# ((98, 99),)


def get_sum(*args):
    s = 0
    for v in args:
      s += v
    print('和是{}'.format(s))


get_sum()
get_sum(1, 2, 3, 4, 5)
list2 =
get_sum(*list2)


# 和是0
# 和是15
# 和是18


def get_more(**kwargs):
    print(kwargs)


get_more(name='张三', nat=18)


# 注释的用法 (三个引号 )
def dologin(username, password):
    """
    :param username: 用户名
    :param password: 密码
    :return:
    """
    print(username)
    print(password)


# 装饰器 最简单的写法
def debug(func):
    def wrapper():
      d(": enter{}()".format(func.__name__))
      return func()

    return wrapper


@debug
def say_hello():
    d('hello')


# say_hello = debug(say_hello) 老的写法 当前版本不支持了
# 添加功能并保证原函数名不变

say_hello()


# 装饰器带参数的写法(指定参数名系列)
def debug2(func):
    def wrapper(day):
      # 这里的参数与传递进来的函数的参数名 需要一致
      d('l enter{}()'.format(func.__name__))
      return func(day)

    return wrapper


@debug2
def tellday(day):
    d('这是个带参数的初级装饰器,当前时间是{}'.format(day))


# 获取当前日期
current_date = datetime.date.today()
tellday(current_date)


# 可变参数*args和关键字参数**kwargs
def debug3(func):
    def war(*args, **kwargs):
      d(' enter{}()'.format(func.__name__))
      return func(*args, **kwargs)

    return war


@debug3
def telling(day):
    d('这是个不定义参数名的装饰器,当前时间是{}'.format(day))


telling(current_date)



页: [1]
查看完整版本: python 函数与 装饰器