第五章:Python基础の何為生成器、迭代器和序列化

本課主題

  • 生成器介紹和操作实战
  • 迭代器介紹和操作实战
  • 序例化和反序例化
  • Json 和 Pickle 操作实战
  • 字符串格式化的应用
  • 本周作业

生成器介紹和操作实战

什么是生成器,生成器是一个对象,它具有生成指定条件数据成力的一个对象,它不会生成,当只有循还它的时候才会生成,在Python2.7 有一个range( ) 和xrange ( ) 函数,它们是负责生成数据的,range( ) 会直接在內存中生成一个有数据的列表,然后xrange( ) 会生成一个对象,当你循还它的时候才会生成数据,它会有垃圾回收机制把没用的数据回收。

# range( )
>>> li = range(10)
>>> li
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> type(li)
<type ‘list‘>

# xrange( )
>>> li2 = xrange(10)
>>> li2
xrange(10)
>>> type(li2)
<type ‘xrange‘>

Python2.7里range( ) 和 xrange( )

对于生产来说是使用函数把它创造的,只有函数里存在一个关键事: "yield" 它便叫做生成器。但执行以下程序时,其实什么都没有打印出来,因为生成器返回的是一个对象,你需要循还它的时候才会生成数据。它第一次循还的時候,会找第一个 yield 后面的值然后就停下来,第二次循还会再次找下一个 yield 后面的值,然后打印出来,直到没无再找到 yield就会终止。

>>> def func():
...     print("start")
...     yield 1
...     yield 2
...     yield 3

>>> ret = func()
>>> print(ret, type(ret))
(<generator object func at 0x100708b40>, <type ‘generator‘>)

>>> for i in ret:
...     print(i)

start
1
2
3

生成器基本概念

现在可以结果 __next__( )函数来调用生成器,__next__( ) 的功能进入函数然后找到 yield,只有找到 yield 便退出,并且获取yield后面的数据,直到找不到 yield,如果没有 yield 但是你还调用 __next__( )的话便会报错!! 也可以说是保存上一次执行的位置 (默认是 Yield 后面的数据位置),当下一次再执行的时候,会在当前那个位置继续往下走。

def func():
    print(111)
    yield 1
    print(222)
    yield 2
    print(333)
    yield 3

ret = func()
r = ret.__next__() #进入函数找到 yield,并获取yield后面的数据
print("r:",r)
r1 = ret.__next__() #进入函数找到 yield,并获取yield后面的数据
print("r1:",r)

生成器結合__next__( )例子

動手自己寫一個生成器

具有生产能力的叫生成器,具有获取能力的叫迭代器,迭代器每一次迭代目的是取一個值

 1 def myrange(args):
 2     start = 0
 3     while True:
 4         if start > args:
 5             return
 6         yield start
 7         start += 1
 8
 9 r = myrange(3)
10 ret = r.__next__()
11 print(ret) #0
12
13 ret = r.__next__()
14 print(ret) #1
15
16 ret = r.__next__()
17 print(ret) #2
18
19 ret = r.__next__()
20 print(ret) #3

生成器

迭代器介紹和操作实战

当你用生成器生成一个东西之后,它返回的是具有生成指定条件数据成力的一个对象,这个对象是一个可迭代的对象,然后你可以调用循还或者是__next__( )函数来获取这个对象里的值。

总结:生成器负责生成,返回的可迭代的对象叫迭代器!!!!

** Python 的 For = 其他語言的 Foreach

1 import lib.common
2 lib.common .f1()

Module

 1 import sys
 2 for file in sys.path:
 3     print(file)
 4
 5
 6 #/Users/jcchoiling/PycharmProjects/s13/day5
 7 #/Users/jcchoiling/PycharmProjects/s13
 8 #/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python35.zip
 9 #/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5
10 #/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin
11 #/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload

Module:sys

序例化与反序例化

Json

字符串 <--> Python 的基本数据类型之间的转换

