一、装饰器:

  本质是函数,装饰其他函数,为其他函数添加附加功能。

  原则:

    1.不能修改被装饰函数的源代码。 

    2.不能修改被装饰函数的调用方式。

  装饰器用到的知识:

          1.函数即变量   (把函数体赋值给函数名)

          2.高阶函数 (1.一个函数接受另一个函数名作为实参2.返回值中含有函数名)

          3.嵌套函数(一个函数嵌套这另一个函数)  

    先看高阶函数 :

           1。要实现不修改被装饰函数的源代码,就要使用一个函数接受另一个函数名作为实参

          

            2.要实现不修改源代码的调用方式,使用返回值中包含函数名

 

    嵌套函数:

def test1():
print("in the test1")
def test2():
print("in the test2")
test2()
test1() #一个函数中包含另一个函数,而且内部的函数只能在内部调用

     装饰器的实现

#给计算test的运行时间
def timer(func):
def wrapper():
start_time = time.time()
func()
end_time = time.time()
print("函数运行时间:%s"%(end_time-start_time))
return wrapper
@timer
def test():
time.sleep(1)
# test = timer(test)
test()
import time
def timer(func):
def wrapper(n):
start_time = time.time()
func(n)
end_time = time.time()
print("函数运行时间:%s"%(end_time-start_time))
return wrapper
@timer
def test(n): #当函数中含有参数时
time.sleep(1)
print("打印的值为:%s"%n)
# test = timer(test)
test(5)
 import time
def timer(func):
def wrapper(*args,**kwargs): #当函数中含有任意多个参数参数时
start_time = time.time()
func(*args,**kwargs)
end_time = time.time()
print("函数运行时间:%s"%(end_time-start_time))
return wrapper
@timer
def test(age,name):
time.sleep(1)
# print("打印的值为:%s")
print("年龄是%s,名字是%s"%(name,age))
# test = timer(test)
test(24,name='小明')

二、迭代器与生成器

  列表生成式     [i *2 for i in range(10)]

  生成器      1.只有在调用的时候才会生成数据。2.只记录当前位置。3.只有next方法,直到最后抛出stopiteration才终止

      第一种形式

 [i *2 for i in range(10)]   #列表生成式
x = (i *2 for i in range(10)) #生成器
print(x.__next__())
print(x.__next__())
print(next(x))

       第二种形式

 def f(maxiter):
n,a,b = 0,0,1
while n<maxiter:
yield b #用函数形成生成器 含有 yield
a,b = b,a+b
n += 1
x = f(10)
print(x.__next__()) #要想生成数据,需要调用next方法
print(x.__next__())

      

    如果要获取生成器的值,就要捕获stopiteration异常

 def f(maxiter):
n,a,b = 0,0,1
while n<maxiter:
yield b
a,b = b,a+b
n += 1
return "done" #如果要获取函数的返回值,就要捕获stopiteration异常
x = f(3)
while True:
try:
print("x:",x.__next__())
except StopIteration as e:
print("生成器返回值:",e.value)
break
 #最简单的生产者消费者模型
import time
def consumer(name):
print("%s要准备吃包子了"%name)
while True:
baozi = yield
print("%s包子被%s吃了"%(baozi,name))
def produser(name):
c1 = consumer('A')
c2 = consumer('B')
c1.__next__()
c2.__next__()
for i in range(10):
time.sleep(1)
print("%s做了2个包子"%name)
c1.send(i)
c2.send(i)
produser('xiaoming')
  可迭带对象iterable:可以直接用for循环的对象称为可迭代对象   可以用isinstance()函数判断是不是可迭代对象

  迭代器iterator:可以调用next方法,并不断返回下一个值的对象     生成器都是迭代器,list、dict、str 都是可迭代对象,但不是迭代器。可用iter方法使之称为迭代器

          

三、map、filter、reduce函数

  

 print(map(lambda x:x*2,range(10)))
print(list(map(lambda x:x*2,range(10))))
#map(func,iterable)对iterable调用func 得到的是
print(list(filter(lambda x:x>5,range(10))))
#filter(func,iterable) #对可迭代对象进行筛选
print(list(filter(lambda x:x.startswith('m'),['mn','mb','b'])))
from functools import reduce
print(reduce(lambda x,y:x+y,range(10))) #进行累加操作
# reduce(func,iterable)

四、json和pickle模块

  

 data ={'name':'zqq','age':8,'sex':"boy"}
f = open("file.json","r")
# f.write(str(data))
import json
x = json.dumps(data) #序列化 或 json.dump(data,f) dump可以多次,load只能一次
f.write(x)
data = json.loads(f.read()) #反序列化 或json.load(f)
print(data)
f.close() f = open("ddd.txt","wb")
import pickle
x = pickle.dumps(data) #序列化 pickle.dump(data,f)
f.write(x)
f.close()
f = open("ddd.txt","rb")
import pickle
data = pickle.loads(f.read()) #反序列化 pickle.load(f)
print(data)

