本课主题

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

生成器介紹和操作实战

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

  1. # range( )
  2. >>> li = range(10)
  3. >>> li
  4. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  5. >>> type(li)
  6. <type 'list'>
  7.  
  8. # xrange( )
  9. >>> li2 = xrange(10)
  10. >>> li2
  11. xrange(10)
  12. >>> type(li2)
  13. <type 'xrange'>

Python2.7里range( ) 和 xrange( )

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

  1. >>> def func():
  2. ... print("start")
  3. ... yield 1
  4. ... yield 2
  5. ... yield 3
  6.  
  7. >>> ret = func()
  8. >>> print(ret, type(ret))
  9. (<generator object func at 0x100708b40>, <type 'generator'>)
  10.  
  11. >>> for i in ret:
  12. ... print(i)
  13.  
  14. start
  15. 1
  16. 2
  17. 3

生成器基本概念

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

  1. def func():
  2. print(111)
  3. yield 1
  4. print(222)
  5. yield 2
  6. print(333)
  7. yield 3
  8.  
  9. ret = func()
  10. r = ret.__next__() #进入函数找到 yield,并获取yield后面的数据
  11. print("r:",r)
  12. r1 = ret.__next__() #进入函数找到 yield,并获取yield后面的数据
  13. 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) #
  12.  
  13. ret = r.__next__()
  14. print(ret) #
  15.  
  16. ret = r.__next__()
  17. print(ret) #
  18.  
  19. ret = r.__next__()
  20. print(ret) #

生成器

迭代器介紹和操作实战

当你用生成器生成一个东西之后,它返回的是具有生成指定条件数据成员的一个对象,这个对象是一个可迭代的对象,然后你可以调用循还或者是__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. #/Users/jcchoiling/PycharmProjects/s13/day5
  6. #/Users/jcchoiling/PycharmProjects/s13
  7. #/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python35.zip
  8. #/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5
  9. #/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin
  10. #/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 基本数据类型转化成字符串形式

  1. >>> import json
  2. >>> dic = {"k1":"v1"}
  3. >>> print(dic, type(dict))
  4. {'k1': 'v1'} <class 'type'>
  5.  
  6. >>> ret = json.dumps(dic) #把 Json 转换成字典
  7. >>> print(ret, type(ret))
  8. {"k1": "v1"} <class 'str'>

序例化

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

  1. >>> s1 = '{"k1":"v1"}'
  2. >>> dic = json.loads(s1)
  3. >>> print(s1, type(s1))
  4. {"k1":"v1"} <class 'str'>
  5.  
  6. >>> print(dic, type(dic))
  7. {'k1': 'v1'} <class 'dict'>

反序列化

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

  1. >>> import json
  2. >>> r = json.dumps([11,22,33]) # 把基本数据类型转换成字符串(序例化)
  3. >>> print(r, type(r))
  4. [11, 22, 33] <class 'str'>
  5.  
  6. >>> li = '["alex","eric"]'
  7. >>> ret = json.loads(li) # 把字符串转换成列表(反序例化)
  8. >>> print(ret,type(ret))
  9. ['alex', 'eric'] <class 'list'>

综合例子

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

  1. import json
  2. li = [11,22,33]
  3. json.dump(li,open("db","w")) #第一步:先序例代, 第二步:把序例代後的結果寫列文件裡e.g. db
  4.  
  5. li = json.load(open("db","r"))
  6. print(li,type(li))
  7. #[11, 22, 33] <class 'list'>

dump和load的操作

Pickle

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

  1. >>> import pickle
  2. >>> li = [11,22,33]
  3. >>> r=pickle.dumps(li)
  4. >>> print(r)
  5. b'\x80\x03]q\x00(K\x0bK\x16K!e.'
  6.  
  7. >>> ret = pickle.loads(r)
  8. >>> print(ret)
  9. [11, 22, 33]

pickle的dumps和loads操作

  1. >>> import pickle
  2. >>> li = [11,22,33]
  3. >>> r=pickle.dump(li,open("db","wb"))
  4.  
  5. >>> ret = pickle.load(open("db","rb"))
  6. >>> print(ret)
  7. [11, 22, 33]

pickle的dump和load操作

Json 和 Pickle 的对比:

  1. Json 更适合跨平台/语言的操作
  2. Pickle 适合复杂类型的操作
    1. import pickle
    2.  
    3. class Foo():
    4. def __init__(self):
    5. pass
    6.  
    7. f = Foo()
    8. p = pickle.dumps(f)

    pickle dumps 一个对象

实战例子

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

  1. import requests
  2. import json
  3.  
  4. #获取天气数据API
  5. #通过 http request 取天气的数据
  6. response = requests.get("http://wthrcdn.etouch.cn/weather_mini?city=上海")
  7. response.encoding = 'utf-8'
  8. print("Before", type(response)) #把它变成字符串
  9.  
  10. #然后进行反序列化,把字符串转换成 Python 的数据类型:字典
  11. ret = json.loads(response.text)
  12. print("After", type(ret)) #把它由字符串变成字典
  13. print(ret)
  14.  
  15. #Before <class 'requests.models.Response'>
  16. #After <class 'dict'>
  17.  
  18. #{'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

字符串格式化的应用

[更新中...]

创建虚拟环境实战

