A sentence A picture A day!

跨境电商记-豌豆公主

创始人及平台介绍: 翁永彪深耕日本市场多年,曾同合伙人和雷军一起成立日本金山 豌豆公主创办于2014年,专注于日淘的跨境电商平台,目前已完成A+轮融资

三次垂直: 日本商品到国内消费者的垂直电商-只做女性-25-35岁的年龄层 产品层面:美妆、个护-食品和健康产品-家居、家庭用品(与身体、小孩直接接触的)

做日本的B端企业 小红书、菠萝蜜、考拉、豌豆公主等跨境电商都只卖2000多种SKU,而日本至少有300万种,大家都是在买一些爆品 日本大企业持不允许态度,原因如下: 已有中国子公司,无法处理关系与矛盾 法律风险 侵犯商标的风险 日文产品说明导致误用误食,如何承担对消费者的责任 与大公司目前的合作方式:下游渠道扫货,正式合作不行 (但是随着访日旅客消费行为的变化,会更加重视跨境) 目前最大的问题:拿到稳定、大量的货源 本土优先、越下游越拿不到货;今后要做的事:跟大公司一起去探讨跨境电商的政策,规避他们的担心,最好是他们自己不用出什么但中国用户相信这确实是他给我们的 目前和日本一个B2C电商合作

对于中小企业—Wonderfull品台(一站式服务) 无初期费用,无固定成本,只要产品好,有什么品牌故事 (**翁永彪观点:信息跨境才是跨境电商里面最核心的,大家不认识的产品太多,我们首先让你知道有这样的品牌,这个东西好在哪,解决什么,你才能想到有什么需要)

品牌运营 现在豌豆公主在做的事情,帮助日本中小企业做他们的品牌故事,拍视频,写文章,年代感、专注点。产品要先发到豌豆公主的中心仓,企业只需要发货其他都不用做

Python库

math库: 三角函数、开方根号、π、e为基数 random库: seed、random、uniform、randint、randrange、choice()从列表中随机返回一个元素、shuffle()将列表中元素随机打乱、sample

Python2&3差别

  在电脑上试运行GitHub上用python3.4编的一段代码【GitHub链接-github.com/xiaff/dbc-downloader】,功能是将豆瓣读书上的书与短评存成markdown或者html形式。本机使用的是python2.7,改代码过程顺便总结2与3的一些区别。

具体参照python2to3

  1. print与print()
  2. Python 2有两种字符串类型:Unicode字符串和非Unicode字符串。Python 3只有Unicode一种类型
  3. Python 2有两个全局函数可以把对象强制转换成字符串:unicode()把对象转换成Unicode字符串,还有str()把对象转换为非Unicode字符串。Python 3只有一种字符串类型,所以str()函数即可完成所有的功能。
  4. long长整型
  5. 字典类方法has_key()==>in运算符

    Notes Python2 Python3
    1 a_dictionary.has_key(‘PapayaWhip’) ‘PapayaWhip’ in a_dictionary
    2 x + a_dictionary.has_key(y) x + (y in a_dictionary)

    in的优先级大于运算符+,运算符or的优先级高于运算符in

  6. 返回列表的字典类方法

    Notes Python2 Python3
    1 a_dictionary.keys() list(a_dictionary.keys())
    2 a_dictionary.items() list(a_dictionary.items())
    3 a_dictionary.iterkeys() iter(a_dictionary.keys())
    4 [i for i in a_dictionary.iterkeys()] [i for i in a_dictionary.keys()]
    5 min(a_dictionary.keys()) 没变化
    • 使用list()函数将keys()的返回值转换为一个静态列表
    • 这是另外一种视图(关于items()方法的)到列表的转换。2to3对values()方法返回值的转换也是一样
    • Python 3里不再支持iterkeys()了。如果必要,使用iter()将keys()的返回值转换成为一个迭代器。
    • 2to3也能识别出keys()方法的返回值被立即传给另外一个会遍历整个序列的函数,所以也就没有必要先把keys()的返回值转换到一个列表。相反的,min()函数会很乐意遍历视图。这个过程对min(),max(),sum(),list(),tuple(),set(),sorted(),any()和all()同样有效
  7. 被重命名或者重新组织的模块

    http

    Notes Python2 Python3
    1 import httplib import http.client
    2 import Cookie import http.cookies
    3 import cookielib import http.cookiejar
    4 import BaseHTTPServer import http.server
    import SimpleHTTPServer
    import CGIHttpServer
    • http.client模块实现了一个底层的库,可以用来请求http资源,解析http响应。
    • http.cookies模块提供一个蟒样的(Pythonic)接口来获取通过http头部(http header)Set-Cookie发送的cookies。
    • 常用的流行的浏览器会把cookies以文件形式存放在磁盘上,http.cookiejar模块可以操作这些文件。
    • http.server模块实现了一个基本的http服务器

    urllib

    Python 2有一些用来分析,编码和获取URL的模块,但是这些模块就相互重叠。在Python 3里,这些模块被重构、组合成了一个单独的包

    Notes Python2 Python3
    1 import urllib import urllib.request, urllib.parse, urllib.error
    2 import urllib2 import urllib.request, urllib.error
    3 import urlparse import urllib.parse
    4 import robotparser import urllib.robotparser
    5 from urllib import FancyURLopener from urllib.request import FancyURLopener
    from urllib import urlencode from urllib.parse import urlencode
    6 from urllib2 import Request from urllib.request import Request
    from urllib2 import HTTPError from urllib.error import HTTPError
  8. 全局函数raw_input()和input()

    Notes Python2 Python3
    1 raw_input() input()
    2 raw_input(‘prompt’) input(‘prompt’)
    3 input() eval(input())

