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]
/home1/yepnnet/public_html/wiki/data/pages/python.txt · 最后更改: 2010/05/21 01:00 由 admin
到顶部
chimeric.de = chi`s home Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0