# 本课主题

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

## 生成器介紹和操作实战

# 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( )

>>> 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

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)

### 動手自己寫一個生成器

 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

## 迭代器介紹和操作实战

** 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

>>> 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'>

>>> s1 = '{"k1":"v1"}'
>>> print(s1, type(s1))
{"k1":"v1"} <class 'str'>

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

>>> 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'>

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

print(li,type(li))
#[11, 22, 33] <class 'list'>

### 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.'

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

>>> print(ret)
[11, 22, 33]

### Json 和 Pickle 的对比：

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

class Foo():
def __init__(self):
pass

f = Foo()
p = pickle.dumps(f)
pickle dumps 一个对象

### 实战例子

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 的数据类型:字典
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'}

[更新中...]

## 创建虚拟环境实战

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/
|----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 作業

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 Repository Structure

posted @ 2016-09-10 09:09 無情 阅读(...) 评论(...) 编辑 收藏