几点:

  • input问题:在python2中使用,若使用input函数输入时需要加双引号,否则不是str类型。input和raw_input的区别

  • utf8 编码问题: open(file,‘w’,encoding=‘utf-8’)在python2中的不可用性 解决办法是去掉encoding=‘utf-8’,在代码开头加入

    import sys

    reload(sys)

    sys.setdefaultencoding('utf8')

  • urllib2的调用使用urllib2发请求时注意R要大写,是urllib2.Request

Python味道(3)

import引入模块

使用with自动关闭资源

Python 味道[2]

利用assert语句来发现问题

assert expression1 [",",expression2]

依据expression1会返回True或者False,值为False时引发AssertionError,expression2可选,用于传递具体的异常信息

注意:

  • python不像C/C++,没有严格定义调试和发布模式。禁用断言:在运行脚本是加上-O标志
  • python本身的异常能够处理就不要再使用断言【比如数组越界、类型不匹配、除数为0】
  • 不用断言检查用户输入。较好的做法是使用条件判断,不符合输出错误提示信息
  • 在函数调用后,当需要确认返回值是否合理时可以使用断言。
  • 当条件是业务逻辑继续下去的先决条件时可以使用断言。

数据交换值时不推荐使用中间变量

在python中直接用

>>> x,y = y,x

充分利用Lazy evaluation

Lazy evaluation仅仅在真正需要执行的时候才计算表达式的值

  • 避免不必要计算。在if x and y,x为false情况下将不再计算y;if x or y,x为true不再计算y。因此对于or应将真值可能性高的变量写在前。
  • 节省空间,使无限循环成为可能。典型的使用延迟计算的例子是生成器表达式,尽在每次需要计算的时候才通过yield产生元素。

    def fib():
        a,b=0,1
        while True:
            yield a
            a,b=b,a+b
    
    print list(islice(fib(),5))
    

尽量转换为浮点类型再做除法

当涉及除法运算时尽量将操作数转换为浮点类型在做运算

>>>g=float((4*96+3*85))/float(((4+3+2)*100))

对于浮点数的处理,其计算结果可能并不是完全准确的。对于在while中使用i!=1.5更要避免,浮点数的比较最好能够指明精度

晶体eval()的安全漏洞

Python中eval()函数将字符串str当成有效的表达式来求值并返回计算结果

函数声明 eval(expression[,global[,local]])

“eval is evil”针对的是eval()的安全性,当用户输入了不安全的字符串将造成不良后果。如果使用对象不是信任源,应尽量避免使用eval,可用安全性更好的ast.literal_eval替代【木有试过:P】

使用enumerate()获取序列迭代的索引和值

list1=['a','b','c']
for i,e in enumerate(list1):
    print "index:",i,"element:",e

函数enumerate()主要为了解决在循环中获取索引以及对应值问题

enumerate(sequence,start=0)

sequence可以为序列,list、set等,函数的返回本质上是一个迭代器,可用next()方法获取下一个迭代元素

>>>e=enumerate(list1)
>>>e.next()

