versions:
mysql adapter for python: 1.2.3c1
mysql: 5.1.41 32-bit version
default python for snow leopard: 2.6.1
1.install mysql package: http://dev.mysql.com/downloads/mysql/5.1.html#macosx-dmg
2. grab mysql adapter for python: http://sourceforge.net/projects/mysql-python/files/
3.in directory for mysql for python:
Edit the setup_posix.py and change the following
mysql_config.path = “mysql_config”
to
mysql_config.path = “/usr/local/mysql/bin/mysql_config”
4. sudo ARCHFLAGS=’-arch i386′ CC=/usr/bin/gcc-4.0 python setup.py build
5. sudo ARCHFLAGS=’-arch i386′ CC=/usr/bin/gcc-4.0 python setup.py install
6. force python to be 32-bit
defaults write com.apple.versioner.python Prefer-32-Bit -bool yes
7. python
Greg-Elliotts-Mac-Pro:~ greg$ python
Python 2.6.1 (r261:67515, Jul 7 2009, 23:51:51)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import MySQLdb
>>>
tar -zxvf Python-2.6.4.tgz
cd Python-2.6.4 && ./configure &&make &&make install
wget http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg
sh setuptools-0.6c11-py2.6.egg
easy_install readline
easy_install ipython
yield就相当于往一个list中塞东西而已(初步这么感觉),只不过写法很奇怪罢了。呵呵
>>> def kk(x):
... yield x
... yield x+7
... yield x*2
...
>>> b = kk(14)
>>> b.next()
14
>>> b.next()
21
>>> b.next()
28
>>> b.next()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
StopIteration
每个yield都往返回的叠代器中添加一个项,值是yield后面的内容。虽然函数没有明确写返回值,但是就返回了这个隐秘的叠带器。
>>> for i in kk(11):
... print i
...
11
18
22
果然。
另外yield后面是可以随便跟什么东西的。比如列表:
>>> def kk(x,y):
... yield [x,y]
... yield [x+1,y+1]
...
>>> for i in kk(12,33):
... print i
...
[12, 33]
[13, 34]
问题:
Python的函数定义中有两种特殊的情况,即出现*,**的形式。
如:def myfun1(username, *keys)或def myfun2(username, **keys)等。
解释:
* 用来传递任意个无名字参数,这些参数会一个Tuple的形式访问。
**用来处理传递任意个有名字的参数,这些参数用dict来访问。*
应用:
#########################
# “*” 的应用
#########################
>>> def fun1(*keys):
... print "keys type=%s" % type(keys)
... print "keys=%s" % str(keys)
... for i in range(0, len(keys)):
... print "keys[" + str(i) + "]=%s" % str(keys[i])
...
>>> fun1(2,3,4,5)
输出以下结果:
keys type=<type 'tuple'>
keys=(2, 3, 4, 5)
keys[0]=2
keys[1]=3
keys[2]=4
keys[3]=5
#########################
# “**” 的应用
#########################
>>> def fun2(**keys):
... print "keys type=%s" % type(keys)
... print "keys=%s" % str(keys)
... print "name=%s" % str(keys['name'])
...
>>>
>>> fun2(name="vp", age=19)
输出以下结果:
keys type=<type 'dict'>
keys={'age': 19, 'name': 'vp'}
name=vp
#wget http://peak.telecommunity.com/dist/ez_setup.py
#python ez_setup.py
#easy_install hashlib
for i in range(20):
print ("*"*i)
>>>li
['a', 'b', 'mpilgrim', 'z', 'example']
>>>li[-3]
mpilgrim
#如果负数索引使您感到糊涂,可以这样理解:li[-n] == li[len(li) - n]。
#所以在这个 list 里,li[-3] == li[5 - 3] == li[2]。
>>>li.pop()
example
#pop(),删除list中最后一个元素并返回该元素的值
说明:本文并不详细介绍Python中的列表,可以参看Python文档。
Python中没有数组的数据结构,但列表很像数组,如:a=[0,1,2]
这时a[0]=0, a[1]=1, a[2]=2,但引出一个问题,即如果数组a想定义为0到999怎么办,这时可能通过a = range(0, 1000)实现。
或省略为a = range(1000).如果想定义1000长度的a,初始值全为0,则 a = [0 for x in range(0, 1000)]下面是二维数组的定义:
直接定义 a=[[1,1],[1,1]],这里定义了一个2*2的,且初始为0的二维数组。
间接定义 a=[[0 for x in range(10)] for y in range(10)],这里定义了10*10初始为0的二维数组。
后来,我在网上找到了更简单的字义二维数组的方法:
b = [[0]*10]*10,定义10*10初始为0的二维数组。
与a=[[0 for x in range(10)] for y in range(10)]比较:print a==b的结果为True。
但用b的定义方法代替a后,以前的可以正常运行的程序也出错了,经过仔细分析得出区别:
a[0][0]=1时,只有a[0][0]为1,其他全为0。
b[0][0]=1时,a[0][0],a[1][0],只到a[9,0]全部为1。由此得到大数组中的10个小的一维数据全是一个相同的引用,即指向同一地址。
故b = [[0]*10]*10并不符合我们常规意义上的二维数组。
同时经过试验:c=[0]*10的定义与c=[0 for x in range(10)]有同样的效果,而没有上面相同引用的问题,
估计数组c的定义时是值类型相乘,而前面b的用类型的相乘,因为一维数组是一个引用(借用C#中的值类型和引用类型,不知是否合适)。
import logging
logger = logging.getLogger('myapp')
hdlr = logging.FileHandler('var/myapp.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)
####And then to use it:
logger.info('a log message')
到顶部