今日内容

  作业题(21题)

  推导式

  装饰器

  模块【可选】

内容回顾

  1.函数

    a.参数

      def func(a1,a2):pass

      def func(a1,a2=None):pass 默认参数推荐使用不可变类型,慎用可变类型,如列表

      def func(*args,**kwargs):pass 万能参数

      注意:位置参数>关键字参数,所以位置参数一定在关键字参数的前面

      面试题:函数可以作为参数        

        def func(arg):
        arg()
        def show():
        pass
        func(show)
      函数的参数传递的是什么【内存地址=引用or值】
      
      v = [11,22,33,44]
      def func(arg):
      print(id(arg)) #输出列表的内存地址       print(id(v)) #输出列表的内存地址
      func(v) #两次输出的结果一致,所有参数传递的是内存地址
      *args和**kwargs的作用

    b.返回值

      常见数据类型可以返回

      函数也可以返回

        def func():
        def inner():
        pass
        return inner         v = func()

      特殊情况

        默认没有返回值为None

        return 1,2,3等价于return (1,2,3,)

    c.执行参数

      函数不被调用,其内部代码永远不会执行。

示例一:   

def func():
return i
func_list=[]
for i in range(10):
func_list.append(func)
print(i) #输出结果为9
v1 = func_list[0]() #输出结果为9
v2 = func_list[4]() #输出结果为9
print(v1,v2)

示例二:

func_list=[]
for i in range(10):
func_list.append(lambda : i) #函数不被调用,内部永远不知道执行什么
print(func_list) #输出还有10个lambda函数的列表
v1= func_list[2]()
v2= func_list[4]()
print(v1,v2) #输出结果为9, 9   

      执行函数时,会新创建一块内存保存自己函数执行的信息==》闭包

示例一:

def base():
return i
def func(arg):
def inner():
return arg()
return inner
base_list = []
func_list = []
for i in range(10):
base_list.append(base)
func_list.append(func(i))
#1 base_list和func_list中分别保存的是什么
#base_list中存储是10个base函数
#func_list中存储是10个inner函数,特别要说的是每个inner是在不同的地址创建的,都是一个变量i,形成一个闭包 #2如果循环打印什么?
for item in base_list:
v = item() #执行base函数
print(v) #每次返回结果都是9 for data in func_list:
v = data() #执行inner函数
print(v) #返回结果为:0,1,2,3,4,5,6.。。。。

    d.总结

      传参:位置参数 > 关键字参数

      函数不被调用,其内部代码永远不运行

      每次调用函数时,都会为此调用开辟一块内存,内存可以保存自己以后想用的值

      函数是作用域,如果自己作用域中没有,则往上级作用域找。

2.内置与匿名函数

   内置函数

   匿名函数即lambda函数

3.模块

  random

  hashlib

  getpass

内容详细

1.作业题讲解

2.装饰器