enumerate()函数实现

def enumerate(sequence,start=0):
    n=start
    for elem in sequence:
        yield n,elem
        n+=1

plus,要获取迭代过程中字典的key和value,应使用iteritems()方法

infodict=['name':'reindeer','age':'25']
for k,v in infodict.iteritems():
    print k,":",v

is与==的适用场景

操作符 意义
is object identity 对象是否一致 同一块内存空间
== equal 检验对象值是否相等

编码编码呀,尽可能使用Unicode

关于文件的编码问题深有感触呀~~

Python内建的字符串两种类型:str和Unicode,公共祖先basestring。

最早的ASCII编码用一个字节8bit。我国表示汉字编码GBK。 》》》Problem:不同编码系统之间存在冲突 》》》solve:为不同的文字分配同一编码

Unicode编码系统可分为编码方式和实现方式两个层次。编码方式分为UCS-2(两个字节)和UCS-4(四个字节)。实现方式简称UTF包括UTF-7、UTF-16、UTF-32、UTF-8等

Unicode编码(十六进制) UTF-8字节流(二进制)
000000~00007F 0xxxxxxx
000080~0007FF 110xxxxx 10xxxxxx
000800~00FFFF 1110xxxx 10xxxxxx 10xxxxxx
010000~10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Python处理中文字符常遇见的问题

  • 读出文件内容为乱码
  • 当Python源文件中包含中文字符时抛出SyntaxError异常【Non-ASCII charater ‘\xxx’ in……】
  • 普通字符和Unicode进行字符串连接时抛出UnicodeDecodeError异常

    #coding=utf-8
    s = "中文"+ u"Chinese"
    print s
    

    抛出异常UnicodeDecodeError:‘ascii’ codec can’t decode byte 0xd6 in position 0:ordinal not in range(128)

