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
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
#python_select python26
#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')
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.file” os.stat(f)[6]