今日内容

  作业题(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. 字符串转hash

    #include<bits/stdc++.h> using namespace std; unsigned hash[]; ; int ans; int main() { ;k<=; ...

  2. Greedy Gift Givers 贪婪的送礼者 USACO 模拟

    1002: 1.1.2 Greedy Gift Givers 贪婪的送礼者 时间限制: 1 Sec  内存限制: 128 MB提交: 9  解决: 9[提交] [状态] [讨论版] [命题人:外部导入 ...

  3. Java配置文件读取中文乱码问题

    背景 这是我之前在做的用友服务对接开发,昨天领导拿给财务测试时告诉我有乱码,当时我第一想法是用友那边的编码格式有问题,因为还在做其他任务,我说等问一下用友他们用的什么编码格式我们这边改一下,然后今天早 ...

  4. Office系列(2)---提取Office文件(Word、PPT)中的所有图片

    回顾一下上文结尾的问题:如何给文档设置一个合适的封面图?其中一个解决方案就是,获取Office文件内部的图片作为封面.这里就详细介绍下获取图片的几种方式,以及他们各自的优缺点. PS:因为之前用VST ...

  5. 【Java并发基础】安全性、活跃性与性能问题

    前言 Java的多线程是一把双刃剑,使用好它可以使我们的程序更高效,但是出现并发问题时,我们的程序将会变得非常糟糕.并发编程中需要注意三方面的问题,分别是安全性.活跃性和性能问题. 安全性问题 我们经 ...

  6. 【WPF学习】第二十三章 列表控件

    WPF提供了许多封装项的集合的控件,本章介绍简单的ListBox和ComboBox控件,后续哈会介绍更特殊的控件,如ListView.TreeView和ToolBar控件.所有这些控件都继承自Item ...

  7. 长连接 Websocket

    import json from flask import Flask,request,render_template from geventwebsocket.handler import WebS ...

  8. linux下的特殊模式

    单用户模式 ubuntu 16.04 单用户操作 1.重启操作系统,BIOS引导过后一直按住shift,出现GUN Grub菜单: 2.选择Advanced options for Ubuntu选项回 ...

  9. 【阿里云IoT+YF3300】12.阿里云IoT Studio入门介绍

    阿里云IoT Studio是针对物联网场景提供的生产力工具,可覆盖各个物联网行业核心应用场景,帮助您高效经济地完成设备.服务及应用开发.物联网开发服务提供了移动可视化开发.Web可视化开发.服务开发与 ...

  10. js数组冷知识

    省略数组值 在声明数组时,省略一些数组值 let a = [1,,3] //a.length为3 a = [,,] //a.length为2 0 in a //false,a在索引0处没有元素 稀疏数 ...