对应上述问题:

  • 读入的文件是用UTF-8编码形式保存的【Windows本地默认编码是CP936,被映射为GBK】,当在控制台上直接显示UTF-8时,两种编码不兼容。要解决一的问题可以使用Unicode作为中间媒介来完成转换。首先对读入的字符用UTF-8进行解码,再用GBK进行编码

    >>>fhandle = open("t.txt",'r')
    >>>print (fhandle.read().decode("utf-8")).encode("gbk"))(1)
    >>>fhandle.close()
    

    decode方法将其他编码对应的字符串解码成Unicode,encode为编码

    str.decode([编码参数[,错误处理]])
    str.encode([编码参数[,错误处理]])
    

    编码参数

    编码参数
    ‘ascii’
    ‘latin-1’ or ‘iso-8859-1’
    utf-8
    utf-16
    错误处理参数三种方式
    错误处理参数 处理方式
    strict 默认处理方式,抛出UnicodeError异常
    ignore 忽略不可转换字符
    replace 将不可转换的字符用?代替

    plus,某些情况下 (1)会出现如下异常 UnicodeDecodeError:‘gbk’ codec can’t encode charcter u’\uxxxx’ in position0:illegal multibyte sequence——某些软件在保存UTF-8编码时在文件最开始的地方插入不可见字符BOM(0xEF 0xBB 0xBF)这些不可见字符无法被正确解析—–利用codecs模块可以处理这种问题

    import codesc
    content = open("t.txt",'r').read()
    if content[:3] == codecs.BOM_UTF*
    content = content[3:]
    

    我记得貌似有直接用codecs打开文件的方式,用codecs提供的open方法来指定打开的文件的语言编码bfile = codecs.open("dddd.txt",'r',"UTF-8" )

  • 对于问题二:Pyhton中默认的编码为ASCII(sys.getdefaultencoding()),文件**.py是以ASCII形式保存的。中文字符不是ASCII,源文件中未指定其他编码方式。因此,要在源文件中进行编码声明

    #codnig=utf-8
    or
    #!/usr/bin/python
    #!-*- coding: utf-8 -*-
    or
    #!/usr/bin/python
    # vim:set fileencoding=utf-8 :
    
  • 对于问题三:+左边为中文,类型为str,右边为Unicode字符串。连接时,Python将左边的中文转为Unicode再与右边的Unicode连接,将str转为Unicode事使用系统默认的ASCII进行解码,当编码值大于128时,不能正确处理。解决办法: 1)指定str转为Unicode时的编码方式s = "中文".decode('gbk')+u"Chinese";2)将Unicode字符串进行UTF-8编码 `s = “中文”+u”Chinese”.encode(“utf-8”)

Unicode提供了不同编码系统之间字符转换的桥梁,要弄清字符所采取的编码方式以及正确的解码方法。对于中文字符,建议直接使用Unicode表式方式s = u"hao可爱的小鹿"。pyhton2.6后可通过import unicode_literals自动将定义的普通字符识别为Unicode字符串

构建合理的报层次来管理module

本质上每一个Python文件都是一个模块。但是将所有Python文件放在一个目录下并不好,需要合理组织项目的层次来管理模块—包(package) 包,类似目录,包除了常规的Python文件(模块)以外,还包含init.py文件,同时它允许嵌套,包结构如下:

Package/ __init__.py
    Modu1.py
    Modu2.py
    Subpackage/ __init__.py
        Modu1.py
        Modu2.py

包中模块通过“.”访问。例如Package.Modu1;Package.Subpackage.Modu2。 导入方法:

  • 直接导入一个包

    import Package
    
  • 导入子模块或子包

    from Package import Modu1
    or
    import Package.Modu1
    
    from Package import Subpackage
    or
    import Package.Subpackage
    
    from Package.Subpackage import Modu1
    or
    import Package.Subpackage.Modu1
    

__init__.py文件的作用—1)与普通目录的区分;2)申明模块级别的import语句从而使其变成包级别可见。

在__init__.py文件中添加from Modu1 import Test【Test为Package下Modu1中得类】可直接导入类Test。如果__init__.py文件为空,当想使用from Package import * 导入所有模块时将不能生效。

__init__.py另一个作用通过定义__all__变量,控制需要导入的子包或者模块。

在Package目录下的__init__.py文件中添加:
__all__ = ['Mode1','Modu2','Subpackage']

运行from Package import * ,__all__变量中定义的模块和包被导入当前的名字空间

包——

  • 合理组织代码

    Proj/
    |---README
        |----LICENSE
        |----setup.py
        |-----requirements.txt
        |-----sample/
        |   |----__init__.py
        |   |----core.py
        |   |----help.py
        |------docs/
        |   |------conf.py
        |   |------index.rst
        |------bin/
        |------package/
        |   |-----__init__.py
        |   |------sunpackage/
        |   |------......
        |------tests/
        |   |------test_basic.py
        |   |------test_advanced.py
    
  • 避免名称空间的冲突

ATTENTION:这里的包与后面的软件包不同,这里的仅限于包含一个或一系列Python文件,为了合理组织代码。

Python 味道[1]

先用pyhton写一段快排:

def quicksort(array):
    if len(array)<=1:
        return array
    less = [];
    greater = [];
    base = array.pop()
    for i in array:
        if i>=base:
            greater.append(i)
        else:
            less.append(i)
    return quicksort(less)+[base]+quicksort(greater)

python味道: 像伪代码像写文章;代码风格整齐;理解它的标准库;库和框架,强调团队

编写函数4原则:

  • 函数尽量短小,嵌套层次不要过深
  • 函数声明简单、易于使用。名字合理,参数不要过多
  • 函数参数设计考虑向下兼容。通过加入默认参数避免退化,做到向下版本更新兼容 def play(name,type=a.info):
  • 一个函数只做一件事,语句粒度一致性【高级抽象与细粒度的字符处理】

将常量集中到一个文件中:

在python中使用常量:

  • 命名风格,常量名全部大写
  • 自定义类实现常量功能。要符合“命名全部为大写”和“值一旦绑定不可再修改”,解决方法见下,通过命名不符合规则时和修改时抛出异常解决。

    class _const: #私有类
        class ConstError(TypeError):pass
        class ConstCaseError(ConstError):pass
    
        def _setattr__(self,name,value):#__xxx__ 系统定义名字
            if self.__dict__.has_key(name):
                raise self.ConstError,"Cannot change%s" % name
            if not name.upper():
                raise self.ConstCaseError,'const "%s" is not all uppercase' % name
    
            self.__dict__[name]=value
    
    import sys
    sys.modules[__name__]=_const()
    

上述模块命名为const.py,使用方式如下

    import const
    const.MY_CONSTANT = 1
    const.MY_SECOND_CONSTANT = 'a'

在其他模块中引用这些常量【将上面的文件命名为constant.py】

from constant import const
print const.MY_SECOND_CONSTANT

Chapter1of2014

chapters of Pictures

Today begins the chapters of daily picture

i finished a simple flag with turtle library in Python

the Path in my computer of the code: /code/python/入门经典/page166.py

使用numpy和pylab画图

import numpy

import pylab

x=numpy.arange(0,4*numpy.pi,0.1)

y1=numpy.sin(x)

y2=numpy.cos(x)

pylab.title(‘Sin and Cos’)

pylab.plot(x,y1,‘b’)

pylab.plot(x,y2,‘r’)

pylab.show()

R Is Coming

写在前面的话: 看到了书中关于Winston Chang和动物“驯鹿”的介绍,记录一下^_^。

Winston Chang是一名工程师~~重点是他拥有美国西北大学的心理学博士学位。数据+心理的搭配有点妙。

“驯鹿”学名“角鹿”,他们的视力、皮毛、茸角、嗅觉、蹄子已经全然适应了低温环境。2012年英国伦敦大学学院研究者发现,驯鹿是唯一一种能够看见紫外线的哺乳动物。人类的视觉只能看到波长400nm以上的光线,驯鹿的视觉范围则低于320nm。虽然这一范围仅仅覆盖我们基于黑光帮助下所能看见的所有光谱的一部分,但足以帮驯鹿在北极的炽白光线中看清东西。会飞的驯鹿拉着圣诞老人的雪橇。

先简单介绍一下准备工作

1、安装R

2、安装R Studio

3、加载包

1
2
install.packages("ggplot2")
install.packages("gcookbook")

下载的二进制程序包在/var/folders/_h/r8xs1s7111z5dkhm642q83lr0000gn/T//RtmpBaf4d4/downloaded_packages里 【注:若有错误信息提示下载长度不等于报告长度—–>重新多下几次即可,网络问题】

4、使用包 >library(ggplot2)

关于help ?+要查的内容

>?read.table

ls(“package:foreign”)【包中函数列表】

加载数据

data<-read.csv("datafile.csv",header=FALSE,sep='\t',stringAsFactor=FALSE)【数据无首行列名】

name(data)<-c("Col1","Col1","Col3")重命名列 data$age<-factor(data$age)有些列需要被处理为因子格式

[install.packages(“xlsx”);library(xlsx)] data<-read.xlsx("file.xlsx",sheetIndex=2orsheetName="Score")

[install.package(“foreign”);library(foreign)] read.spss()、read.octave()、read.systat()、read.xport()…

绘图

  1. 折线图
    • plot(pressure$temperature, pressure$pressure, type=“l”)

      points(pressure$temperature, pressure$pressure, col=“red”)

    • qplot(temperature, pressure, data=pressure, geom=c(“line”, “point”)
    • ggplot(pressure, aes(x=temperature, y=pressure)) + geom_line() + geom_point()
  2. 条形图

Python效率相关

1)字典与列表

python中字典—hash table;列表—数组 对成员的查找访问字典比列表快 listtmp=[1,2,3,4]

dicttmp=dict.fromkeys(listtmp,True)

2)集合与列表

set的交并差操作比list迭代快 list(set(lista)&set(list)) | union & intersection – difference

3)python 的条件表达式是lazy evaluation

if x and y: x为false y的值将不再计算

4)字符串优化:对任何字符串的操作都将产生新的对象

(1)字符串连接尽量使用join()而不是+

避免:

s=""
for x in list:
    s+=func(x)

代替方法:

sliest = [func(elt) for elt in somelist]
s = "".join(slist)

(2)当对字符串可以使用正则表达式或者内置函数来处理的时候,选择内置函数。

str.isalpha(),str.isdigit(),str.startswith(('x', 'yz'))

(3)对字符进行格式化比直接串联读取要快,因此要使用

out = "<html>%s%s%s%s</html>" % (head, prologue, query, tail)

而避免

out = "<html>" + head + prologue + query + tail + "</html>"

(4)使用列表解析和生成器表达式

列表解析 a=[w for w in list]【a=(w for w in list)会效率更高】

5)交换两个变量的值使用 a,b=b,a 而不是借助中间变量

6)使用局部变量,避免”global” 关键字

7)is not 比 !=快

8)在耗时较多的循环中,可以把函数的调用改为内联的方式

9)使用级联比较 “x < y < z” 而不是 “x < y and y < z”

参考连接link 定位程序性能瓶颈以及性能优化工具