今日内容

  • 装饰器
  • 推导式
  • 模块【可选】

内容回顾

  1. 函数
  • 参数

    • def (a1,a2):pass
    • def (a1,a2=None):pass 默认参数推荐用不可变类型,慎用可变类型。
    • def(*args,**kwargs):pass
    • 注意:位置参数 > 关键字参数
    • 面试题
      • 函数可以做参数【知识点】。

        def func(arg):

        arg()

        def show():

        pass

        func(show)

      • 函数的参数传递的是什么?【内存地址=引用 or 值】

        v = [11,2,33,4]

        def func(arg):
        print(id(arg)) # 列表内存地址 print(id(v)) # 列表内存地址
        func(v) # 传递的是内存地址。
      • *args和**kwargs的作用

  • 返回值
    • 常见数据类型可以返回

    • 函数也可以返回

      def func():

      def inner():

      pass

      return inner

      v = func()
    • 特殊

      • 默认没返回就是None
      • return 1,2,3 等价于 return (1,2,3,4,)
  • 执行函数
    • 函数不被调用,内部代码永远不执行。

      def func():

      return i

      func_list = []

      for i in range(10):

      func_list.append(func)

      print(i) # 9
      v1 = func_list[4]()#9
      v2 = func_list[0]()#9
      func_list = []
      for i in range(10):
      # func_list.append(lambda :x) # 函数不被调用,内部永远不执行(不知道是什么。)
      func_list.append(lambda :i) # 函数不被调用,内部永远不执行(不知道是什么。) print(func_list)#列表,10个函数的内存地址。 print(func_list[2]())#9
    • 执行函数时,会新创建一块内存保存自己函数执行的信息 => 闭包

      def base():

      return i

      def func(arg):
      def inner():
      return arg
      return inner base_list = [] # [base,base,]
      func_list = [] # [由第一次执行func函数的内存地址,内部arg=0 创建的inner函数,有arg=1的inner函数 ]
      for i in range(10): # i = 0 ,1
      base_list.append(base)
      func_list.append(func(i)) # 1. base_list 和 func_list中分别保存的是什么?
      """
      base_list中存储都是base函数。
      func_list中存储的是inner函数,特别要说的是每个inner是在不同的地址创建。
      """
      # 2. 如果循环打印什么?
      for item in base_list:
      v = item() # 执行base函数
      print(v) # 都是9
      for data in func_list:
      v = data()
      print(v) # 0 1 2 3 4 。在for循环过程中,func(i)已经执行,for循环过程中i的变化值已经被包在其中。

总结:

  • 传参:位置参数 > 关键字参数
  • 函数不被调用,内部代码永远不执行。
  • 每次调用函数时,都会为此次调用开辟一块内存,内存可以保存自己以后想要用的值。
  • 函数是作用域,如果自己作用域中没有,则往上级作用域找。
  1. 内置和匿名函数(精英)
  • 内置函数
  • 匿名函数
  1. 模块
  • getpass
  • random
  • hashlib

内容详细

  1. 作业题讲解

2.装饰器

v = 1
v = 2
# ########################
def func():
pass
v = 10
v = func # ##########################
def base():
print(1) def bar():
print(2) bar = base
bar() def func():
def inner():
pass
return inner v = func()
print(v) # inner函数
# #########################################
def func(arg):
def inner():
print(arg)
return inner v1 = func(1)
v2 = func(2) print(v1,v2)
#两个inner函数内存地址。
# #########################################
def func(arg):
def inner():
arg()
return inner def f1():
print(123) v1 = func(f1)
v1()
# ###########################################
def func(arg):
def inner():
arg()
return inner def f1():
print(123)
return 666 v1 = func(f1)
result = v1() # 执行inner函数 / f1含函数 -> 123
print(result) # None
# ###########################################
def func(arg):
def inner():
return arg()
return inner def f1():
print(123)
return 666 v1 = func(f1)
result = v1() # 执行inner函数 / f1含函数 -> 123
print(result) # 666 def func():
print(1) v1 = func
func = 666

===================装饰器=

