python 杂项

 
 
Python/JS/ 
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
107. python单独打印unicode可以显示中文, 但是不显示列表中的汉字,以下适合一般的数据显示中文需求(不能满足,sqlalchemy的显示中文数据需求,因为不能json话,比如date.datetime())

答案就是用json模块:

<<<<<<<<<<<<<<<<<<<<<<<

 print(' ,'.join(x for x in sss))也可以

print(' ,'.join(unicode(x) for x in sss))

<<<<<<<<<<<<<<<<<<<<<<<

 import json


a = {u'content': {u'address_detail': {u'province': u'\u5409\u6797\u7701', u'city': u'\u957f\u6625\u5e02', u'street_number': u'', u'district': u'', u'street': u'', u'city_code': 53}, u'point': {u'y': u'43.89833761', u'x': u'125.31364243'}, u'address': u'\u5409\u6797\u7701\u957f\u6625\u5e02'}, u'status': 0, u'address': u'CN|\u5409\u6797|\u957f\u6625|None|CERNET|0|0'}


print json.dumps(a).decode('unicode-escape')


输出:
{"content": {"address_detail": {"province": "吉林省", "city": "长春市", "street_number": "", "district": "", "street": "", "city_code": 53}, "address": "吉林省长春市", "point": {"y": "43.89833761", "x": "125.31364243"}}, "status": 0, "address": "CN|吉林|长春|None|CERNET|0|0"}

<<<<<<<<<<<<<<<<<<<<<<<

例如:

  1. import json  
  2.   
  3. data=[{u'\u663e\u793a': [u'python', u'\u8bd5\u9a8c'], u'\u6570\u91cf': 22, u'\u8bed\u8a00': u'python'}]  
  4. data_c = u'\u663e\u793a'  
  5. print data  
  6. print data_c  
  7.   
  8. res_data=json.dumps(data,ensure_ascii=False,encoding="gb2312")  
  9. print res_data  

 在没有进行格式转换时,输出为:

>>>[{u'\u663e\u793a': [u'python', u'\u8bd5\u9a8c'], u'\u6570\u91cf': 22, u'\u8bed\u8a00': u'python'}]

>>>显示

可见非列表中的数据在输出时是会转换成中文显示出来的,但列表中的unicode数据不会。

转换后,输出为:

>>>[{"显示": ["python", "试验"], "数量": 22, "语言": "python"}]

 如果后面这种输出是想要的格式,那么就利用现成的json模块将原列表格式转换为json字符串输出,并设置好编码格式,就可以了。

 当还需要再用这部分用来显示的数据,譬如以后什么时候又想直接用python来读取log文件中这种看起来比较方便的带中文的伪列表,那么再用json.loads转换回去即可。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 106. 闭包
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
105.

uvloop 使得 asyncio 更快. 实际上,比nodejs,gevent,以及其他任何Python异步框架至少快两倍 .uvloop asyncio 基于性能的测试接近于Go程序.

asyncio 和 uvloop

https://coyee.com/article/10773-uvloop-blazing-fast-python-networking

104. python 一行代码实现的功能呢~~~~
python -m SimpleHTTPServer 8080 # python2
python3 -m http.server 8080 # python3
a,b =b,a

 
103. requests 高级用法
http://docs.python-requests.org/zh_CN/latest/user/advanced.html#streaming-requests

102.
你可能不知道的 30 个 Python 语言的特点技巧 
 
101.
1.运算符重载让类拦截常规的Python运算。
2.类可重载所有的Python表达式运算符。
3.类也可重载打印、函数调用、属性点号运算等内置运算。
4.重载使类实例的行为像内置类型。
5.重载是通过特殊名称的类方法来实现的。
 
运算符重载只是意味着在类方法中拦截内置的操作——当类的实例出现在内置操作中,Python自动调用你的方法,并且你的方法的返回值变成了相应操作的结果。

100.
python 链式调用   return  self


99. 

基于python3.5+的web框架sanic中文入门教程


98. Python黑魔法 --- 异步IO( asyncio) 协程


97. iterm2 MAC控制台

96. 不错的python 可视化调试工具:
http://blog.jobbole.com/52090/

更好的调试器

pdb的直接替代者:
ipdb(easy_install ipdb) – 类似ipython(有自动完成,显示颜色等)
pudb(easy_install pudb) – 基于curses(类似图形界面接口),特别适合浏览源代码

 



95. profile
 profile是python的标准库。可以统计程序里每一个函数的运行时间,并且提供了多样化的报表 

94. timeit   给函数计时的库

93. 不错的jQuery库
http://mbraak.github.io/jqTree/

92. 很快的异步IO
https://pypi.python.org/pypi/asynchttp/

91. 鸭子类型

90. unicode, ascii, utf-8
单来说:
Unicode 是「字符集」
UTF-8 是「编码规则」
其中:
字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)
编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)
 
广义的 Unicode 是一个标准,定义了一个字符集以及一系列的编码规则,即 Unicode 字符集和 UTF-8、UTF-16、UTF-32 等等编码……Unicode 字符集为每一个字符分配一个码位,例如「知」的码位是 30693,记作 U+77E5(30693 的十六进制为 0x77E5)。UTF-8 顾名思义,是一套以 8 位为一个编码单位的可变长编码。会将一个码位编码为 1 到 4 个字节:
 