我的Python分析成长之路5的更多相关文章

  1. 我的Python分析成长之路7

    类 一.编程范式: 1.函数式编程   def 2.面向过程编程   (Procedural Programming) 基本设计思路就是程序一开始是要着手解决一个大的问题,然后把一个大问题分解成很多个 ...

  2. 我的Python分析成长之路6

    模块:本质就是.py结尾的文件.从逻辑上组织python代码. 包: 本质就是一个目录,带有__init__.py文件,从逻辑上组织模块. 模块的分类: 1.标准库(内置的模块) 2.开源库(第三方库 ...

  3. 我的Python分析成长之路10

    matplot数据可视化基础 制作提供信息的可视化(有时称作绘图)是数据分析中最重要任务之一. 1.图片(画布)与子图 plt.figure :创建一张空白的图片,可以指定图片的大小.像素. figu ...

  4. 我的Python分析成长之路8

    Numpy数值计算基础 Numpy:是Numerical Python的简称,它是目前Python数值计算中最为基础的工具包,Numpy是用于数值科学计算的基础模块,不但能够完成科学计算的任而且能够用 ...

  5. 我的Python分析成长之路11

    数据预处理 如何对数据进行预处理,提高数据质量,是数据分析中重要的问题. 1.数据合并 堆叠合并数据,堆叠就是简单地把两个表拼在一起,也被称为轴向链接,绑定或连接.依照轴的方向,数据堆叠可分为横向堆叠 ...

  6. 我的Python分析成长之路2

    2018-12-29 一.python数据类型: 1.数字 int(整形) float(浮点型) complex(复数型) 2.布尔值(bool)     真或假 True or False 3.字符 ...

  7. 我的Python分析成长之路1

    Python是什么?                                                                                           ...

  8. 我的Python分析成长之路9

    pandas入门 统计分析是数据分析的重要组成部分,它几乎贯穿整个数据分析的流程.运用统计方法,将定量与定性结合,进行的研究活动叫做统计分析.而pandas是统计分析的重要库. 1.pandas数据结 ...

  9. 我的Python分析成长之路4

    一.函数 1.什么是函数?:函数是带名字的代码块,调用函数,只要调用函数名就可以.    2.函数的性质:1.减少重复代码 2.使程序变得可扩展 3.使程序变得易维护 3.编程范示: 1.面向对象编程 ...

随机推荐

  1. APACHE服务器httpd.exe进程占用cpu100%的解决方法

    httpd.exe进程占用cpu%100,关闭掉AppServ服务,cpu应用率立刻下降到0. 重新启动AppServ又出现占用cpu高的情况. 原因,httpd.exe和防火墙配置有冲突. 解决方法 ...

  2. Java之内部类、包及代码块

    个人通俗理解: 1.内部类:有点类似于写在父类中的子类,根据位置不一样为不同的名字,和相应的访问方式不同:不过要访问外部类的话,需要充分运用好this(本类)的这个关键字:要是需要快速的创建子类对象的 ...

  3. mongodb 原子操作findAndModify

    原子操作模型数据findAndModify 推荐的方法,以保持原子将保留所有的相关信息,这些信息经常更新,一个文档中使用嵌入文档.这将确保所有的更新为一个单一文档是原子. 考虑下面的 products ...

  4. CF1060C Maximum Subrectangle

    思路: 不难发现,对矩阵中的数字求和实际上是先分别对a,b两个数列中对应子段的元素求和再相乘.题目是要求在和不超过给定值的情况下使选出的矩阵面积最大.我们反其道而行之,考虑在子段长度一定的情况下,和最 ...

  5. JavaScript中的this陷阱

    当有人问起你JavaScript有什么特点的时候,你可能立马就想到了单线程.事件驱动.面向对象等一堆词语,但是如果真的让你解释一下这些概念,可能真解释不清楚.有句话这么说:如果你不能向一个6岁小孩解释 ...

  6. ES-什么是elasticsearch

    前言 观今宜鉴古,无古不成今.在学习elasticsearch之前,我们要知道,elasticsearch是什么?为什么要学习elasticsearch?以及用它能干什么? 关于elasticsear ...

  7. iOS 锁的常用方法

    锁的用法在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题: 方法一,@synchronized(id anObject),(最简单的方法)会自动对参数对象加锁,保证临界区内的代码线程安 ...

  8. DVWA之Brute Force教程

    ---恢复内容开始--- Brute Force暴力破解模块,是指黑客密码字典,使用穷举的方法猜出用户的口令,是一种广泛的攻击手法. LOW low级别的漏洞利用过程 1.使用burp suite工具 ...

  9. Jenkins执行shell脚本启动tomcat失败解决方法

    环境:Centos 7 Jenkins版本:2.124 状况:Jenkins会执行服务器某个目录下的Shell, 脚本中功能是复制替换某两个配置文件,然后关闭tomcat,重启Tomcat. 但是,T ...

  10. Spring Boot: Spring Starter Project

    好久没有创建过新项目,楼主发现Spring Boot项目创建失败了!!! 其中有两处错误: [图一不知道是哪里错,果断删掉重输入一次.成功进入下一步  其余步骤也没有错误,然而  最后一步失败了,如图 ...