def func(arg):
def inner():
print('before')
v = arg()
print('after')
return v
return inner def index():
print('123')
return '666' # 示例一
"""
v1 = index() # 执行index函数,打印123并返回666赋值给v1.
"""
# 示例二
"""
v2 = func(index) # v2是inner函数,arg=index函数
index = 666
v3 = v2()
"""
# 示例三
"""
v4 = func(index)
index = v4 # index ==> inner
index()
""" # 示例四
index = func(index)
index() def func(arg):
def inner():
v = arg()
return v
return inner # 第一步:执行func函数并将下面的函数参数传递,相当于:func(index)
# 第二步:将func的返回值重新赋值给下面的函数名。 index = func(index)
@func
def index():
print(123)
return 666 print(index)
index=func(index)
index()

装饰器:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能。 (之前和之后增加某些功能-func)

应用:

# 计算函数执行时间
import time
def wrapper(func):
def inner():
start_time = time.time()
v = func()
end_time = time.time()
print(end_time-start_time)
return v
return inner @wrapper
def func1():
time.sleep(2)
print(123)
@wrapper
def func2():
time.sleep(1)
print(123) def func3():
time.sleep(1.5)
print(123) func1()
#装饰器作用,在变动原函数(func)的基础上,增加原函数的功能(在wrapper里增加)。
#在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能。

总结

  • 目的:在不改变原函数的基础上,再函数执行前后自定义功能。

  • 编写装饰器 和应用

    # 装饰器的编写

    def x(func):

    def y():

    # 前

    ret = func()

    # 后

    return ret

    return y

    # 装饰器的应用
    @x
    def index():
    return 10 @x
    def manage():
    pass # 执行函数,自动触发装饰器了
    v = index()
    print(v)
  • 应用场景:想要为函数扩展功能时,可以选择用装饰器。

  • 记住:

    • 装饰器编写格式

      def 外层函数(参数): #参数是函数名

      def 内层函数(args,**kwargs):

      return 参数(
      args,**kwargs)

      return 内层函数

    • 装饰器应用格式

      @外层函数

      def index():

      pass

      index()
    • 问题:为什么要加 *args, **kwargs

3.推导式

  • 列表推导式

    • 基本格式

      """

      目的:方便的生成一个列表。

      格式:

      v1 = [i for i in 可迭代对象 ]

      v2 = [i for i in 可迭代对象 if 条件 ] # 条件为true才进行append

      """

      v1 = [ i for i in 'alex' ]

      v2 = [i+100 for i in range(10)]

      v3 = [99 if i>5 else 66 for i in range(10)]

      def func():
      return 100
      v4 = [func for i in range(10)] v5 = [lambda : 100 for i in range(10)]
      result = v5[9]() def func():
      return i
      v6 = [func for i in range(10)]
      result = v6[5]() v7 = [lambda :i for i in range(10)]
      result = v7[5]() v8 = [lambda x:x*i for i in range(10)] # 新浪微博面试题
      # 1.请问 v8 是什么?
      # 2.请问 v8[0](2) 的结果是什么? # 面试题
      def num():
      return [lambda x:i*x for i in range(4)]
      # num() -> [函数,函数,函数,函数]
      print([ m(2) for m in num() ]) # [6,6,6,6] # ##################### 筛选 #########################
      v9 = [i for i in range(10) if i > 5]
  • 集合推导式

    v1 = { i for i in 'alex' }
  • 字典的推导式

    v1 = { 'k'+str(i):i for i in range(10) }

今日总结

  • 装饰器 (6**)

    • 编写格式:双层嵌套函数
    • 应用格式:@外层函数
    • 理解:
      • 变量赋值

        def func():

        print(1)

        v1 = func
        func = 666
      • 看看到底return的是什么?

      • 自己 > 上级作用域

    • 背会:

      @xx # index = xx(index)

      def index():

      pass

      index()
  • 推导式(3*)

  • 模块

    import time

    v = time.time() # 获取当前时间
    time.sleep(2) # 睡2秒