序列化 - dumps( ): 把 Python 的字典变成字符串,将 Python 基本数据类型转化成字符串形式

>>> import json
>>> dic = {"k1":"v1"}
>>> print(dic, type(dict))
{‘k1‘: ‘v1‘} <class ‘type‘>

>>> ret = json.dumps(dic) #把 Json 转换成字典
>>> print(ret, type(ret))
{"k1": "v1"} <class ‘str‘>

序例化

反序列化 - loads( ):把字符串转化成 Python 基本的数据类型

>>> s1 = ‘{"k1":"v1"}‘
>>> dic = json.loads(s1)
>>> print(s1, type(s1))
{"k1":"v1"} <class ‘str‘>

>>> print(dic, type(dic))
{‘k1‘: ‘v1‘} <class ‘dict‘>

反序列化

不同语言之间对引号的定义都不同,有些时单引号代表字符,双引号则代表字符串,在进行序例化的时候,外面的括号必顺是单引号,里面的内容必顺是双引号,因为Json是一种可以跨平台进行信息传递的一种格式,这是确保能够在不同语言中Json 都能够进行序例化和反序例化。

>>> import json
>>> r = json.dumps([11,22,33]) # 把基本数据类型转换成字符串(序例化)
>>> print(r, type(r))
[11, 22, 33] <class ‘str‘>

>>> li = ‘["alex","eric"]‘
>>> ret = json.loads(li) # 把字符串转换成列表(反序例化)
>>> print(ret,type(ret))
[‘alex‘, ‘eric‘] <class ‘list‘>

综合例子

对于dumps( ) 和 loads( ) 的操作是发生在内存里,但 Json 也有一个叫 dump( )load( ) 的函数,它们主要比前面的两个函数多了一个步骤,如果是dump( )的话,它会先进行序例化(基本类型--> 字符串),然后把结果写到另外一个文件里。如果是 load( )的话,它会先把结果写进文件然后从文件里获取信息,然后进行反序例化(字符串 --> 基本类型)。

import json
li = [11,22,33]
json.dump(li,open("db","w")) #第一步:先序例代, 第二步:把序例代後的結果寫列文件裡e.g. db

li = json.load(open("db","r"))
print(li,type(li))
#[11, 22, 33] <class ‘list‘>

dump和load的操作

Pickle

Python 的 Pickle 有特殊的序例化和反序例化功能,它也有 dumps()和 loads()的方法,Pickle 只能在 Python 語言用,序列化后返回一个 pickle 认识的字符串,它也只支持以字節的方式來操作

