回顾下上次的内容

转码过程:
先decode  为 Unicode(万国码 ) 然后encode 成需要的格式
 
 
3.0 默认是Unicode  不是UTF-8
所以不需要指定  如果非要转为UTF-8  就再指定
变量的查找顺序:
1 从里往外找,先找自己本地的local  没有就会去上一级找,直到找到此变量,
 
 
全局变量不能在函数里改变指的是纯字符的,
list 及字典等会改变
函数递归:
 
一层一层进去,
return 一层一层出来
 
特点:
# 明确的结束条件
# 问题规模每递归一次都应该比上一次的问题规模有所减少
# 效率低
 
 
高阶函数:
把一个函数当作另一个函数的值传进去
 
 
函数式编程:
1 真正的函数式编程是没有变量的,是什么就是什么
2 没有副作用,传入的参数是什么结果就是一定的
 
 
 
文件打开方式:
基本: r w a
其他: r+ 是追加  w+ 写读,基本没用  a+ 追加写读
           rb 二进制模式打开,是bytes 模式   wb 二进制  ab
   

下面开始讨论装饰器

装饰器:
 
本质: 是函数
作用: 是装饰其他函数,就是为其他函数添加附加功能

先写一个基础函数:

当我们需要给基础函数增加功能时,有以下三种方法:
1 修改函数代码,添加功能
2 定义一个函数,把新函数添加到旧的函数中
3 使用装饰器(最好)
 
但是:
生产环境中,函数一旦写好了原则上是不能修改函数的

所以装饰器的原则:

1 不能修改被装饰的函数的源代码
2 不能修改被装饰的函数的调用方式
 
实现装饰器知识储备:
1 函数即“变量”
2 高阶函数
3 嵌套函数
 
最终: 高阶函数+嵌套函数 ==》装饰器

先来看函数式怎么定义,怎么运行的:

函数只有在调用运行的时候才会去找定义的函数:

下面的例子是可以运行的:

函数体 就是一堆字符串,没有任何功能,我们在定义的时候只是把这一堆字符串放到了一个内存空间里。

这里说一下解释器回收内存的机制:

门牌号没有的情况下就会清理房间

当门牌号没有的时候就是没有人再找这个房间的时候,就可以清理房间

当然也有匿名函数:

没有引用,立刻删除

什么叫做高阶函数:
 1  把一个函数名当作实参传给另外一个函数
 2  返回值中包含函数名

高阶函数的使用案例:

实现的装饰器的功能但是修改了调用方式
在生产中是不可以修改调用方式的,因为你自己可以修改,但是别人调用的就不能修改了
嵌套函数:
在函数体里用def 定义一个内部的函数,只是调用的话就不叫嵌套函数,要有return 值

所以是这样写的:

说到这里我们要复习一下作用域:

真正开始装饰器:

 把deco的内存地址赋予给原来的函数,再运行deco 函数

总结一下:

嵌套函数 return  用来实现不改变函数引用方式
高阶函数 用来实现新增功能
想要装饰哪个函数就写到哪个函数的前面
语法糖  @

装饰器的传入参数:

适应所有的传参:
装饰器: 有参数没有参数,有多少参数都行。

实践:  这种的装饰器可以满足日常90% 的需求了。

 #!/usr/bin/env python3
# Auth: Shen Yang
import time
#基础
#-------------------
def test1():
time.sleep(2)
print("in the test1")
#test1()
def test2(name):
print("hehe",name)
#test2()
#-------------------
#定义一个装饰器函数
def timer(func): #定义一个传入参数
def deco(*args,**kwargs): #定义一个内嵌函数,实现新功能
start_time = time.time()
func(*args,**kwargs)
stop_time = time.time()
print("The func run time is {_time}".format(_time=stop_time-start_time))
return deco #返回deco 临时函数的内存地址,从外面调用
@timer #test1 =timer(test1)
def test1():
time.sleep(2)
print("in the test1")
@timer #test2 =timer(test2("Wang Lu"))
def test2(name):
print("hehe",name)
test1()
test2("Wang Lu")

迭代器&生成器
 
 
列表生成式
 
一句搞定三句的列表生成式

还可以使用函数 
 

把列表生成器变成一个生成器

 

必须循环到我的时候才会生成,所有不支持像列表那样直接选择第多少个
不然就会报错

生成器特点:
1 只有在调用时才会生成相应的数据
2 只记住当前的位置,不能往回返,因为前面的已经没有了,只能一个一个走
#1 只能通过for 循环
 
生成器的方法:
只有一个方法,取下一个
c.__next__()    #2.7 里是 next()  

把函数改为生成器:

异常处理:

只要有yield 存在就是一个生成器
return  作用就是有异常的时候返回异常
实践:
列表生成器

生成器

方法:
 list2 = (i*3 for i in range(10))
print(list2.__next__())
print("chulai1")
print(list2.__next__())
print("chulai2")
print(list2.__next__())
print("chulai3")
print(list2.__next__())

函数:

 def gent(max):
n,a,b = 0,0,1
while n < max:
print(b)
a,b = b,a + b
n = n + 1
return "Over"
gent(10)

变成生成器:

 def gent(max):
n,a,b = 0,0,1
while n < max:
yield (b)
a,b = b,a + b
n = n + 1
return "Over"
flb = gent(10)
print(flb.__next__())
print(flb.__next__())
print(flb.__next__())
print(flb.__next__())

使用return 返回错误:

 def gent(max):
n,a,b = 0,0,1
while n < max:
yield (b)
a,b = b,a + b
n = n + 1
return "Over"
flb = gent(10)
while True:
try:
a = flb.__next__()
print("this is ",a)
except StopIteration as err:
print("Error in ",err.value)
break

yield 保存了函数的中断状态
 
给yield 传值 使用  send("韭菜陷")
唤醒yield 同事给yield 传值
__next__  只是唤醒
 

实践:

 def consumer(name):
print("{_name}准备吃包子哈".format(_name=name))
while True:
baozi = yield
print("做出了{_baozi}的包子,被{_name}吃啦".format(_baozi=baozi,_name=name)) c = consumer("Wanglu")
c.__next__()
c.send("韭菜馅") #和__next__ 效果一样,但是给 yield 传入了参数

 import time
def consumer(name):
print("{_name}准备吃包子哈".format(_name=name))
while True:
baozi = yield
print("做出了{_baozi}的包子,被{_name}吃啦".format(_baozi=baozi,_name=name))
def producer():
c = consumer("王璐")
c1 = consumer("申嘉锐")
c.__next__()
c1.__next__()
print("开始做包子了!!!")
for i in range(1,10):
time.sleep(1)
print("做了个包子,分两半来吃吧")
c.send(i)
c1.send(i)
producer()

上面的是最简单的协程
异步IO 模型  eoppll
 
 
 
迭代器:

 

简单的理解: 可迭代就是可循环的对象
 
判断是否可迭代

迭代器 和 可迭代对象 不是一回事

把 list  dic  str 变为迭代器

for 循环 中的range 实质就是迭代器
读取文件的line 实质就是迭代器
 
 
内置方法:

abs()  取绝对值
all()  所有都为真返回真

any()  任意一个为真就返回真,如果为空返回False

ascii() 吧内存的对象转换为可打印的字符串

bin() 十进制整数转为二进制   有用

bytes()

bytearray() 可修改的二进制

callable() 判断是否可调用

chr() 返回aiscll 码对应的字符

ord() 返回aiscll 位置对应的序号

compile()

直接 exec() 就可以执行字符串,上面的不用了
 
dir()  查看对象可使用的方法
 
divmod()   返回商和余数
evel()  执行 加减乘除 有语句不能用
 
exec() 执行语句
 
 
匿名函数  当一个功能只需要调用一次的时候就使用匿名函数,用完就删除
以下效果一模一样:
不支持for  和判断,只能写三元运算

filter() 一组数据中过滤出满足条件数据。

map() 对传入的每一个值进行处理,返回相应的结果   和列表生成器 一样的

reduce()  需要import functools

frozenset()  编程一个不可变集合

globals()  以key value 形式返回整个文件中变量

hash()   同过一系列算法变成一个固定的表
max()  返回最大值
min()  返回最小值
 
next()  ==== 》 __next__
 
object
python 一切皆对象
一个对象有属性,有方法
列表,字符串,一切 都是对象,通过. 来调用方法

hex() 16进制转换

 oct()  8进制转换
round() 保留小数点后几位
slice()  
sorted()  排序
默认按key 来排序

zip()  拉链,一拉就和到一起了

如果有多的或者少的按少的算:

__import__()  非常有用:   导入字符串的模块

json  序列化:
 
 
 
不标准的做法:

序列化:

反序列化:

json  只能处理简单的数据类型,如函数啊 类啊 就报错

pickle   
 
用法和json 一样,可以序列化所有数据类型
 
 
记住: 
只dump 一次,只load 一次
 
 
 

找其他目录的程序并运行

绝对路径:

动态添加环境变量,才能import

