本课主题

  • 生成器介紹和操作实战
  • 迭代器介紹和操作实战
  • 序例化和反序例化
  • 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__( )例子

動手自己寫一個生成器

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

 def myrange(args):
start = 0
while True:
if start > args:
return
yield start
start += 1 r = myrange(3)
ret = r.__next__()
print(ret) # ret = r.__next__()
print(ret) # ret = r.__next__()
print(ret) # ret = r.__next__()
print(ret) #

生成器

迭代器介紹和操作实战

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

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

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

 import lib.common
lib.common .f1()

Module

 import sys
for file in sys.path:
print(file) #/Users/jcchoiling/PycharmProjects/s13/day5
#/Users/jcchoiling/PycharmProjects/s13
#/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python35.zip
#/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5
#/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin
#/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

字符串格式化的应用

[更新中...]

创建虚拟环境实战

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

  1. 首先是安装虚拟环境

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

Project Respository Structure

Viuflix/
|----README.txt
|----Doc/
| |----documentation.txt
|----viuflix/
| |----__init__.py
| |----foo.py
| |----bar.py
| |----utils/
| | |----__init__.py
| | |----spam.py
| | |----grok.py
|----examples/
| |----helloviuflix.py
|----tests/
| |----test_viuflix.py
|----setup.py
|----MANIFEST.in
|----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. iscroll使用之页面卡顿问题

    最近在开发项目时,遇到一个问题,使用iscroll实现的页面滚动,测试时发现在chrome浏览器中的模拟移动设备页面不能平滑滚动,有卡顿现象,在android手机端也有同样的问题. 在github上搜 ...

  2. 》》3D轮播

    * { margin: 0; padding: 0; } .slide { position: absolute; top: calc(50% - 150px); left: calc(50% - 3 ...

  3. 》》stroll--各种特效下拉菜单

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  4. 局域网使用的IP地址范围

    局域网可用的IP地址范围为: A类地址:10.0.0.0 - 10.255.255.255  B类地址:172.16.0.0 - 172.31.255.255 C类地址:192.168.0.0 -19 ...

  5. jsp内置对象 的使用范围和类型【说明】

    jsp内置对象 jsp内置对象有以下9种,我们会在后面的章节中分别介绍他们.这9种对象例如以下: 名称 类型 使用范围 request javax.servlet.http.HttpServletRe ...

  6. LintCode-丑数

    设计一个算法.找出仅仅含素因子3,5,7 的第 k 大的数. 符合条件的数如:3.5.7,9,15...... 您在真实的面试中是否遇到过这个题? Yes 例子 假设k=4, 返回 9 挑战 要求时间 ...

  7. 谈谈单元測试之(二):測试工具 JUnit 3

    前言 上一篇文章<为什么要进行烦人的单元測试?>讨论了一下现阶段软件开发中,程序猿们測试情况的现状.这篇文章中,我打算介绍一下单元測试的工具(插件).而且推荐大家以后在开发中,真正的用上单 ...

  8. ajax初探--实现简单实时验证

    学习技术最好的方式就是在做中学,做一个小demo来对前端输入进行实时验证. 利用ajax技术和Sevlet技术来实现,使用原生的js. 源码可访问,我的Github 什么是ajax Ajax 即&qu ...

  9. 003Java语言环境搭建

    JRE,JDK JRE(Java Runtime Environment java运行环境):包括java虚拟机和java程序所需要的核心类库, 如果要运行一个开发好的java程序,计算机中只需要安装 ...

  10. Ajax 学习总结

    Ajax 技术在 JavaWeb 应用中随处可见,比如购物车中根据商品数量及时更新等应用,那么我们今天就来说说 Ajax 的一些小应用! Ajax 技术也就是允许浏览器与服务器通信而无需刷新当前页面, ...