创建虚拟环境是有很多好处的,它可以对不同project 中的模块进行版本控制

  1. 首先是安装虚拟环境

    1. pip install virtualenv
  2. 进行project的目录中
    1. cd my_project_folder
  3. 初始化虚拟环境,venv 是虚拟环境的名称
    1. virtualenv venv
  4. 要开始使用虚拟环境,其需要被激活
    1. source venv/bin/activate
  5. 为了保持你的环境的一致性,“冷冻住(freeze)”环境包当前的状态是个好主意
    1. pip freeze > requirements.txt

Project Respository Structure

  1. Viuflix/
  2. |----README.txt
  3. |----Doc/
  4. | |----documentation.txt
  5. |----viuflix/
  6. | |----__init__.py
  7. | |----foo.py
  8. | |----bar.py
  9. | |----utils/
  10. | | |----__init__.py
  11. | | |----spam.py
  12. | | |----grok.py
  13. |----examples/
  14. | |----helloviuflix.py
  15. |----tests/
  16. | |----test_viuflix.py
  17. |----setup.py
  18. |----MANIFEST.in
  19. |----requirement.txt

Viuflix project

本周作业

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 
 
#实现购物商城,卖东西加入购物车,调用信用卡接口结账
 
# 记录每月日常流水
 
 
#支持账户间转账
 
 
#接供管理接口,包括添加账户,用户额度,冻结账户等
 
 
 

第五章:Python基础の生成器、迭代器、序列化和虚拟环境的应用的更多相关文章

  1. 0004-20180422-自动化第五章-python基础学习笔记

    内容回顾:1.数据类型 2.for和while循环 continue break #如下循环将怎么打印结果? for i in range(1,10): print(i) for i in range ...

  2. python基础 生成器 迭代器

    列表生成式: a=[1,2,3] print a b=[i*2 for i in range(10)] #i循环10次,每一个i的值乘2就是列表中的值.列表生成式 print b >>[1 ...

  3. (转)python基础之迭代器协议和生成器(一)

    一 递归和迭代 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...

  4. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

  5. [Python笔记][第一章Python基础]

    2016/1/27学习内容 第一章 Python基础 Python内置函数 见Python内置函数.md del命令 显式删除操作,列表中也可以使用. 基本输入输出 input() 读入进来永远是字符 ...

  6. 五、Python基础(2)

    五,Python基础(2) 1.数据类型基础 (一)什么是数据类型? 用于区分变量值的不同类型. (二)为何对数据分类? 针对不同状态就应该用不同类型的数据去标识. (三)数据类型分类 1.数字类型 ...

  7. Python基础之迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

  8. python基础之迭代器协议和生成器

    迭代器和生成器补充:http://www.cnblogs.com/luchuangao/p/6847081.html 一 递归和迭代 略 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个ne ...

  9. python基础8 -----迭代器和生成器

    迭代器和生成器 一.迭代器 1.迭代器协议指的是对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2. ...

随机推荐

  1. MySQL-Select语句高级应用

    1.1 SELECT高级应用 1.1.1 前期准备工作 本次测试使用的是world数据库,由mysql官方提供下载地址: https://dev.mysql.com/doc/index-other.h ...

  2. 【zabbix系列】安装与加入host

    測试环境 Ubuntu 14.04.1 LTS [服务端安装] 关于安装官方提供了非常具体的安装方法,包含各平台的源代码及包安装.关于其它版本号Linux请參考 https://www.zabbix. ...

  3. xml解析(4)

    本节要点: DOM解析方式 SAX解析方式 DOM4J对XML的解析 XML用于将数据组织起来,形成文档用于存储和传输: 更多时候我们需要的是将xml中的数据解析出来,甚至是在程序中动态生成xml. ...

  4. string.prototype.replace 和正则表达式

    字符串的replace方法是操作字符串的常用方法之一,但这个方法只有当与正则合并使用时,才能体现出它的强大之处. 语法:str.replace(regexp|substr, newsubStr|fun ...

  5. gulp提高微信小程序开发效率

      最近公司要求把一套公众号项目的页面迁移到小程序,也就意味着要重新敲一份代码,不能更繁琐了,为了节省时间,提高迁移效率,就决定自己动手用gulp搭一个简易的小程序框架,再记录一下搭建过程.希望有大神 ...

  6. java注解细节

    现在很多框架都使用注解了,典型的像Spring里面就可以看到大量的注解,比如@Service,@Controller这一类的都是注解.注解Annotation是java一项很重要的功能.下面就来整理一 ...

  7. 爬取豆瓣电影储存到数据库MONGDB中以及反反爬虫

    1.代码如下: doubanmoive.py # -*- coding: utf-8 -*- import scrapy from douban.items import DoubanItem cla ...

  8. Intellij IDEA设置运行时Java参数

    1.选中类,点击顶部菜单:Run-->Edit Configuration,如下所示: 2.选择Application,指定的类,在右边选择Configuration,并在VM options中 ...

  9. 下篇: php 微商城 基于Thinkphp3.2框架开发

    (12)微信商城 ① 前台模板引入 a.引入微信商城模板的css+js+Images+img+bootstrap b.引入微商城的首页index.html及详情页detail.html页面模板 注意: ...

  10. Function:光标位置插入文本并且光标移动到最后

    //光标位置插入文本 function insertText(obj, str) { if(document.selection) { var sel = document.selection.cre ...