python笔记13的更多相关文章

  1. python笔记-13 mysql与sqlalchemy

    一.RDBMS relational database management system 关系型数据库引入 1.数据库的意义 更有效和合理的存储读取数据的一种方式 关系模型基础上的数据库 -> ...

  2. Python笔记 #13# Pandas: Viewing Data

    感觉很详细:数据分析:pandas 基础 import pandas as pd import numpy as np import matplotlib.pyplot as plt dates = ...

  3. MIT 计算机科学及编程导论 Python 笔记 1

    计算机科学及编程导论在 MIT 的课程编号是 6.00.1,是计算机科学及工程学院的经典课程.之前,课程一直使用 Scheme 作为教学语言,不过由于 Python 简单.易学等原因,近年来已经改用 ...

  4. 13.python笔记之pyyaml模块

    Date:2016-03-25 Title:13.Python笔记之Pyymal模块使用 Tags:Python Category:Python 博客地址:www.liuyao.me 作者:刘耀 YA ...

  5. python笔记 - day5

    python笔记 - day5 参考: http://www.cnblogs.com/wupeiqi/articles/5484747.html http://www.cnblogs.com/alex ...

  6. guxh的python笔记一:数据类型

    1,基本概念 1.1,数据类型 基本数据类型:字符串,数字,布尔等 引用数据类型:相对不可变(元组),可变(列表,字典,集合等) 基本数据类型存放实际值,引用数据类型存放对象的地址(即引用) ==:判 ...

  7. s21day12 python笔记

    s21day12 python笔记 一.函数中高级 1.1 函数可以做返回值 #示例: def func(): print(123) def bar(): return func v = bar() ...

  8. python笔记-1(import导入、time/datetime/random/os/sys模块)

    python笔记-6(import导入.time/datetime/random/os/sys模块)   一.了解模块导入的基本知识 此部分此处不展开细说import导入,仅写几个点目前的认知即可.其 ...

  9. python 笔记-转

    python笔记   Python 学习笔记 - 14.技巧(Tips)   Python 学习笔记 - 13.异常(Exception)   Python 学习笔记 - 12.流程控制(Contro ...

随机推荐

  1. vps批量管理,服务器批量管理,3389批量管理工具

    注册的第一天,把我的工具弄上来.如果有一个软件,如果你有vps虚拟机,服务器,3389中的任意一种两种或全部,而且还是批量的,需要管理.那么,你可能会想找个软件来管理吧,毕竟,一个人忙不过来管理这么多 ...

  2. html页脚固定在底部的方法

    <style type="text/css"> html { height: 100%; } body { height: 100%; margin: 0; paddi ...

  3. 「Luogu P2508」[HAOI2008]圆上的整点 解题报告

    题面 给定圆的半径,求圆上整点数 这是一道很Nice的数学题!超爱!好吧,由于这道题,我去Study了一下复数(complex number)复杂的数 真棒!!! 有兴趣的戳这里!!!\(\huge ...

  4. 小小知识点(四十八)——发送端已知CSI,基于预编码技术,进一步提高MIMO系统和用户的吞吐量

    1.预编码技术的概念 对于空间复用,LTE既支持开环方式的空间复用(发端未知CSI),也支持闭环方式的空间复用(发端已知CSI) 对于LTE中闭环方式的空间复用(即预编码系统)中,发射机可以根据信道条 ...

  5. centos7.3安装chrome

    Centos7安装chrome浏览器 1.配置yum源 在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repo cd /ect/yum.repos.d/ vim ...

  6. JS中的splice方法

    JS中的splice方法 定义和用法 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目. 注释:该方法会改变原始数组(集合). 语法 arrayObject.splice(ind ...

  7. 一起来立Flag吧!超炫的数据图表分析 2020 年 Java 技术趋势

    引言 2020 来了,第一批 00 后已经 20 岁了,95 后也到了晚婚的年龄,员外的头发也越来越少了,新的一年大家有立下了哪些 Flag ?小伙伴们别急着立 Flag,让员外帮你分析一下哪些技术正 ...

  8. P2722 总分 Score Inflation (完全背包模板)

    题目传送门:P2722 总分 Score Inflation 题目描述 我们可以从几个种类中选取竞赛的题目,这里的一个"种类"是指一个竞赛题目的集合,解决集合中的题目需要相同多的时 ...

  9. Mybatis Plugin 以及Druid Filer 改写SQL

    背景 工作中偶尔会碰到需要统一修改SQL的情况,例如有以下表结构: CREATE TABLE `test_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, ` ...

  10. CVE-2019-0708远程桌面服务远程执行代码漏洞exp利用过程

    CVE-2019-0708远程桌面服务远程执行代码漏洞 上边这洞是啥我就不多说了,描述类的自行百度. 受影响系统版本范围: Windows Server 2008 R2 Windows Server ...