v = 1
v = 2 #表示重新赋值
#########################################
def func():
pass
v = 10
v = func #########################################
def base():
print(1) def bar():
print(2)
bar = base
bar() #执行的是base函数 #########################################
def func():
def inner():
pass
return inner
v = func()
print(v) #v即inner函数 #########################################
def func(arg):
def inner():
print(arg)
return inner
v1 = func(1) #v1是inner函数,是一个闭包,其中arg = 1
v2 = func(2) #v2是inner函数,是一个闭包,其中arg = 2 #########################################
def func(arg):
def inner():
arg()
return inner
def f1()
print(123) v1 = func(f1) #v1是一个inner函数,其中arg =f1函数
v1() #相当于执行inner函数,即执行f1函数,输出123 #########################################
def func(arg):
def inner():
arg()
return inner
def f1():
print(123)
return 666
v1 = func(f1) #执行func函数,并将f1函数作为参数传递 ,v1相等于inner函数
result = v1() #执行inner函数,并执行f1函数,输出123,返回666,但没有接收,其结果为None
print(result) #输出None #########################################
def func(arg):
def inner():
return arg()
return inner
def f1():
print(123)
return 666
v1 = func(f1) #执行func函数,并将f1函数作为参数传递 ,v1相等于inner函数
result = v1() #执行inner函数,并执行f1函数,输出123,返回666接收
print(result) #输出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 #index变量被重新赋值
v3 = v2() #执行inner函数,打印before,执行arg函数,打印123,返回666赋值给v,打印after,返回值v=666gei v3
""" #示例三
"""
v4 = func(index) #v2是inner函数,且arg= index函数
index = v4 #index变量重新赋值为inner函数
index() #执行inner函数
""" #示例四
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) #装饰器:在不改版原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能,应用如下:
#计算函数执行时间
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.5)
print(123) @wrapper
def func3():
time.sleep(3)
print(123) func1()
func2()
func3()

总结

  装饰器的目的:在不改变原函数代码的基础商,在函数执行前后自定义功能。

  编写装饰器与应用 

#装饰器的编写
def x(func):
def y():
#前
ret = func()
#后
return ret
return y
#装饰器的应用
@x
def index():
return 10
@x
def manager():
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 条件] #只有条件为真才进行append
"""
v1 = [i for i in 'alex'] #返回结果为:['a','l','e','x']
v2 = [i+100 for i in range(10)] #返回结果为:[100,101,102,103,104,105,106,107,108,109]
v3 = [99 if i>5 else 66 for i in range(10)]
#返回结果为:[66,66,66,66,66,66,99,99,99,99] def func():
return 100
v4 = [ func for i in range(10)] #返回结果为:含有10个func函数的列表 v5 = [ lambda :100 for i in range(10)] #返回结果为:含有10个lambda函数的列表
result = v5[9]() # 返回结果为100 def func():
return i
v6 = [ func for i in range(10)] #含有10个func函数的列表
result= v6[5]() #返回结果为:9 v7 = [ lambda :i for i in range(10)] #含有10个lambda函数的列表
result = v7[5]() #返回结果为:9 v8 = [ lambda x:x*i for i in range(10)] #含有10个lambda函数的列表
result = v8[0](2) #返回结果为:18 #面试题
def num():
return [lambda x:x*i for i in range(4)]
#num()----> [lambda函数,lambda函数,lambda函数,lambda函数]
print([m(2) for m in num()]) #返回结果为:[6,6,6,6] ######################################筛选##################################
v9 = [i for i in range(10) if i >5] #返回结果为:[6,7,8,9]

  集合推导式

  v1 = { i for i in 'alex'} #返回结果为{'a','l','e','x'}
  v2 = { i for i in 'alalex'} #返回结果为{'a','l','e','x'},注意集合具有去重的作用

  字典推导式

  v1 = { 'k'+str(i): i for i in range(10)} #返回结果为:{'k0':0,'k1':1.....}

今日总结

  装饰器(6**)

    编写格式:双层嵌套函数

    应用格式:@外层函数

    理解:变量赋值

      def func():

        print(1)

      v1 = func

      func = 666

    看看到底return的是什么

    自己 > 上级作用域

  背会:

    @xx # index= func(index)

    def index():

      pass

    index()

  推导式(3**)

  模块

    import  time

    v = time.time() #获取当前时间

    time.sleep(2) #睡2秒

