19 Jul 2008

ZT: python黑板报

1. 关于python的启动
除了直接启动进入解释器之外(不要忘记文件结束符是^Z(win)和^D(*nix/Mac)),另外两种方法也很常用:
python -c "a=int(raw_input('a=')); print a*3"
这是直接执行python语句而不必事先写程序。注意整体用双引号,python语言内部用单引号以免引起混淆。
python -i test.py
执行完后回到解释器。注意-i必须在test.py之前。这个方法也适合-c的情形,如:
python -i -c "a=3"
需要注意的是不要用重定向 python <>

2. 脚本的命令行参数
存在sys.argv里。这是一个list.

3. 注释
以#开头,类似于C的//,为单行注释。

4. 输出
用print. 注意复杂类型也可以直接打印,例如list. 比如
import sys
print sys.argv
最后加个逗号可以避免换行。注意每个逗号后实际被追加了一个空格。
print 'a',
print 'b'
由于python有自省功能,也可以打印变量的类型。
print type(sys.argv)
利用解释器学习python的时候可以多用type(_)来确认上一次运行结果的类型。

5. 赋值
和一般的语言一样,且可以是多重的,如
x = y = z = 0

6. 数值类型
整数、浮点数和复数都是支持的。

* 整数没有大小限制:
print 111111111*111111111
print int('12345678987654321')

* 浮点数使用硬件IEEE浮点类型。
print 1.0/3
print float('0.123') # constructor
print 0.1+0.1+0.1-0.3 # not zero!

* 高精度十进制浮点数在decimal模块的Decimal类:
import decimal;
from decimal import Decimal
print Decimal(1)/Decimal(7)
decimal.getcontext().prec = 100 # change precision. default is 28
print Decimal(1)/Decimal(7)
print Decimal('0.1')+Decimal('0.1')+Decimal('0.1')-Decimal('0.3') # exactly zero

* 复数的实部和虚部都是float. 虚数单位用j或者J表示。
a=3+4j
print a.real
print a.imag
print abs(a)

7. 字符串
字符串常量可以用单引号、双引号括起来,也可以用raw字符串r""或者多行串(用"""或者'''包围)。
字符串是不可变的。
print 'a' + 'b' # ab
print 'a' * 3 # aaa
print 'abcd'[2] # c
print len('asdf') # 4
其中第3种用法在C里是无效的。
slicing总是从左到右的,且都是左闭右开区间,因此[-2:]是最后两个字符。

8. 字符串方法分类
判断类
* isalnum()/isalpha()/isdigit()/islower()/isspace()/istitle()/isupper()

查找类
* endswith/startswith(s[,star[,end]]) # 返回bool型
* find/rfind/count(sub[,start[,end]])

变换
* expandtabs([tabsize]) # tabsize默认为8
* replace(old,new[,count]) # 替换所有。如果有count, 则只替换前count个
* ljust/rjust(width[,fillchar])
* lower()/upper()/capitalize()/swapcase()/title()
* lstrip([chars])/rstrip([chars])/strip([chars])

Token处理类
* partition/rpartition(sep) # 从第一次/最后一次出现处分开 e.g 'abc!=12'.partition('!=') returns ('abc','!=','12')
* split/rsplit(sep[,maxsplit]) # 'a--b---c'进行左/右split的结果不一样. 默认是strip后用连续空格隔开
* join(seq) # e.g '-'.join(['a','b','c']) returns 'a-b-c'

8. 字符串格式化
格式化运算符为%,适用于str和unicode,格式为format % values。当要求单参数时values必须是非元组对象,否则
values必须是一个元组(个数和format的需要保持一致),或一个映射(如字典)。例:
print '%(language)s has %(#)03d quote types.' % \
{'language': "Python", "#": 2}


9. 序列操作
参考:Library Reference的3.6节.
python有六种序列类型:str, unicode, list, tuple, buffer, xrange.
大多数序列都有以下操作:x in s, x not in s, s+t, s*n, n*s, s[i], s[i:j], s[i:j:k], len(s), min(s), max(s). i,j,n是整数。
注意乘法(重复操作)是浅拷贝,因此lists=[[]]*3;lists[0].append(3)后得到的是[[3],[3],[3]].
str的in/not in操作可以用来作模式匹配,而不仅仅用来查找单个字符。

10. 列表
列表(lists)是最常用的序列类型,它的各个元素不必有相同的类型。
列表是可变的,甚至可以对它的slice赋值。一些经典的例子。
>>> # Replace some items:
... a[0:2] = [1, 12]
>>> a
[1, 12, 123, 1234]
>>> # Remove some:
... a[0:2] = []
>>> a
[123, 1234]
>>> # Insert some:
... a[1:1] = ['bletch', 'xyzzy']
>>> a
[123, 'bletch', 'xyzzy', 1234]
>>> # Insert (a copy of) itself at the beginning
>>> a[:0] = a
>>> a
[123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]
>>> # Clear the list: replace all items with an empty list
>>> a[:] = []
>>> a
[]

11. 基本控制流
注意python是靠的缩进而不是begin/end或者{}来指定的语句块。语句块至少要有一条语句,如果实在不需要的话用pass
* while语句
while b > 0:
b--

* if-elif-else语句
注意,没有C中的switch。
if x < y =" -x" x ="="" y =" 0" y =" x

* for语句
是在一个序列中迭代。
a = ['cat', 'dog', 'bird']
for x in a:
print x, len(x)
注意在迭代的时候修改list很不安全,这时可以迭代它的一个备份,如:

>>> for x in a[:]: # make a slice copy of the entire list
... if len(x) > 6: a.insert(0, x)
...
>>> a
['defenestrate', 'cat', 'window', 'defenestrate']

如果要迭代下标,经常用range函数:
for i in range(len(a)):
print i, a[i]

* break和continue
break和continue的用法一样,但是从break退出和自然推出(for的元素迭代完毕; while的条件为假)是
不一样的。自然退出将执行else语句,这里是一个很好的例子:
for n in range(2, 10):
for x in range(2, n):
if n % x == 0:
print n, 'equals', x, '*', n/x
break
else:
# loop fell through without finding a factor
print n, 'is a prime number'

No comments :

Post a Comment