python 杂项
答案就是用json模块:
<<<<<<<<<<<<<<<<<<<<<<<
print(' ,'.join(x for x in sss))也可以
print(' ,'.join(unicode(x) for x in sss))
<<<<<<<<<<<<<<<<<<<<<<<
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"}
<<<<<<<<<<<<<<<<<<<<<<<
例如:
- import json
- data=[{u'\u663e\u793a': [u'python', u'\u8bd5\u9a8c'], u'\u6570\u91cf': 22, u'\u8bed\u8a00': u'python'}]
- data_c = u'\u663e\u793a'
- print data
- print data_c
- res_data=json.dumps(data,ensure_ascii=False,encoding="gb2312")
- 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转换回去即可。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
105.
uvloop 使得 asyncio 更快. 实际上,比nodejs,gevent,以及其他任何Python异步框架至少快两倍 .uvloop asyncio 基于性能的测试接近于Go程序.
asyncio 和 uvloop
https://coyee.com/article/10773-uvloop-blazing-fast-python-networking104. 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.
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
知 77e5
乎 4e4e
日 65e5
报 62a5
每一个字符对应一个十六进制数字。计算机只懂二进制,因此,严格按照unicode的方式(UCS-2),应该这样存储:
UTF-8是这样做的:1. 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;2. n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。这样就形成了如下的UTF-8标记位:0xxxxxxx
知 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 库指定编码
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有什么区别!
自问自答:
- python xxx.py
- 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
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 x in range(10)) >>> type (g) < type 'generator' > >>> l = [x*2 for x in range(10)] >>> type (l) < type 'list' > |
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 做的) 的字符串匹配。
举个例子:
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 x + y |
调用 reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:
1
2
3
4
5
|
先计算头两个元素:f( 1 , 3 ),结果为 4 ; 再把结果和第 3 个元素计算:f( 4 , 5 ),结果为 9 ; 再把结果和第 4 个元素计算:f( 9 , 7 ),结果为 16 ; 再把结果和第 5 个元素计算:f( 16 , 9 ),结果为 25 ; 由于没有更多的元素了,计算结束,返回结果 25 。 |
上述计算实际上是对 list 的所有元素求和。虽然Python内置了求和函数sum(),但是,利用reduce()求和也很简单。
reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:
1
|
reduce (f, [ 1 , 3 , 5 , 7 , 9 ], 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的元素中间插入一个冒号,然后返回字符串
同样使用与字典与元组
os.path.join('/root/,'/lib','/c') 将lying合并
~~~~~~~~~~~~~~
http://www.cnblogs.com/diege/archive/2012/10/01/2709790.html
39.
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、列表脚本操作符
列表对+和*的操作符与字符串相似。+号用于组合列表,*号用于重复列表,例如:
#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、列表截取
6.7、列表函数&方法
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.
字典
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-将字符串转换为字典
>>> a='{"name":"yct","age":10}'
支持字符串和数字,其余格式的好像不支持:
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"
28.
- hasattr(object, name)
说明:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的)。
参数object:对象。
参数name:特性名称。
示例:
27. with语句
http://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/
26. 相对导入(不能在__main__中用)
25.
24.
func() is a result of call to func
func is a object of the function
23.
22.
老大 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.
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
mydict = request.POST.dict()
17.删除表后重新建表:
怎么也建不成,暂时只能删除库(不仅要删除工程里的migrations文件,还要删除库里的django-migrations表) 》 建空库 》python manage.py makemigrations > python manage.py migrate
16.python链接mysql有3个驱动:
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
#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)
django实战、学习:
http://my.oschina.net/yidao620c/blog/343174?fromerr=7KiTeNbu
python manage.py migrate 保存改变
python manage.py sqlmigrations APP 001 #查看sql语句
9.
数据库命令
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.
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
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无法加载
上面不是有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 migrate
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·····
这是因为旧版本和新的版本命令已经不一样 的问题。
我用的是django =1.8.3,
写好自己的model以后可以换成这样的命令来生成数据库表:
python manage.py makemigrations books
然后:python manage.py sqlmigrate books 0001
这样就可以CREATE TABLE 了。
建议看最新版的英文版本数来学习。
2. http://segmentfault.com/a/1190000002754242
1.
http://www.cnblogs.com/Impulse/archive/2011/11/21/2256816.html