20200220--python学习第13天的更多相关文章

  1. python 学习笔记 13 -- 经常使用的时间模块之time

    Python 没有包括相应日期和时间的内置类型.只是提供了3个相应的模块,能够採用多种表示管理日期和时间值: *    time 模块由底层C库提供与时间相关的函数.它包括一些函数用于获取时钟时间和处 ...

  2. Python 学习笔记13:Python + wsgi + django 配置。坑爹的python3和wsgi不兼容的解决

    今人不见古时月,今月曾经照古人.生命是如此的美丽与短暂! 学习Python已经两个月了,Python的语法通过做简单的语法题和看Python语法介绍,有了初步的了解.但上班还是要做别的事情,所以感觉学 ...

  3. Python学习:13.Python正则表达式

    一.正则表达式简介 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. 就其本质 ...

  4. Python学习总结13:os模块

    os模块包含普遍的操作系统功能,与具体的平台无关.常用于处理文件和目录这些我们日常手动需要做的操作. 1. os模块函数汇总 1) os.name():判断现在正在实用的平台,Windows 返回 ‘ ...

  5. Python学习(13)函数

    目录 Python 函数 函数调用 匿名函数 return语句 变量作用域 Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复 ...

  6. Python学习笔记13—错误和异常

    常见的异常:

  7. python学习笔记13(模块、包)

    在Python中有一个概念叫做模块(module),比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块. 模块文件以.py后缀结 ...

  8. Python学习总结 13 Scrapy

    当前环境是 Win8 64位的,使用的Python 3.5 版本. 一 安装Scrapy 1,安装 lxml pip install lxml -i https://pypi.douban.com/s ...

  9. 从零开始的Python学习Episode 13——常用模块

    模块 一.time模块 时间戳(timestamp) :时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. 元组(struct_time)   :struct_time元组共有9 ...

  10. Python学习笔记13:标准库之子进程(subprocess包)

    ubprocess包主要功能是运行外部的命令和程序.从这个意义上来说,subprocess的功能与shell类似. subprocess以及经常使用的封装函数 当我们执行python的时候,我们都是在 ...

随机推荐

  1. (1)解锁 MongoDB replica set核心姿势

    副本集Replica Set是一个术语,定义具有多节点的数据库集群,这些节点具有主从复制(master-slave replication) 且节点之间实现了自动故障转移. 这样的结构通常需要具有奇数 ...

  2. Redis-缓存穿透、缓存雪崩、缓存击穿、缓存一致性、并发竞争

    缓存流程 在讲这五个问题之前,首先我们回顾下正常的缓存的使用流程 程序在处理请求时,会先从缓存中进行查询,如果缓存中没有对应的key,则会从数据库中查询,如果查询到结果,并将查询结果添加到缓存中去,反 ...

  3. 树形dp - 求树的直径

    随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置可 ...

  4. ORM _meta

    import os if __name__ == '__main__': os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'XadminDemon.se ...

  5. asp.net生成店铺推广二维码,二维码中间加logo(源码)

    二维条码比一维条码记载数据量更多,二维码条码是一种高密度.高信息含量的便携式数据文件,是实现证件及卡片等大容量.高可靠性信息自动存储.携带并可用机器自动识读的理想手段.而且可以记载更复杂的数据,比如图 ...

  6. 异常java.lang.NoSuchMethodError: org.springframework.core.GenericTypeResolver.resolveTypeArguments(Ljava/lang/Class;Ljava/lang/Class;)[Ljava/lang/Class;

    java.lang.NoSuchMethodError: org.springframework.core.GenericTypeResolver.resolveTypeArguments(Ljava ...

  7. java小心机(6)| 多态的一些坑

    对于"多态"的概念,想必大家都很熟悉了,但我们还是来回顾一下吧 class Actor { public void act(){ System.out.println(" ...

  8. 传递额外的值 Passing Extra Values |在视图中生成输出URL | 高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼

    结果呢 <a href="/App/DoCustomVariable?id=Hello">This is an outgoing URL</a> 理解片段变 ...

  9. 20191212模拟赛 问题B

    题目: 分析: 上来看到k=2,... SB杜教筛phi 有点感冒,这把养生一点... 于是写了55分走人了.. 下来一看挺简单的啊2333 不考虑gcd时,构造数列的方案为C(N+K-1,K) 考虑 ...

  10. Linux程序守护脚本

    不废话,直接上脚本,[]注释的下发语句需要按需替换: #!/usr/bin/env bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/us ...