U+ 0000 ~ U+ 007F: 0XXXXXXXU+ 0080 ~ U+ 07FF: 110XXXXX 10XXXXXXU+ 0800 ~ U+ FFFF: 1110XXXX 10XXXXXX 10XXXXXXU+10000 ~ U+1FFFF: 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX根据上表中的编码规则,之前的「知」字的码位 U+77E5 属于第三行的范围:
 
7    7    E    5        0111 0111 1110 0101    二进制的 77E5--------------------------    0111   011111   100101 二进制的 77E51110XXXX 10XXXXXX 10XXXXXX 模版(上表第三行)11100111 10011111 10100101 代入模版   E   7    9   F    A   5这就是将 U+77E5 按照 UTF-8 编码为字节序列 E79FA5 的过程。反之亦然。
编辑于 2017-07-23
18214 条评论
分享收藏感谢
举一个例子:It's 知乎日报你看到的unicode字符集是这样的编码表:
 
I 0049t 0074' 0027s 0073  0020
知 77e5
乎 4e4e
日 65e5
报 62a5
每一个字符对应一个十六进制数字。计算机只懂二进制,因此,严格按照unicode的方式(UCS-2),应该这样存储:
 
I 00000000 01001001t 00000000 01110100' 00000000 00100111s 00000000 01110011  00000000 00100000知 01110111 11100101乎 01001110 01001110日 01100101 11100101报 01100010 10100101这个字符串总共占用了18个字节,但是对比中英文的二进制码,可以发现,英文前9位都是0!浪费啊,浪费硬盘,浪费流量。怎么办?UTF。
UTF-8是这样做的:1. 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;2. n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。这样就形成了如下的UTF-8标记位:0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
... ...于是,”It's 知乎日报“就变成了:
 
I 01001001t 01110100' 00100111s 01110011  00100000
知 11100111 10011111 10100101
乎 11100100 10111001 10001110
日 11100110 10010111 10100101
报 11100110 10001010 10100101
和上边的方案对比一下,英文短了,每个中文字符却多用了一个字节。但是整个字符串只用了17个字节,比上边的18个短了一点点。下边是课后作业:请将”It's 知乎日报“的GB2312和GBK码(自行google)转成二进制。不考虑历史因素,从技术角度解释为什么在unicode和UTF-8大行其道的同时,GB2312和GBK仍在广泛使用。剧透:一切都是为了节省你的硬盘和流量。



80. sqlalchemy 重复查询一个值,  即使数据库值变了, 即使del 查询结果,再重新查询,结果依然不变........!!!!!!!!!!!!!!
需要   db.session.remove()
---再Flask中, remove 会被flask框架会在一个请求结束后自动调用, 当不用flask框架的时候,必须自己去调用

79. requests 库指定编码
关于requests库
 
requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到。
 
其中的Request对象在访问服务器后会返回一个Response对象,这个对象将返回的Http响应字节码保存到content属性中。
 
但是如果你访问另一个属性text时,会返回一个unicode对象,乱码问题就会常常发成在这里。
 
因为Response对象会通过另一个属性encoding来将字节码编码成unicode,而这个encoding属性居然是responses自己猜出来的。
 
官方文档:
 
text
Content of the response, in unicode.
 
If Response.encoding is None, encoding will be guessed using chardet.
 
The encoding of the response content is determined based solely on HTTP headers, following RFC 2616 to the letter. If you can take advantage of non-HTTP knowledge to make a better guess at the encoding, you should set r.encoding appropriately before accessing this property.
所以要么你直接使用content(字节码),要么记得把encoding设置正确,比如我获取了一段gbk编码的网页,就需要以下方法才能得到正确的unicode。
 
Python
 
import requests
response = requests.get(url)
response.encoding = 'gbk'
 
print response.text1
import requests
response = requests.get(url)
response.encoding = 'gbk'
 
print response.text


78. 指定json的解码
dd = json.loads(j_str, encoding='utf-8') #dd中的字符串都是unicode

77. unicode转utf-8
xxx.encode('utf-8')

76. 判断编码
import chardet
chardet.detect(strxxx)

75. str转dict
eval("{'a':1,'b':2}")

74. 类,实例,和其它对象的内建函数
issubclass(subclass, supclass)    #类是否是另一个类的子类或者子孙类
isinstance(obj1, class1)   #实例是否是类的实例
hasattr(),getattr(),setattr(),delattr()
dir(), type
super(type[.obj])     #返回此type类的子类
vars() 返回属性和值


73. python动态创建类
http://www.jb51.net/article/109377.htm

72.

python -m xxx.py

作用是:把xxx.py文件当做模块启动
但是我一直不明白当做模块启动到底有什么用。python xxx.py和python -m xxx.py有什么区别!

自问自答:

  1. python xxx.py
  2. python -m xxx.py

这是两种加载py文件的方式:
1、叫做直接运行
2、相当于import,叫做当做模块来启动

不同的加载py文件的方式,主要是影响——sys.path 这个属性。sys.path 就相当于liunx中的PATH。

71.
    a. [python]用profile协助程序性能优化
            
http://www.cnblogs.com/btchenguang/archive/2012/02/03/2337112.html 
    b. dis.dis
    c. 想测试一行代码的运行时间,在Python中比较方便,可以直接使用timeit
70.
引用jquery.cookie.js
console.log('get cookie'+ $.cookie('username'));

69. 模板获取cookie

我们还可以在模板中获取cookie,然后渲染模板.

test.html:

 

