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

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

1、 列表生成器:代码例子

1 a=[i*2 for i in range(10)]
2 print(a)
3 
4 运行效果如下:
5 D:\python35\python.exe D:/python培训/s14/day4/列表生成式.py
6 [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
7 
8 Process finished with exit code 0

2、高阶函数

变量可以指向函数,函数的参数能接受变量,即把一个函数名当做实参传给另外一个函数 

返回值中包涵函数名 

代码例子:

 1 def test():
 2     print("int the test")
 3 
 4 def test2(func):
 5     print("in the test2")
 6     print(func)
 7     func()
 8 
 9 test2(test)
10 运行效果如下:
11 D:\python35\python.exe D:/python培训/s14/day4/高阶函数.py
12 in the test2
13 <function test at 0x000000000110E268>  #这里是test的内存地址
14 int the test
15 
16 Process finished with exit code 0

3、装饰器

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

装饰器原则:

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

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

 

实现装饰器的知识储备:

a、函数即“变量”

b、高阶函数

c、嵌套函数

高阶函数+嵌套函数=====装饰器

高阶函数:

a.把一个函数名当做实参传给另外一个函数

b.返回值中包含函数名

 

 

 

代码例子

 1 import  time
 2 def timeer(func):
 3     def warpper():
 4         start_time=time.time()
 5         func()
 6         stop_time=time.time()
 7         print("the fun runn time is %s" %(stop_time-start_time))
 8     return warpper
 9 @timeer
10 def test1():
11     time.sleep(3)
12     print("in the test1")
13 
14 test1()
15 运行结果如下:
16 D:\python35\python.exe D:/python培训/s14/day4/装饰器.py
17 in the test1
18 the fun runn time is 3.000171661376953
19 
20 Process finished with exit code 0

带参数的装饰器

 1 import time
 2 
 3 def timer(func):
 4     def deco(*args,**kwargs):
 5         start_time=time.time()
 6         func(*args,**kwargs)
 7         stop_time=time.time()
 8         print("the func runn time is %s" %(stop_time-start_time))
 9     return deco
10 
11 @timer  #test1 = timer(test1)
12 def test1():
13     time.sleep(3)
14     print("in the test1")
15 
16 @timer
17 
18 def test2(name,age):
19     print("name:%s,age:%s" %(name,age))
20 
21 test1()
22 test2("zhaofan",23)
23 运行结果如下:
24 
25 D:\python35\python.exe D:/python培训/s14/day4/装饰器3.py
26 in the test1
27 the func runn time is 3.000171661376953
28 name:zhaofan,age:23
29 the func runn time is 0.0
30 
31 Process finished with exit code 0

终极版的装饰器

 1 import time
 2 user,passwd = "zhaofan","123"
 3 def auth(auth_type):
 4     print("auth func:",auth_type)
 5     def outer_wrapper(func):
 6         def wrapper(*args,**kwargs):
 7             if auth_type=="local":
 8                 username = input("Username:").strip()
 9                 password = input("Password:").strip()
10                 if user == username and passwd== password:
11                     print("\033[32;1mUser has passed authentication\033[0m")
12                     res = func(*args,**kwargs)
13                     print("------after authentication")
14                     return res
15                 else:
16                     exit("\033[31;1mInvalid username or password\033[0m")
17             elif auth_type=="ldap":
18                 print("没有ldap")
19         return wrapper
20     return outer_wrapper
21 
22 def index():
23     print("welcome to index page")
24 @auth(auth_type="local")
25 def home():
26     print("welcome to home page")
27     return "from home"
28 @auth(auth_type="ldap")
29 def bbs():
30     print("welcome to bbs page")
31 
32 index()
33 print(home())
34 bbs()
35 
36 
37 运行结果如下:
38 D:\python35\python.exe D:/python培训/s14/day4/装饰器4.py
39 auth func: local
40 auth func: ldap
41 welcome to index page
42 Username:zhaofan
43 Password:123
44 User has passed authentication
45 welcome to home page
46 ------after authentication
47 from home
48 没有ldap
49 
50 Process finished with exit code 0

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

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

 1 a = [x for x in range(10)]
 2 print(a)
 3 
 4 g=(x for x in range(10))
 5 print(g)
 6 运行结果如下:
 7 D:\python35\python.exe D:/python培训/s14/day4/生成器.py
 8 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 9 <generator object <genexpr> at 0x0000000000B01DB0>
10 
11 Process finished with exit code 0

生成器只有一个方法:__next__()

generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

 1 g=(x for x in range(10))
 2 
 3 for i in g:
 4     print(i)
 5 
 6 
 7 运行结果如下:
 8 
 9 D:\python35\python.exe D:/python培训/s14/day4/生成器的调用.py
10 0
11 1
12 2
13 3
14 4
15 5
16 6
17 7
18 8
19 9
20 
21 Process finished with exit code 0

5、可以直接作用于for循环的数据类型有以下几种

一类是集合数据类型,如listtupledictsetstr等;

一类是generator,包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

可以使用isinstance()判断一个对象是否是Iterable对象

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

6、json和pickle

 

所有的努力都值得期许,每一份梦想都应该灌溉!
相关文章
淘宝商品详情API的调用流程(python请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult&lt;T&gt;`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码&quot;0&quot;和消息&quot;操作成功!&quot;,有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
108 0
|
1月前
|
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 &quot;&quot;,Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
60 0
|
1月前
|
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
73 0
如何在 Postman 中发送 JSON 数据
我们将深入探讨使用 Postman 发送 JSON 数据这一主题,Postman 是一款强大的 API 测试和开发工具。无论您是经验丰富的开发人员还是新手,掌握这项技能对于高效的 API 测试和开发都至关重要。
怎样用 esProc 计算来自 Restful 的多层 json 数据
esProc 是一款强大的数据处理工具,可简化 Java 处理 Restful 接口返回的复杂多层 JSON 数据的难题。通过 esProc,不仅能轻松访问和解析 Restful 数据,还能高效完成复杂计算任务,并可无缝嵌入 Java 应用中作为计算引擎使用。例如,筛选特定分类订单或计算金额,esProc 的脚本简洁直观,远优于传统 SQL 或纯 Java 实现。此外,esProc 支持安全认证(如 Cookie 和 Token)及 JDBC 集成,为开发者提供灵活高效的解决方案。
何如定义 JSON Schema 并验证该 json 数据?
本文定义了一个包含 audio 和 tags 两个必需属性的 JSON Schema,用于规范数据结构。其中,audio 是非空字符串,表示音频组件;tags 是非空数组,表示标签组件。通过示例数据和验证工具(如 ajv, NJsonSchema),可确保 JSON 数据符合 Schema 要求,从而保障数据的一致性和正确性。
63 1
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
172 4
JSON数据解析实战:从嵌套结构到结构化表格
python语言采集淘宝商品详情数据,json数据示例返回
通过淘宝开放平台的API接口,开发者可以轻松获取商品详情数据,并利用这些数据进行商品分析、价格监控、库存管理等操作。本文提供的示例代码和JSON数据解析方法,可以帮助您快速上手淘宝商品数据的采集与处理。
淘宝商品详情API接口概述与JSON数据示例
淘宝商品详情API是淘宝开放平台提供的核心接口之一,为开发者提供了获取商品深度信息的能力。以下是技术细节和示例: