老莫的笔记本  
  
查看: 113|回复: 0

python 函数与 装饰器

[复制链接]

662

主题

878

帖子

5145

积分

超级版主

Rank: 8Rank: 8

积分
5145
发表于 2023-8-25 17:16:39 | 显示全部楼层 |阅读模式
本帖最后由 周大胖子 于 2023-9-9 15:38 编辑

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

  3. import datetime


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


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


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

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

  13. def d(q):
  14.     print(q)


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


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

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

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

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

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

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


  44. # 10注释的用法
  45. # 注释的用法 (三个引号 )
  46. # def dologin(username, password):
  47. #     """
  48. #     :param username: 用户名
  49. #     :param password: 密码
  50. #     :return:
  51. #     """
  52. #     print(username)
  53. #     print(password)

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


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


  65. s = tellmewhy()
  66. d(s ** 2)


  67. def tell2():
  68.     l = tellmewhy()
  69.     d(l * 3)


  70. tell2()


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


  74. tel3(1, 2)


  75. def tell4(*args):
  76.     print(args)


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


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

  79. # tell4((98, 99))
  80. # ((98, 99),)


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


  86. get_sum()
  87. get_sum(1, 2, 3, 4, 5)
  88. list2 = [1, 3, 5, 9]
  89. get_sum(*list2)


  90. # 和是0
  91. # 和是15
  92. # 和是18


  93. def get_more(**kwargs):
  94.     print(kwargs)


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


  96. # 注释的用法 (三个引号 )
  97. def dologin(username, password):
  98.     """
  99.     :param username: 用户名
  100.     :param password: 密码
  101.     :return:
  102.     """
  103.     print(username)
  104.     print(password)


  105. # 装饰器 最简单的写法
  106. def debug(func):
  107.     def wrapper():
  108.         d("[DEBUG]: enter{}()".format(func.__name__))
  109.         return func()

  110.     return wrapper


  111. @debug
  112. def say_hello():
  113.     d('hello')


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

  116. say_hello()


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

  123.     return wrapper


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


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


  130. # 可变参数*args和关键字参数**kwargs
  131. def debug3(func):
  132.     def war(*args, **kwargs):
  133.         d('[DEBUG3] enter{}()'.format(func.__name__))
  134.         return func(*args, **kwargs)

  135.     return war


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


  139. telling(current_date)



复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表