本课主题

  • 生成器介紹和操作实战
  • 迭代器介紹和操作实战
  • 序例化和反序例化
  • 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. 自动化运维工具——puppet详解(二)

    一.class 类 1)什么是类? 类是puppet中命名的代码模块,常用于定义一组通用目标的资源,可在puppet全局调用: 类可以被继承,也可以包含子类: 具体定义的语法如下: class NAM ...

  2. 使用NPOI读取Excel数据到DataTable

    如今XML文件的存储格式大行其道,可是也不是适用于全部情况,非常多单位的数据交换还是使用Excel的形式.这就使得我们须要读取Excel内的数据.载入到程序中进行处理.可是如何有效率的读取,如何使程序 ...

  3. 如何做更好的Android驱动project师

        随着智能手机的飞跃发展,特别是Android智能机的爆炸性发展,Android驱动project师是越来越受欢迎的一个职位,并且是一个非常值得人期待的职位,由于可能你參与研发的一款手机就能改变 ...

  4. mac brew install nginx遇到的坑

    默认使用 brew install nginx 出现了一下的错误: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: ...

  5. 自学Python2.6-深浅拷贝

    Python 深浅拷贝 一.深浅拷贝- 数字.字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy n1=123 n2=n1 # # ...

  6. MyBatis:lazy loading

    懒加载的原理 mybatis 会循环处理结果集中返回的每行数据的,在处理之前首先会通过反射调用构造方法来创建 result 对象,结果集中的一行数据最终会映射为一个 result 对象(严格的来说是不 ...

  7. 本地代码上传到GitHub---拷贝github代码

    来这里: 转载请标明出处: http://blog.csdn.net/hanhailong726188/article/details/46738929 步骤: git init git add na ...

  8. Android项目实战(三十七):Activity管理及BaseActivity的实现

    Ps:7-10月 完成公司两个app项目上架.漏掉的总结 开始慢慢补上. 一.写一个Activity的管理类 1.单例模式,以栈(先进后出)的形式存储Activity对象 public class A ...

  9. Swift 开源项目练习应用

    小的View.动画实现练习 拥有着苹果先天生态优势的Swift自发布以来,各种优秀的开源项目便层出不穷.本文作者站在个人的角度,将2014年Swift开源项目做了一个甄别.筛选,从工具.存储.网络.界 ...

  10. iOS 通知的变化ios9-10,新功能展示

    二.新功能展示 1  使用 /iOS通知新功能玩法 2.  全面   iOS10里的通知与推送详情 一.变化 四.Notification(通知) 自从Notification被引入之后,苹果就不断的 ...