目录

Python

Pythonジェネレータ

Pythonにはリスト内包表記とよく似た表記のジェネレータ式がある。
 
リスト内包表記はリストを返す。
 
>>> [ x ** 2 for x in range(4)]
[0, 1, 4, 9]
ジェネレータ式は反復処理可能なオブジェクト「ジェネレータオブジェクト」を返す。
 
>>> ( x ** 2 for x in range(4))
<generator object at 0x00AB0648>
ジェネレータオブジェクトは、イテレータプロトコルをサポートしている。
 
>>> g = ( x ** 2 for x in range(4))
>>> g.next()
0
>>> g.next()
1
>>> g.next()
4
>>> g.next()
9
>>> g.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

字典

字典交换

a = dict()
a['one']=1
a['two']=2
 
res = dict((v,k) for k,v in a.iteritems())

遍历字典

>>> d = {'Python': 'Guido van Rossum',
...      'Perl': 'Larry Wall',
...      'Tcl': 'John Ousterhout' }
for文を用いて、ディクショナリのキーと、それに対応する値を表示する。
 
keysメソッドでキーのリストを得て、キーごとの値を表示する。
 
>>> for key in d.keys():
...     print '%s=%s' % (key, d[key])
...
Python=Guido van Rossum
Tcl=John Ousterhout
Perl=Larry Wall
Pythonのディクショナリはイテレータが定義されているので、keysメソッドを用いなくても、同様のforループを使用できる。
 
>>> for key in d:
...     print '%s=%s' % (key, d[key])
...
Python=Guido van Rossum
Tcl=John Ousterhout
Perl=Larry Wall

snow leopard install mysqldb-python

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

安装python 2.6

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 的简单解释

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函数参数中的*,**

问题:
     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

Mac下选择python版本

#python_select python26

Python easy_install

#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文档。

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#中的值类型和引用类型,不知是否合适)。

logger模块

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

生成连续数列

num=range(1,19)
host_list=[]
for n in num:
        host_list.append(“srv" + str("%02d" % n))
 
print host_list

连续字符串

import string
print string.lowercase

字典

「2つのオブジェクトのリストかタプル」のリストに対し、「dict」キャスティングを行うと辞書化できます。
1
2
3
>>> dic=dict([['hoge',123], ['moge', 456]])
>>> print dic
{'moge': 456, 'hoge': 123}
また、別個のリスト2つから、上記のようなセットを作れる「zip」というビルトイン関数を使うと、 以下のような変換ができます。
1
2
3
>>> dic=dict(zip(['hoge', 'moge'],[123, 456]))
>>> print dic
{'moge': 456, 'hoge': 123}

字母转十进制数字

python -c 'print reduce(lambda a,b: a*256+ord(b), raw_input("string: "), 0)’

显示文件大小

f = “/tmp/test.fileos.stat(f)[6]