>>> import pickle
>>> li = [11,22,33]
>>> r=pickle.dumps(li)
>>> print(r)
b‘\x80\x03]q\x00(K\x0bK\x16K!e.‘

>>> ret = pickle.loads(r)
>>> print(ret)
[11, 22, 33]

pickle的dumps和loads操作

>>> import pickle
>>> li = [11,22,33]
>>> r=pickle.dump(li,open("db","wb"))

>>> ret = pickle.load(open("db","rb"))
>>> print(ret)
[11, 22, 33]

pickle的dump和load操作

Json 和 Pickle 的对比:

  1. Json 更适合跨平台/语言的操作
  2. Pickle 适合复杂类型的操作

    import pickle
    
    class Foo():
        def __init__(self):
            pass
    
    f = Foo()
    p = pickle.dumps(f)

    pickle dumps 一个对象

实战例子

一般来说信息之间通信是通过发送Http-request 来获取的,我给你请求你给我字符串、它们会返回一个Json形式的字符串,然后你要通过反序例化把它转换成 Python 的字典来进行下一步的操作,调用 request.get( )时会把你需要的信息,比如说请求状态、Cookie、Header, etc. 都封装到response对象里(e.g. response = request.get("http//...."),然后调用 response.text( ) 來获取这次请求返回的内容。

import requests
import json

#获取天气数据API
#通过 http request 取天气的数据
response = requests.get("http://wthrcdn.etouch.cn/weather_mini?city=上海")
response.encoding = ‘utf-8‘
print("Before", type(response)) #把它变成字符串

#然后进行反序列化,把字符串转换成 Python 的数据类型:字典
ret = json.loads(response.text)
print("After", type(ret)) #把它由字符串变成字典
print(ret)

#Before <class ‘requests.models.Response‘>
#After <class ‘dict‘>

#{‘status‘: 1000, ‘data‘: {‘city‘: ‘上海‘, ‘yesterday‘: {‘date‘: ‘2日星期五‘, ‘type‘: ‘晴‘, ‘fl‘: ‘微风‘, ‘low‘: ‘低温 25℃‘, ‘high‘: ‘高温 34℃‘, ‘fx‘: ‘西风‘}, ‘forecast‘: [{‘date‘: ‘3日星期六‘, ‘type‘: ‘晴‘, ‘low‘: ‘低温 25℃‘, ‘high‘: ‘高温 35℃‘, ‘fengli‘: ‘微风级‘, ‘fengxiang‘: ‘东北风‘}, {‘date‘: ‘4日星期天‘, ‘type‘: ‘多云‘, ‘low‘: ‘低温 25℃‘, ‘high‘: ‘高温 33℃‘, ‘fengli‘: ‘微风级‘, ‘fengxiang‘: ‘东北风‘}, {‘date‘: ‘5日星期一‘, ‘type‘: ‘阴‘, ‘low‘: ‘低温 24℃‘, ‘high‘: ‘高温 32℃‘, ‘fengli‘: ‘微风级‘, ‘fengxiang‘: ‘东北风‘}, {‘date‘: ‘6日星期二‘, ‘type‘: ‘阴‘, ‘low‘: ‘低温 24℃‘, ‘high‘: ‘高温 29℃‘, ‘fengli‘: ‘微风级‘, ‘fengxiang‘: ‘东北风‘}, {‘date‘: ‘7日星期三‘, ‘type‘: ‘阵雨‘, ‘low‘: ‘低温 23℃‘, ‘high‘: ‘高温 29℃‘, ‘fengli‘: ‘微风级‘, ‘fengxiang‘: ‘东北风‘}], ‘ganmao‘: ‘各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。‘, ‘aqi‘: ‘115‘, ‘wendu‘: ‘31‘}, ‘desc‘: ‘OK‘}

获取天气数据API

字符串格式化的应用

[更新中]

本周作业

ATM 作業

模疑实现一个 ATM + 购物商城程序

  1. 额度15000 或自定义
  2. 实现购物商城,卖东西加入购物车,调用信用卡接口结账
  3. 可以提现,手续费 5%
  4. 每月 22号出粮,每月10号为还款日、过期未还,按欠款总额 5% 每日利息
  5. 支持多账户登录
  6. 支持账户间转账
  7. 记录每月日常流水
  8. 提供还款接口
  9. ATM记录操作日志
  10. 接供管理接口,包括添加账户,用户额度,冻结账户等

bin 執行文件

atm.py start 每口程序不超過10行

shopping.py

modules/core

conf 配置文件

user_db

log format

log 日誌

db

时间: 2024-11-07 18:33:11

第五章:Python基础の何為生成器、迭代器和序列化的相关文章

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

一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了.所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间.在Python中,这种一边循环一边计算的机制,称为生成器:generator. 要创建一个generator,有很多种

萌新向Python数据分析及数据挖掘 第一章 Python基础 (上)未排版

因word和博客编辑器格式不能完全对接,正在重新排版,2019年1月1日发出第一章完整版 本文将参考<Python编程 从入门到实践>的讲述顺序和例子,加上自己的理解,让大家快速了解Python的基础用法,并将拓展内容的链接添加在相关内容之后,方便大家阅读. 好了!我们开始第一章的学习. 第一章 Python基础 python安装以及环境搭建 python的安装和环境变量的配置通过百度查询即可解决,这里不作赘述. IDE的选择:因为后期需要用来做数据分析,所以直接安装Anaconda会是一个不

萌新向Python数据分析及数据挖掘 第一章 Python基础 第一节 python安装以及环境搭建 第二节 变量和简单的数据类型

本文将参考<Python编程 从入门到实践>的讲述顺序和例子,加上自己的理解,让大家快速了解Python的基础用法,并将拓展内容的链接添加在相关内容之后,方便大家阅读. 好了!我们开始第一章的学习. 第一章 Python基础 第一节 Python安装以及环境搭建 Python的安装和环境变量的配置通过百度查询即可解决,这里不作赘述. IDE的选择:因为后期需要用来做数据分析,所以直接安装Anaconda会是一个不错的选择. Anaconda详细安装使用教程 https://blog.csdn.

萌新向Python数据分析及数据挖掘 第一章 Python基础 第八节 函数

第一章 Python基础 第八节 函数 定义函数 函数 其实就可以理解为外挂,把一些常用的.重复率比较多你又不想重复写的东西写进函数,加上开关实现简化操作 举个简单的例子 1 def greet_user(username): 2 #定义一个叫做"迎接用户"的外挂,让他能直接打印一个问候语,括号里面是函数需要输入的东西,也就是个性化的东西 3 """先是简单的问候语""" 4 print("Hello! "

萌新向Python数据分析及数据挖掘 第一章 Python基础 第九节 类

第一章 Python基础 第九节 类 面向对象编程时,都会遇到一个概念,类,python也有这个概念,下面我们通过代码来深入了解下. 其实类 和函数都是为了节省代码,有了类的的概念,就可以把相同的代码写在父类,子类继承后就可以直接使用,而且通过选择对应的父类就可以直接使用对应父类的内容. 创建和使用类 1 class Dog(): #认识狗这类东西 2 def __init__(self, name, age): #狗是肯定有名字和年龄的,是个狗就有,要用户填写 3 self.name = na

萌新向Python数据分析及数据挖掘 第一章 Python基础 第十节 文件和异常

第一章 Python基础 第十节 文件和异常 从文件中读取数据 读取文件.文件路径   1 filename = 'pi_digits.txt' #文件名取个代号 2 #读取整个文件 3 with open(filename) as file_object: 4 contents = file_object.read()# 给内容取个代号 5 print(contents.rstrip()) 6 #逐行读取 7 with open(filename) as file_object: 8 for

学习笔记 第十五章 JavaScript基础

第15章   JavaScript基础 [学习重点] 了解JavaScript基础知识 熟悉常量和变量 能够使用表达式和运算符 正确使用语句 能够掌握数据类型和转换的基本方法 正确使用函数.对象.数组等核心知识和技法 能够编写简单的脚本,解决网页中常见特效和互动效果 15.1  JavaScript入门 JavaScript是一种轻量级.解释型的Web开发语言.现代浏览器都已嵌入了JavaScript引擎./sc 15.1.1 在网页中插入JavaScript代码 使用<script>标签,可

python基础之三大器中迭代器和生成器

迭代器 迭代对象: 在python中,但凡内部含有iter方法的对象,都是可迭代对象. **迭代器: 在python中,内部含有__Iter__方法并且含有__next__方法的对象就是迭代器.** 可迭代对象 str list set dic python中规定,只要具有__ iter__()方法就是可迭代对象 str.__iter__()# list.__iter__()# tuple.__iter__()# dict.__iter__()# set.__iter__() 将可迭代对象转换成

第二章 python基础(二)

第九节 函数 函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字. 可以通过函数名在程序的不同地方多次执行(这通常叫做函数调用),却不需要在所有地方都重复编写这些语句. 自定义函数 用户自己编写的 预定义的Python函数 系统自带的一些函数,还有一些和第三方编写的函数,如其他程序员编写的一些函数,对于这些现成的函数用户可以直接拿来使用. 为什么使用函数 降低编程的难度 通常将一个复杂的大问题分解成一系列更简单的小问题,然后将小问题继续划分成更小的问题,当问题细化