<h1>My name is {{request.cookies.get('Name')}}</h1>

68.

环境变量是进程环境的属性之一,当你用os.system去执行的时候,实际上是:

1 fork一个子进程

2 子进程exec另一个shell程序,执行你要执行的命令,比如你source,实际上是exec一个shell进程再source,所以子进程的环境变量被你改了

但是你这个python进程不受任何影响

要修改当前进程的环境变量,用os.putenv,或操作os.environ这个字典(实际上并不是dict的直接实例,而是一个用法和dict基本一样的对象),这俩的区别参考os模块的文档


67. python的源码doc,比网上教程更清晰
def __init__(self, fget=None, fset=None, fdel=None, doc=None): # known special case of property.__init__
"""
property(fget=None, fset=None, fdel=None, doc=None) -> property attribute

fget is a function to be used for getting an attribute value, and likewise
fset is a function for setting, and fdel a function for del'ing, an
attribute. Typical use is to define a managed attribute x:

class C(object):
def getx(self): return self._x
def setx(self, value): self._x = value
def delx(self): del self._x
x = property(getx, setx, delx, "I'm the 'x' property.")

Decorators make defining new properties or modifying existing ones easy:

class C(object):
@property
def x(self):
"I am the 'x' property."
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x

# (copied from class doc)

 
66. python 获取Linux环境变量:
os.environ
os.environ['XXX']
os.environ.get('XX')

65. Reason: unsafe use of relative rpath libmysqlclient.18.dylib in /Users/xiaofeier312/.python-eggs/MySQL_python-1.2.5-py2.7-macosx-10.12-intel.egg-tmp/_mysql.so with restricted binar
https://stackoverflow.com/questions/6383310/python-mysqldb-library-not-loaded-libmysqlclient-18-dylib#answer-13421926

64. sqlite  SQLALCHEMY  
不支持create_time = db.Column(db.TIMESTAMP(True), nullable=True, server_default=text('NOW()'))
op_time = db.Column(db.DateTime, nullable=True,
server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))

63. 
PYTHON MYSQLDB  (python和python虚拟环境路径不能太深,否则安装包会报错,!!!)
wget http://sourceforge.net/projects/mysql-python/files/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz
https://sourceforge.net/projects/mysql-python/files/mysql-python/
https://sourceforge.net/projects/mysql-python/

62.  异步任务神器 Celery 简明笔记
http://python.jobbole.com/84041/
http://blog.csdn.net/apple9005/article/details/54430104

61.
__init__.py的作用有如下几点:
    1. 相当于class中的def __init__(self):函数,用来初始化模块。
    2. 把所在目录当作一个package处理
    3. from-import 语句导入子包时需要用到它。 如果没有用到, 他们可以是空文件。

60. 列表的每一个元素显示为一行
print( '\n'.join(listX))

59. Python协程库 greenlet,stackless,gevent,eventlet
主要用于IO密集型, 计算型不适合
http://blog.csdn.net/zeroctu/article/details/54893763

58. import time
a='2022-03-11 23:11:01'
ti=time.strptime(a, '%Y-%m-%d %H%M%S')
>>>ti>>time.struct_time
>>>ti.tm_year>>2022, >>>ti.tm_hour>>23 >>>ti.....................
h_time = time.strftime('%H%M%S', ti)
>>>h_time >>'23:11:01'


57. mysql取出来的编码要看清,print出来是u'XXX',需要先str.encode("UTF-8"), 才能jsonify()

56. js    alert显示json
alert(JSON.stringify( data ));




54. os.system()的返回值为Linux返回的状态,不能返回命令查询结果
https://my.oschina.net/u/1782622/blog/386422
用os.popen()可以差返回结果

53.

生成器表达式

 

在前面一期「这样写代码更优雅」的文章里面曾经介绍过列表推导式(list comprehension),生成器表达式与列表推导式长的非常像,但是它俩返回的对象不一样,前者返回生成器对象,后者返回列表对象。

1
2
3
4
5
6
>>> g = (x*2 for in range(10))
>>> type(g)
<type 'generator'>
>>> l = [x*2 for in range(10)]
>>> type(l)
<type 'list'>
用xrange生成一个迭代器

52. enumerate,用于遍历可迭代(iterable)的对象,如列表,字符串,字典,元组
for index, item in  enumerate(listX):
    print index, item 
~~~~~~~~~~~~~~~~
如何判断一个对象是否可迭代:
>>> from collections import Iterable
>>> isinstance('abc',Iterable)
True
更多:  http://blog.csdn.net/business122/article/details/7608176
51. Python多线程,协程
http://python.jobbole.com/81546/

50. python 面向对象


49 QUEUE python队列
http://www.cnblogs.com/itogo/p/5635629.html


48. python flask等等-伯乐在线
http://python.jobbole.com/category/tools/

47.
属性函数(property)
http://python.jobbole.com/80955/ ;


46.
像map()函数这种能够接收函数作为参数的函数,称之为高阶函数(Higher-order function)。
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。

45. RE模块
http://www.cnblogs.com/XXCXY/p/5180237.html
http://www.cnblogs.com/XXCXY/p/5180237.html

Python 提供了两种不同的原始操作基于正则表达式: re.match()检查是否只在字符串的开头匹配而re.search()检查是否在任何地方 (这是默认情况下,Perl 做的) 的字符串匹配。

举个例子:

>>>>>> re.match("c", "abcdef") # No match>>> re.search("c", "abcdef") # Match<_sre.SRE_Match object at ...>
 

44.
max()返回最大值   max([1,3,4,2])
min()
zip并行遍历:
name=['a','b','c']
age=[2,33,44]
zip(name,age)
返回 [('a',2),('b',22),('c',44)]
~~~~~~~~~~~~~~~~~~~~
map 并行遍历
http://www.cnblogs.com/XXCXY/p/5180237.html
~~~~~~~~~~~~~~~~~~~~
reduce 归并

reduce()函数也是Python内置的一个高阶函数。

reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。

例如,编写一个f函数,接收x和y,返回x和y的和:

1
2
def f(x, y):
    return + y

调用 reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:

1
2
3
4
5
先计算头两个元素:f(13),结果为4
再把结果和第3个元素计算:f(45),结果为9
再把结果和第4个元素计算:f(97),结果为16
再把结果和第5个元素计算:f(169),结果为25
由于没有更多的元素了,计算结束,返回结果25

上述计算实际上是对 list 的所有元素求和。虽然Python内置了求和函数sum(),但是,利用reduce()求和也很简单。

reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:

1
reduce(f, [13579], 100)

结果将变为125,因为第一轮计算是:

计算初始值和第一个元素:f(100, 1),结果为101

~~~~~~~~~~~~~~~~~~~~
chr(intx)  返回数字对应的字母/编码
ord('z') 返回z的asc码
hex()整数转化为十六进制字符串
oct()八位
repr 以字符串显示

43.

常用的内置函数

内置方法  说明
 __init__(self,...)  初始化对象,在创建新对象时调用
 __del__(self)  释放对象,在对象被删除之前调用
 __new__(cls,*args,**kwd)  实例的生成操作
 __str__(self)  在使用print语句时被调用
 __getitem__(self,key)  获取序列的索引key对应的值,等价于seq[key]
 __len__(self)  在调用内联函数len()时被调用
 __cmp__(stc,dst)  比较两个对象src和dst
 __getattr__(s,name)  获取属性的值
 __setattr__(s,name,value)  设置属性的值
 __delattr__(s,name)  删除name属性
 __getattribute__()  __getattribute__()功能与__getattr__()类似
 __gt__(self,other)  判断self对象是否大于other对象
 __lt__(slef,other)  判断self对象是否小于other对象
 __ge__(slef,other)  判断self对象是否大于或者等于other对象
 __le__(slef,other)  判断self对象是否小于或者等于other对象
 __eq__(slef,other)  判断self对象是否等于other对象
 __call__(self,*args)  把实例对象作为函数调用

http://www.cnblogs.com/hongfei/p/3858256.html

42. range(11)   0到10
range(1,22)    1到21
range(2,222,3)   2到222,步骤为3
xrange(22)
xrange会生成一个迭代器,而不是像range那样直接返回一个List

41. random
random.randint(1,22)    1到22间随机生成一个整数
random.random() 默认生成一个0,1之间的浮点数
random.uniform(0,22)  默认返回一个0到22间的浮点数
random.randrange(0,9999,50)  随机取一个0,9999之间的 步伐为50的数
random.choice('asd')  随机返回一个字母
random.choice(['d','fddd','gs'])  随机返回一个字符串   
random.sample(['a','s','d','f'],2)   随机取出两个字母
items=[1,2,3,4,5]
random.shuffle(items)  洗牌,打乱顺序

40. 

字符串操作
s.strip(rm)        删除s字符串中开头、结尾处,位于 rm删除序列的字符

s.lstrip(rm)       删除s字符串中开头处,位于 rm删除序列的字符

s.rstrip(rm)      删除s字符串中结尾处,位于 rm删除序列的字符
d='asasaaasssdasasbasasaaa'
 d.strip('as')  返回 ‘dasasb' 
~~~~~~~~
s.replace('aa', 'b', 3)  去掉字符串的aa,换为b,次数为3
s.split('b',4)  遇到b则分割,去掉b本身
 ~~~~~~~~~~~
str1.count('ab')  查询字符串中‘ab'的个数
str1.find('cd') 查询第一次出现‘cd'的位置
str1.rfind('as') 查询最后一次出现‘as'的位置
~~~~~~~~~~

判定

isalnum(),#是否全是字母和数字,并至少有一个字符

isalpha(),是否全是字母,并至少有一个字符

isdigit(),是否全是数字,并至少有一个字符 ,如果是全数字返回True,否则返回False

islower(),#S中的字母是否全是小写 

isupper(),#S中的字母是否是大写 

isspace(),#是否全是空白字符,并至少有一个字符

istitle(),S是否是首字母大写的

startswith(prefix[, start[, end]]), #是否以prefix开头 

endswith(suffix[,start[, end]]),#以suffix结尾 

备注:

这些函数都比较简单,顾名知义。需要注意的是*with()函数族可以接受可选的 start, end 参数,善加利用,可以优化性能。

另,自 Py2.5 版本起,*with() 函数族的 prefix 参数可以接受 tuple 类型的实参,当实参中的某人元素能够匹配,即返回 True。 
~~~~~~~~~~~~~~~~~~~~~~~
':'.join(listA)   A的元素中间插入一个冒号,然后返回字符串 

‘:'.join(strB)    B的每个字母之间都插入冒号
同样使用与字典与元组
os.path.join('/root/,'/lib','/c')  将lying合并
~~~~~~~~~~~~~~
http://www.cnblogs.com/diege/archive/2012/10/01/2709790.html

39.
pickle.dump(obj, file[, protocol])
  序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。
 
------------------------------------------
pickle.load(file)
  反序列化对象。将文件中的数据解析为一个Python对象。
 
其中要注意的是,在load(file)的时候,要让python能够找到类的定义,否则会报错:


38. json  json字典,json类等转换json
http://blog.csdn.net/seetheworld518/article/details/49536247
jsonstr = json.dumps(dict)
dict = json.loads(jsonstr)

37. list

6.5、列表脚本操作符
列表对+和*的操作符与字符串相似。+号用于组合列表,*号用于重复列表,例如:

print len([1, 2, 3]); 
#3
 print [1, 2, 3] + [4, 5, 6]; 
#[1, 2, 3, 4, 5, 6]
print ['Hi!'] * 4; 
#['Hi!', 'Hi!', 'Hi!', 'Hi!']
print 3 in [1, 2, 3] #
True
 for x in [1, 2, 3]: 
      print x, #1 2 3

6.6、列表截取

L=['spam', 'Spam', 'SPAM!'];print L[2]; #'SPAM!'print L[-2]; #'Spam'print L[1:]; #['Spam', 'SPAM!']

6.7、列表函数&方法

复制代码
list.append(obj) 在列表末尾添加新的对象
list.count(obj) 统计某个元素在列表中出现的次数
list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
list.index(obj) 从列表中找出某个值第一个匹配项的索引位置,索引从0开始
list.insert(index, obj) 将对象插入列表
list.pop(obj=list[-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
list.remove(obj) 移除列表中某个值的第一个匹配项list.reverse() 反向列表中元素,倒转
list.sort([func]) 对原列表进行排序

36.
字典
cmp(dict1, dict2) 比较两个字典元素。
len(dict) 计算字典元素个数,即键的总数。
str(dict) 输出字典可打印的字符串表示。
type(variable) 返回输入的变量类型,如果变量是字典就返回字典类型。
radiansdict.clear() 删除字典内所有元素
radiansdict.copy() 返回一个字典的浅复制
radiansdict.fromkeys() 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
radiansdict.get(key, default=None) 返回指定键的值,如果值不在字典中返回default值
radiansdict.has_key(key) 如果键在字典dict里返回true,否则返回false
radiansdict.items() 以列表返回可遍历的(键, 值) 元组数组
radiansdict.keys() 以列表返回一个字典所有的键
radiansdict.setdefault(key, default=None) 和get()类似, 但如果键不已经存在于字典中,将会添加键并将值设为default
radiansdict.update(dict2) 把字典dict2的键/值对更新到dict里
radiansdict.values() 以列表返回字典中的所有值

35. python 返回的对象,打印出来的看似是列表,比如os.environ, 但是不能当列表用, 需要看源码,用os.environ.copy()才能返回dict

34. python os模块
os.name
os.listdir()
os.getcwd()
os.remove()
os.rmdir()
os.mkdir()

~~~~~~~~~~
os.listdir(dirname):列出dirname下的目录和文件

os.getcwd():获得当前工作目录

os.curdir:返回当前目录('.')

os.chdir(dirname):改变工作目录到dirname

os.path.isdir(name):判断name是不是一个目录,name不是目录就返回false

os.path.isfile(name):判断name是不是一个文件,不存在name也返回false

os.path.exists(name):判断是否存在文件或目录name

os.path.getsize(name):获得文件大小,如果name是目录返回0

os.path.abspath(name):获得绝对路径

os.path.normpath(path):规范path字符串形式

os.path.split(name):分割文件名与目录(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)

os.path.splitext():分离文件名与扩展名

os.path.join(path,name):连接目录与文件名或目录

os.path.basename(path):返回文件名

os.path.dirname(path):返回文件路径 

1、os.path方法

     通过传入需要遍历的目录,列出目录下的所有文件并统计文件数,os提供的path模块能对目录非常灵活的操作。

import os,sys
def listdir(dir,file):
    file.write(dir + '\n')
    fielnum = 0
    list = os.listdir(dir)  #列出目录下的所有文件和目录
    for line in list:
        filepath = os.path.join(dir,line)
        if os.path.isdir(filepath):  #如果filepath是目录,则再列出该目录下的所有文件
            myfile.write('   ' + line + '\\'+'\n')
            for li in os.listdir(filepath):
                myfile.write('     '+li + '\n')
                fielnum = fielnum + 1
        elif os.path:   #如果filepath是文件,直接列出文件名
            myfile.write('   '+line + '\n') 
            fielnum = fielnum + 1
    myfile.write('all the file num is '+ str(fielnum))
dir = raw_input('please input the path:')
myfile = open('list.txt','w')


2、os.walk方法

os模块提供的walk方法很强大,能够把给定的目录下的所有目录和文件遍历出来。

方法:os.walk(path),遍历path,返回一个对象,他的每个部分都是一个三元组,('目录x',[目录x下的目录list],目录x下面的文件)

import os
def walk_dir(dir,fileinfo,topdown=True):
    for root, dirs, files in os.walk(dir, topdown):
        for name in files:
            print(os.path.join(name))
            fileinfo.write(os.path.join(root,name) + '\n')
        for name in dirs:
            print(os.path.join(name))
            fileinfo.write('  ' + os.path.join(root,name) + '\n')
dir = raw_input('please input the path:')
fileinfo = open('list.txt','w')
walk_dir(dir,fileinfo)


33. python chardet
chardet('sss') 可以查看编码


32 python 逻辑运算顺序
not 1 or 1,  先算not   然后是 and  or

表5.2 运算符优先级

运算符描述
lambda Lambda表达式
or 布尔“或”
and 布尔“与”
not x 布尔“非”
in,not in 成员测试
is,is not 同一性测试
<,<=,>,>=,!=,== 比较
| 按位或
^ 按位异或
& 按位与
<<,>> 移位
+,- 加法与减法
*,/,% 乘法、除法与取余
+x,-x 正负号
~x 按位翻转
** 指数
x.attribute 属性参考
x[index] 下标
x[index:index] 寻址段
f(arguments...) 函数调用
(experession,...) 绑定或元组显示
[expression,...] 列表显示
{key:datum,...} 字典显示
'expression,...' 字符串转换




31

python-将字符串转换为字典

 
json越来越流行,通过python获取到json格式的字符串后,可以通过eval函数转换成dict格式:

>>> a='{"name":"yct","age":10}'

>>> eval(a)
{'age': 10, 'name': 'yct'}

支持字符串和数字,其余格式的好像不支持:


30.
python不错的文档
http://www.open-open.com/code/tags/Python

29.
" xyz ".strip() # returns "xyz" 
" xyz ".lstrip() # returns "xyz "
" xyz ".rstrip() # returns " xyz" 
" x y z ".replace(' ', '') # returns "xyz"
python去除字符串中间空格的方法
 
1、使用字符串函数replace
 
>>> a = 'hello world'
 
>>> a.replace(' ', '')
'helloworld'
看上这种方法真的是很笨。
 
2、使用字符串函数split
 
>>> a = ''.join(a.split())
 
>>> print(a)
helloworld
3、使用正则表达式
 
>>> import re
>>> strinfo = re.compile()
 
>>> strinfo = re.compile(' ')
 
>>> b = strinfo.sub('', a)
>>> print(b)
helloworld

28. 
  • hasattr(object, name)

说明:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的)。

参数object:对象。

参数name:特性名称。

示例:

>>> hasattr(list, 'append')True >>> hasattr(list, 'add')False


27. with语句
http://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/




26. 相对导入(不能在__main__中用)
图片

25.
 理解Python中的装饰器 
http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html

24.
func() is a result of call to func
func   is a object of the function

23.
 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能 


22.
 python urllib的urlencode和quote和quote_plus

老大 2016/4/13 11:28:34

本地图片,请重新上传https://www.douban.com/note/491745257/ ;


老大 2016/4/13 11:28:59

python部分:
1.urllib.urlencode(query, doseq=0)
接受参数形式为:[(key1, value1), (key2, value2),...] 和 {'key1': 'value1', 'key2': 'value2',...}
返回的是形如'key2=value2&key1=value1'字符串。
>>>urllib.urlencode({'name': u'老王'.encode('utf8'), 'sex': u'男'.encode('utf8')})
'name=%E8%80%81%E7%8E%8B&sex=%E7%94%B7'

2.urllib.quote(s, safe='/')
接受参数s为字符串,safe是指定某字符不被urlencode,默认为'/',
如指定'+'、'/'不需转换,传 '+/' 和 '+ /' 均可。另外此方法会将“空格”转换为“%20”
>>> urllib.quote(u'老王 /+'.encode('utf8'))
'%E8%80%81%E7%8E%8B%20/%2B'

3.urllib.quote_plus(s, safe='')
此方法的源码为:
def quote_plus(s, safe=''):
    """Quote the query fragment of a URL; replacing ' ' with '+'"""
    if ' ' in s:
        s = quote(s, safe + ' ')
        return s.replace(' ', '+')
    return quote(s, safe)
可以看出它比quote多一些功能,但是会将“空格”转换成“加号”,默认safe为空。
>>> urllib.quote_plus(u'老王 /+'.encode('utf8'))
'%E8%80%81%E7%8E%8B+%2F%2B'

具体使用哪个方法,看需求。

urlencode部分:
并不是所有相关字符都需要转码,有哪些字符需要urlencode并且为什么?


21.
 Python标准库:内置函数vars([object]) 
 本函数是实现返回对象object的属性和属性值的字典对象。如果默认不输入参数,就打印当前调用位置的属性和属性值,相当于locals()的功能。如果有参数输入,就只打印这个参数相应的属性和属性值。 

20.
模块(module)

    __doc__: 文档字符串。如果模块没有文档,这个值是None。
    *__name__: 始终是定义时的模块名;即使你使用import .. as 为它取了别名,或是赋值给了另一个变量名。
    *__dict__: 包含了模块里可用的属性名-属性的字典;也就是可以使用模块名.属性名访问的对象。
    __file__: 包含了该模块的文件路径。需要注意的是内建的模块没有这个属性,访问它会抛出异常! 


1     import fnmatch as m
2     print m.__doc__.splitlines()[0] # Filename matching with shell patterns.
3     print m.__name__ # fnmatch
4     print m.__file__ # /usr/lib/python2.6/fnmatch.pyc
5     print m.__dict__.items()[0] # ('fnmatchcase', <function fnmatchcase="" at="" 0xb73deb54="">)</function>

2.2. 类(class)

    __doc__: 文档字符串。如果类没有文档,这个值是None。
    *__name__: 始终是定义时的类名。
    *__dict__: 包含了类里可用的属性名-属性的字典;也就是可以使用类名.属性名访问的对象。
    __module__: 包含该类的定义的模块名;需要注意,是字符串形式的模块名而不是模块对象。
    *__bases__: 直接父类对象的元组;但不包含继承树更上层的其他类,比如父类的父类。
 

1     print Cat.__doc__ # None
2     print Cat.__name__ # Cat
3     print Cat.__module__ # __main__
4     print Cat.__bases__ # (<type ?object?="">,)
5     print Cat.__dict__ # {'__module__': '__main__', ...}</type>

2.3. 实例(instance)

实例是指类实例化以后的对象。

    *__dict__: 包含了可用的属性名-属性字典。
    *__class__: 该实例的类对象。对于类Cat,cat.__class__ == Cat 为 True。


1     print cat.__dict__
2     print cat.__class__
3     print cat.__class__ == Cat # True

2.4. 内建函数和方法(built-in functions and methods)

根据定义,内建的(built-in)模块是指使用C写的模块,可以通过sys模块的builtin_module_names字段查看都有哪些模块是内建的。这些模块中的函数和方法可以使用的属性比较少,不过一般也不需要在代码中查看它们的信息。

    __doc__: 函数或方法的文档。
    __name__: 函数或方法定义时的名字。
    __self__: 仅方法可用,如果是绑定的(bound),则指向调用该方法的类(如果是类方法)或实例(如果是实例方法),否则为None。
    *__module__: 函数或方法所在的模块名。 

2.5. 函数(function)

这里特指非内建的函数。注意,在类中使用def定义的是方法,方法与函数虽然有相似的行为,但它们是不同的概念。

    __doc__: 函数的文档;另外也可以用属性名func_doc。
    __name__: 函数定义时的函数名;另外也可以用属性名func_name。
    *__module__: 包含该函数定义的模块名;同样注意,是模块名而不是模块对象。
    *__dict__: 函数的可用属性;另外也可以用属性名func_dict。 

    不要忘了函数也是对象,可以使用函数.属性名访问属性(赋值时如果属性不存在将新增一个),或使用内置函数has/get/setattr()访问。不过,在函数中保存属性的意义并不大。
    func_defaults: 这个属性保存了函数的参数默认值元组;因为默认值总是靠后的参数才有,所以不使用字典的形式也是可以与参数对应上的。
    func_code: 这个属性指向一个该函数对应的code对象,code对象中定义了其他的一些特殊属性,将在下文中另外介绍。
    func_globals: 这个属性指向当前的全局命名空间而不是定义函数时的全局命名空间,用处不大,并且是只读的。
    *func_closure: 这个属性仅当函数是一个闭包时有效,指向一个保存了所引用到的外部函数的变量cell的元组,如果该函数不是一个内部函数,则始终为None。这个属性也是只读的。 

下面的代码演示了func_closure:
01     #coding: UTF-8
02     def foo():
03     n = 1
04     def bar():
05     print n # 引用非全局的外部变量n,构造一个闭包
06     n = 2
07     return bar
08      
09     closure = foo()
10     print closure.func_closure
11     # 使用dir()得知cell对象有一个cell_contents属性可以获得值
12     print closure.func_closure[0].cell_contents # 2

由这个例子可以看到,遇到未知的对象使用dir()是一个很好的主意 :)
2.6. 方法(method)

方法虽然不是函数,但可以理解为在函数外面加了一层外壳;拿到方法里实际的函数以后,就可以使用2.5节的属性了。

    __doc__: 与函数相同。
    __name__: 与函数相同。
    *__module__: 与函数相同。

    im_func: 使用这个属性可以拿到方法里实际的函数对象的引用。另外如果是2.6以上的版本,还可以使用属性名__func__。
    im_self: 如果是绑定的(bound),则指向调用该方法的类(如果是类方法)或实例(如果是实例方法),否则为None。如果是2.6以上的版本,还可以使用属性名__self__。
    im_class: 实际调用该方法的类,或实际调用该方法的实例的类。注意不是方法的定义所在的类,如果有继承关系的话。

1     im = cat.sayHi
2     print im.im_func
3     print im.im_self # cat
4     print im.im_class # Cat

19.在其它的服务器中,发生,CSS不能加载:
 问题已解决。

【悟空】随风 2016/4/12 15:22:16
咋解决的啊
【妖精】sunday 2016/4/12 15:23:07
nginx配置文件中,加入了 include  mime.types 就可以了 

18. Django queryDict to python dict:
比如type(request.POST) is queryDict,不支持 for i in request.POST,只能先转换成python  dict
 QueryDict.dict() 
example:
mydict = request.POST.dict()


17.删除表后重新建表:
怎么也建不成,暂时只能删除库(不仅要删除工程里的migrations文件,还要删除库里的django-migrations表) 》 建空库 》python manage.py makemigrations > python manage.py migrate


16.python链接mysql有3个驱动:
有两个MySQL驱动:
    mysql-connector-python:是MySQL官方的纯Python驱动;
    MySQL-python:是封装了MySQL C驱动的Python驱动。
可以把两个都装上,使用的时候再决定用哪个:
$ easy_install mysql-connector-python
$ easy_install MySQL-python
第三种是pymysql
15. pycharm 快捷键
Ctrl + Alt + H调用层次结构



14.搭建django开发环境
a. 安装python3.5,加入path
b.下载get-pip.py
c.安装pip > cmd下> python get-pip.py
d.安装django> pip install django==1.9.5(路径: python3.5/scripts)
e.python shell > import django验证 django.__version__
f.安装pycharm4 输入验证码
g.copy the  django-admin.py file(at python3.5/Scripts folder) to where you want to create your django project
h. Create project: python django-admin.py startproject YOURPROJECTNAME
i. Create your app: python manage.py createapp NAME



13 坑。。 locals()不能乱用,啊
图片

12. Error
 int() argument must be a string, a bytes-like object or a number, not 'QueryDict' 
 
   if request.method == 'POST':
        #req = Message(title = request.POST.get('title'))
        req = message_forms.InputForms(request.POST)  #Create a new Form instance from POST data
        new_message = req.save()
        mytitle = request.POST.get('title')
        print('~message:' + mytitle)
        req.save() 
11.
django实战、学习:
http://my.oschina.net/yidao620c/blog/343174?fromerr=7KiTeNbu
 python manage.py makemigrations   #扫描改变

python manage.py migrate 保存改变

python manage.py sqlmigrations  APP  001 #查看sql语句


9.
 python/scripts > django-admin.py / pip.exe / easy_install.exe
数据库命令
There are several commands which you will use to interact with migrations and Django’s handling of database schema:

migrate, which is responsible for applying migrations, as well as unapplying and listing their status.
makemigrations, which is responsible for creating new migrations based on the changes you have made to your models.
sqlmigrate, which displays the SQL statements for a migration.
showmigrations, which lists a project’s migrations.


8. http://www.cnblogs.com/lhj588/archive/2012/05/24/2516040.html ;

Django model字段类型清单 



7. 
 执行python manage.py syncdb时,报错:Error loading MySQLdb module: No module named 'MySQLdb'本地图片,请重新上传经过上网搜索得知,MySQLdb并不支持Python3.5,因此只能找别的类库代替。解决方法:使用pymysql代替MySQLdb,因为两者的用法完全一致,步骤:1. PIP install pymysql
2. 执行成功后,打开__init__.py,添加如下:
import pymysql 
pymysql.install_as_MySQLdb()
3. 重新执行python manage.py syncdb,成功。 

6.  django book2.0   chapter 8 14/17 page
包装视图 - 
 如果我们能够丛每个视图里移除那些 重复代,并且只在需要认证的时候指明它们,那就完美了。 我们能够通过
使用一个视图包装达到目的。 花点时间来看看这个:
def requires_login(view):
def new_view(request, *args, **kwargs):
if not request.user.is_authenticated():
return HttpResponseRedirect('/accounts/login/')
return view(request, *args, **kwargs)
return new_view
函数requires_login,传入一个视图函数view,然后返回一个新的视图函数new_view.这个新的视图函数new_view
在函数requires_login内定义 处理request.user.is_authenticated()这个验证,从而决定是否执行原来的view函

现在,我们可以从views中去掉if not request.user.is_authenticated()验证.我们可以在URLconf中很容易的用
requires_login来包装实现. 

5.    django book2.0   chapter 8 13/17 page
 def method_splitter(request, *args, **kwargs):
get_view = kwargs.pop('GET', None)
post_view = kwargs.pop('POST', None)
if request.method == 'GET' and get_view is not None:
return get_view(request, *args, **kwargs)
elif request.method == 'POST' and post_view is not None:
return post_view(request, *args, **kwargs)
raise Http404
这里,我们重构method_splitter(),去掉了GET和POST两个关键字参数,改而支持使用*args和和**kwargs(注意*
号) 这是一个Python特性,允许函数接受动态的、可变数量的、参数名只在运行时可知的参数。 如果你在函数
定义时,只在参数前面加一个*号,所有传递给函数的参数将会保存为一个元组. 如果你在函数定义时,在参数前面加
两个*号,所有传递给函数的关键字参数,将会保存为一个字典 

4. 
查看django判断文件的mimetype类型
import mimetypes
mimetypes.guess_type('t.css')



Django, Admin返回的CSS文件类型是application/x-css ,应该是text/css, 导致css无法加载

 去python 根目录下搜索 mimetypes.py,修改下mime文件



上面不是有knownfiles = [
在里面新建个文件
【八戒】爱本地图片,请重新上传 2016/2/23 
添加进去

knownfiles = [
    r"C:/Python34/mime.types",

编辑这个文件C:/Python34/mime.types添加
application/x-css   css


text/css                                        css

3.
 C:\Python27\Lib\site-packages\Django-1.7.1-py2.7.egg\django\bin\mysite>python manage.py makemigrations

C:\Python27\Lib\site-packages\Django-1.7.1-py2.7.egg\django\bin\mysite>python manage.py migrate

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·····
 会出现这样的错:CommandError: App ‘books‘ has migrations. Only the sqlmigrate and sqlflush commands can be used when an app has migrations.

这是因为旧版本和新的版本命令已经不一样 的问题。

我用的是django =1.8.3,

写好自己的model以后可以换成这样的命令来生成数据库表:

 python manage.py makemigrations books

然后:python manage.py sqlmigrate books 0001

这样就可以CREATE TABLE 了。

建议看最新版的英文版本数来学习。


2. http://segmentfault.com/a/1190000002754242
posted @ 2017-08-25 22:36  Python_ZEN  阅读(927)  评论(0编辑  收藏  举报