基础 day12

 

 

 

 

day12笔记:

  装饰器 decorators(专业提高往篇)

 

问题:

  函数名是变量,它绑定一个函数

  函数名 /  函数名()  区别

 

什么是装饰器

  装饰器是一个函数,主要作用是用来包装另一个函数或类(后面会讲)

  作用:

    是在不改变原函数名(或类名)的情况下改变被包装对象的行为

函数装饰器:

  函数装饰器是指装饰器是一个函数,传入的是一个函数,返回的也是一个函数

 

 

 

语法:

    def 装饰器函数名(参数):

        语句块

        return 函数对象

 

    @装饰器函数名<换行>

    def 函数名(形参列表):

        语句块

  示例见:

    mydeco1.py        

    mydeco2.py        

mydeco3.py   

 

# mydeco1.py

 

def mydeco(fn):

    def fx():

        print("fx函数被调用")

    return fx

 

# myfunc加了mydeco装饰器,等同于在myfunc创建之后调用

# myfunc = mydeco(myfunc)

@mydeco

def myfunc():

    print("函数myfunc被调用")

 

# 这样的写法可以用装饰器来代替

# 等同于

#   @mydeco

#   def myfunc()....

 

# myfunc = mydeco(myfunc)

 

myfunc()  # 这里调用谁?

 

 

 

 

# mydeco2.py

 

def mydeco(fn):

    def fx():

        print("++++++++这是myfunc调用之前++++++++")

        # 要想在此处调用被装饰的函数myfunc怎么办?

        fn()  # 调用被装饰函数

        print("--------这是myfunc调用之后--------")

    return fx

 

 

@mydeco

def myfunc():

    print("函数myfunc被调用")

 

 

myfunc()  # 这里调用谁?

 

 

 

# mydeco3.py

 

 

 

def myfunc():

    print("++++++++这是myfunc调用之前++++++++")

    print("函数myfunc被调用")

    print("--------这是myfunc调用之后--------")

 

 

myfunc()  # 这里调用谁?

 

 

 

 

     

 

看懂下面代码的调用关系及打印结果

  def mydeco(fn):

      print('装饰器函数被调用了....')

      def fx():

          print('fx被调用')

      return fx

 

  @ mydeco  # 这里加装饰器和不加装饰器结果一样吗?为什么?

  def myfunc():

      print('函数myfunc被调用')

 

  myfunc()

  myfunc()  # 调用第二次

  myfunc()  # 调用第三次

 

函数的文档字符串

  函数内第一次未赋值给任何变量的字符串是此函数的文档字符串

 

  语法:

    def 函数名(形参列表):

        '''函数的文档字符串'''

        函数语句块

  示例:

    def hello():

        '''此函数用来打招呼...

        这是函数的文档字符串

        '''

        pass

    >>> help(hello)

  说明:

    1. 文档字符串通常用来说明本函数的功能和使用方法

    2. 在交互模式下,输入:help(函数名) 可以查看函数的文档字符串

 

函数的 __doc__ 属性

  __doc__ 属性用于记录文档字符串

 

 

函数的 __name__ 属性

  __name__ 用于记录函数的名称

 

 

函数的定义语法:

  @装饰器1

  @装饰器2

  ...

  def 函数名(位置形参, *元组形参(或*), 命名关键字形参, **字典形参):

      '''文档字符串'''

      语句块

 

 

面试题,思考?

L = [1, 2, 3]

def f(n=0, lst=[]):

     lst.append(n)

     print(lst)

 

f(4, L)  # 打印结果是什么?·[1, 2, 3, 4]

f(5, L)  # 打印结果是什么? [1, 2, 3, 4, 5]

f(100)  [100]

f(200)  # 打印结果是什么?为什么?  [100, 200]

 

如下代码的打印结果是什么?

L = [1, 2, 3]

def f(n=0, lst=None):

     if lst is None:

        lst = []

     lst.append(n)

     print(lst)

 

f(4, L)  # 打印结果是什么?·[1, 2, 3, 4]

f(5, L)  # 打印结果是什么? [1, 2, 3, 4, 5]

f(100)  #[100]

f(200)  # 打印结果是什么?为什么?  [200]

 

 

 

模块 Module

  什么是模块

    模块是一个包含有一系列数据,函数,类等组成的程序组

    模块是一个文件,模块文件名通常以'.py'结尾

  

  模块的作用:

    1. 让一些相关的数据,函数,类等有逻辑的组织在一起,使逻辑结构更加清晰

    2. 模块中的变量,函数和类等可提供给其它模块或程序使用

 

  模块的分类:

    1. 内置模块(builtins) 在解析器的内部可以直接使用

    2. 标准库模块,安装python时已安装具可直接使用

    3. 第三方模块(通常为开源), 需要自己安装

    4. 用户自己编定的模块(可以作为其它人的第三方模块)

 

模块的导入 import

import 语句

  语法:

    import 模块名1 [as 模块新名1], 模块名2[as 模块新名2], ....

  示例:

    import math  # 导入数学模块

    import sys, os  # 导入sys和os模块

    import copy as cp

  作用:

    将一个模块整体导入到当前模块中

  属性用法:

    模块名.属性名

  help(obj) 可以查看模块的文档字符串

 

练习:

  1. 输入一个圆的半径,打印出这个圆的面积

  2. 输入一个圆的面积,打印出这个圆的半径

  (要求用math模块内的函数和变量)

 

 

from import 语句

  语法:

    from 模块名 import 模块属性名 [as 属性新名1], 模块属性名2 [as 属性新名2]

 

  作用:

    将某模块的一个或多个属性导入到当前模块的作用域

  示例:

    from math import pi

    from math import sin

    from math import factorial as fac

 

from import * 语句

  语法:

    from 模块名 import *

  作用:

    将某模块的所有属性导入到当前的模块

  示例:

    from math import *

    s = sin(pi/2)

    print(factorial(10))

 

 

 

dir 函数

  dir([对象])   返回一个字符串列表

 

  作用:

    1. 如果没有参数调用,则返回当前作用域内所有变量的列表

    2. 如果给定一个对象作为参数,则返回这个对象的所在变量(属性)列表

       1) 对于一个模块,返回这个模块的全部变量

       2) 对于一个类对象,返回类对象的所有变量,并递归基类对象的所有变量

       3) 对于其它对象,返回所有变量、类变量和基类变量

 

数学模块 math

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值