今日内容

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

内容回顾

  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. Spring Boot 定时+多线程执行

    Spring Boot 定时任务有多种实现方式,我在一个微型项目中通过注解方式执行定时任务. 具体执行的任务,通过多线程方式执行,单线程执行需要1小时的任务,多线程下5分钟就完成了. 执行效率提升10 ...

  2. windows10 powershell上切换至cmd

    前言 在windows10 上是遇到了坑,因为出现了这样的情况!不要说什么盗版,公司买的正版呢. 上图是powershell,下图是 cmd,然后我同样使用powershell 与 cmd,查询nod ...

  3. MVC 之集合类转化为DataTable

    private static DataTable ToDataTableTow(IList list) { DataTable result = new DataTable(); if (list.C ...

  4. License for package Android SDK Build-Tools 28.0.3 not accepted

    License for package Android SDK Build-Tools 28.0.3 not accepted 用flutter进行编写时出现了标题的错误,不是配置的原因,而是需要接受 ...

  5. ASP.NET Core Web程序托管到Windows 服务

    前言 在 .NET Core 3.1和WorkerServices构建Windows服务 我们也看到了,如何将workerservices构建成服务,那么本篇文章我们再来看看如何将web应用程序托管到 ...

  6. CF1200E Compress Words | 字符串hash

    传送门 Examples input 1 5 I want to order pizza output 1 Iwantorderpizza input 2 5 sample please ease i ...

  7. must appear in the GROUP BY clause or be used in an aggregate function

    今天在分组统计的时候pgsql报错 must appear in the GROUP BY clause or be used in an aggregate function,在mysql里面是可以 ...

  8. 如何实施DevOps

    对于长期在孤立的架构下工作的组织来说,转移到协作式DevOps系统似乎是难以成功的.为了进一步提高效率,必须改变观念,并进行团队文化改变.例如:许多人认为只有自动化工具才能解决DevOps,其实这是不 ...

  9. 异数OS 织梦师-云(五)-- 容器服务化,绿色拯救未来。

    . 异数OS 织梦师-云(五)– 容器服务化,绿色拯救未来. 本文来自异数OS社区 github: https://github.com/yds086/HereticOS 异数OS社区QQ群: 652 ...

  10. Elasticsearch如何修改Mapping结构并实现业务零停机

    Elasticsearch 版本:6.4.0 一.疑问 在项目中后期,如果想调整索引的 Mapping 结构,比如将 ik_smart 修改为 ik_max_word 或者 增加分片数量 等,但 El ...