day04 装饰器 迭代器&生成器 Json & pickle 数据序列化 内置函数的更多相关文章

  1. Python之路-python(装饰器、生成器、迭代器、Json & pickle 数据序列化、软件目录结构规范)

    装饰器: 首先来认识一下python函数, 定义:本质是函数(功能是装饰其它函数),为其它函数添加附件功能        原则:        1.不能修改被装饰的函数的源代码.        2.不 ...

  2. 装饰器、生成器,迭代器、Json & pickle 数据序列化

    1. 列表生成器:代码例子 a=[i*2 for i in range(10)] print(a) 运行效果如下: D:\python35\python.exe D:/python培训/s14/day ...

  3. Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化

    一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...

  4. 迭代器/生成器/装饰器 /Json & pickle 数据序列化

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  5. python基础6之迭代器&生成器、json&pickle数据序列化

    内容概要: 一.生成器 二.迭代器 三.json&pickle数据序列化 一.生成器generator 在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[0,2,4,6,8,10 ...

  6. Day4 装饰器——迭代器——生成器

    一 装饰器 1.1 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多 ...

  7. 7th,Python基础4——迭代器、生成器、装饰器、Json&pickle数据序列化、软件目录结构规范

    1.列表生成式,迭代器&生成器 要求把列表[0,1,2,3,4,5,6,7,8,9]里面的每个值都加1,如何实现? 匿名函数实现: a = map(lambda x:x+1, a) for i ...

  8. day4装饰器-迭代器&&生成器

    一.装饰器 定义:本质是函数,(装饰其他函数)就是为其它函数添加附加功能 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 实现装饰器知识储备: 1.函数及“变量” 2.高阶 ...

  9. python装饰器,迭代器,生成器,协程

    python装饰器[1] 首先先明白以下两点 #嵌套函数 def out1(): def inner1(): print(1234) inner1()#当没有加入inner时out()不会打印输出12 ...

随机推荐

  1. Eucalyptus——EC2的开源实现(转载)

    Eucalyptus[22]是加利福尼亚大学的 Daniel Nurmi 等人实现的,是一个用于实现云计算的开源软件基础设施.Eucalyptus 是 Amazon EC2 的一个开源实现,它与 EC ...

  2. jenkins只能同时构建2个Job怎么办?

    在jenkins 构建任务时,同时只能构建2个,如果两个没有job没有结束,构建第3个就会不执行: 提示: pending—Waiting for next available executor on ...

  3. 查询日志logcat使用总结

    cmd命令行中使用adb logcat命令查看Android系统和应用的log,dos窗口按ctrl+c中断输出log记录.logcat日志中的优先级/tag标记: android输出的每一条日志都有 ...

  4. SPOJ BALNUM Balanced Numbers 平衡数(数位DP,状压)

    题意: 平衡树定义为“一个整数的某个数位若是奇数,则该奇数必定出现偶数次:偶数位则必须出现奇数次”,比如 222,数位为偶数2,共出现3次,是奇数次,所以合法.给一个区间[L,R],问有多少个平衡数? ...

  5. oracle的clob转换varchar2

    time: 2008/02/29 author: skate oracle的clob转换varchar2 今天在做一个表的数据转移的时候,发现要他通过比较clob字段,但大家都知道clob字段是无法比 ...

  6. UVA 1616 Caravan Robbers 商队抢劫者(二分)

    x越大越难满足条件,二分,每次贪心的选区间判断是否合法.此题精度要求很高需要用long double,结果要输出分数,那么就枚举一下分母,然后求出分子,在判断一下和原来的数的误差. #include& ...

  7. Android(java)学习笔记109:Java中输入和输出流概念

     程序在内存中运行,文件在磁盘上,把文件从磁盘上读入内存中来,当然是输入流了,   反之,把内存中的数据写到磁盘上的文件里面去就是输出.通常都是这样的,用了过滤流的情况复杂一些,则另当别论.

  8. Ubuntu18.04如何从英文界面更改为中文界面

    本文介绍如何将Ubuntu18.04安装后的英文界面,更改为中文界面,即系统语言由英文改为简体中文.注意,与安装中文输入法不同,两者也没有冲突. 首先进入设置(Setting),选择区域和语言(Reg ...

  9. hbuilder 夜神模拟器调试方法

    1.首先下载好夜神模拟器2.查找已经安装的夜神模拟的端口,这里说一下夜神模拟器默认端口是62001,但是有些版本可能不是这个端口,怎么查找到底是哪个端口呢?按照如下顺序进行就可以查找到你按装的夜神模拟 ...

  10. C++ string头文件

    转载自https://blog.csdn.net/superna666/article/details/52809007/ 作者 zhenzhenjiajia888 标准c++中string类函数介绍 ...