程序由模块构成
模块由语句构成
语句由表达式构成
表达式建立并处理对象
语句 | 角色 | 例子 |
赋值 | 创建引用值 | a,b,c=’good’,’bad’,’ugly’ |
调用 | 执行函数 | log.write(“spam,ham/n”) |
打印对象 | print ‘the killer’,joke | |
if/elif/else | 选择动作 | if ‘python’ in text: print text |
for/else | 序列迭代 | for x in mylist: print x |
while/else | 一般循环 | while x>y: print x |
pass | 空占位符 | while True: pass |
break/continue | 循环跳跃 | while True: if not line:break |
try/except/finally | 捕捉异常 | try: action() except: print ‘action error’ |
raise | 触发异常 | raise endSearch,location |
import,from | 模块读取 | import sys from sys import stdin |
def,return,yield | 创建函数 | def f(a,b,c=1,*d): return a+b+c+d[0] def gen(n) for I in n,yield i*2 |
class | 创建对象 | class subclass(Superclass): staticdata=[] |
global | 命名空间空间 | def function(): global x,y x=’new’ |
del | 删除引用 | del data[k] |
exec | 执行代码字符串 | exec “import” +modname exec code in gdict,ldict |
assert | 调试检查 | assert x>y |
with/as | 环境管理器 | with open(‘data’) as myfile: process(myfile) |
eg:
while True:
reply=raw_input(‘Enter text:’)
if reply==’stop’:
break
try:
num=int(reply)
except:
print ‘Bad!’*8
else:
print int(reply)**2
print ‘Bye!’
解释:try关键字后面跟上我们尝试运行的代码块,再跟except部分,给异常处理
器代码,再接else部分,如果try部分没有异常,就执行这一部分代码,如
有异常发生就执行except部分代码
(1)赋值语句专门特性:
a、赋值对象建立专门引用值,赋值语句总是建立对象的引用值而不是拷
贝;
b、变量名会在首次赋值时被创建;
c、变量名在引用前必须先赋值;
d、隐式赋值语句:import、from、def、class、for、函数参数
(2)赋值语句的形式:
a、基本形式:spam=’spam’
b、元组及列表分解赋值:当“=”左边编写成元组或列表时,python会按照
位置把右边的对象和左边的目标从左到有想配对。
c、序列赋值语句:任何变量名的序列都可以赋值给任何值的序列,python会按照位置一次赋值一个元素
d、多重目标赋值:python赋值相同对象的引用值(最右边的对象)给左边所有的目标
e、增强赋值语句:例如:s+=2相当于s=s+2
(3)序列赋值:
a、高级序列赋值语句模式:可以在“=”两侧混合和匹配匹配序列类型,但左右两边元素的数目必须相等。若要通用,则需要使用分片的方法。
>>>string=’spam’
>>>a,b,c=string[0],string[1],string[2:]
>>>a,b,c=list(string[:2)+[string[2:]]
>>>(a,b),c=string[:2],string[2:]
b、赋值一系列整数给一组变量:
>>>red,green,blue=range(3)
>>>range(3)
[0,1,2]
(4)多目标赋值语句:
a、多目标赋值以及共享引用:
多目标赋值语句中,只有一个对象,由三个变量共享(全都指向内存内统一对象)在此需要注意对象的是否支持在原处的修改
(5)增强赋值语句:
a、增强赋值语句从C借鉴而来:
x+=y | x&=y | x-=y | x|=y |
x*=y | x^=y | x/=y | x>>=y |
x%=y | x<<=y | x**=y | x//=y(floor除法) |
b、增强赋值语句的一些优点:
左侧只需计算一次,执行更快;
优化技术选择,对于支持原处修改的对象而言,增强形式会自动执行原处的修改运算,而不是复制。
c、增强赋值与共享引用:
对列表而言,“+=”隐含了对原处做修改的意思,“+”总是生成新的对象
(6)表达式语句:
a、在python中,可以使用表达式作为语句,但表达式结果不会储存,只有当表达式工作并作为附加的效果时才有意义。通常有两种情况下表达式用作语句:调用函数和方 法、在交互模式下打印值
b、表达式语句通常用于执行可于原处修改列表的列表方法:
>>>L=[1,2]
>>>L.append(3) #这是一条表达式语句,返回值为None
>>>L
[1,2,3]
(7)打印语句:
a、重定向输出流:
print x
等价于:
import sys
sys.stdout.write(str(x)+’/n’)
因为有可能把sys.stdout重新复制给标准输出流意外的东西,这样就可以有一种方法让print语句将文字传送到其他地方:
>>>import sys
>>>sys.stdout=open(‘log.txt’,’w’)
…
print x,y,z
b、print file 扩展: 重定向输出流有一个问题:没有直接的方式可以保存原始的输出流。在打印到文件后可以切换回来。因为sys.stdout只是一个普通文件对象,一个例子如下:
>>>import sys
>>>temp=sys.stdout
>>>sys.stdout=open(‘log.txt’,’a’)
>>>print ‘spam’
>>>print 1,2,3
>>>sys.stdout.close()
>>>sys.stdout=temp
>>>print open(‘log.txt’).read()
spam
1,2,3
这样的操作显得复杂,于是增加了print的扩展功能,当print以>>开始,后面再跟输出的文件对象或其他对象时,该print语句可以将文字传给该对象的write方法。
>>>log=open(‘log.txt’,’a’)
>>>print >> log,’x’.’y’,’z’
这种print扩展形式通常把错误讯息打印到标准错误流sys.stderr,例如:
>>>import sys
>>>sys.stderr.write(‘Bad!’+’/n’)
Bad!
>>>print >>sys.stderr,’Bad!’
Bad!
if <test1>:
<statements1>
elif <test2>:
<statements2>
else:
<statements3>
(1)语句是逐个运行的;
(2)块和语句的边界会自动被检查;
(3)复合语句=首行+“:”+缩进语句;
(4)空白行、空格以及注释通常会被忽略;
(5)文档字符串(docstring)会被忽略,但会保存并由工具显示;
(6)代码块分隔符:python以行缩进检测块的边界
(7)语句的分隔符:
a、如果使用语法括号对,语句可以横跨数行;
b、如果语句以反斜线结尾,可以横跨数行;
c、三重引号字符串常量可以横跨数行;
d、分号可以分隔在同一行的多条语句
(8)真值测试:
a、任何非零数字或非空对象都为真;
b、数字零、空白对象、None都被认作是假;
c、比较和相等测试会递归地应用在数据结构中;
d、比较和相等测试会返回真或假的操作对象;
e、布尔and和or会返回真或假的操作对象
(9)布尔运算:
and运算:x and y; 若x、y均为真就返回真
or运算:x or y; 若x或y为真就返回真
not运算:not x; 若x为假就返回真
(10)if/else三元表达式:(只有当组成成分及其简单才用,否则写完整的if/else表达式)
A=Y if X else Z
等价于:
if X:
A=Y
else:
A=Z
(1)一般格式:
while <test>:
<statements1>
else:
<statements2>
2、break、continue、pass、循环else
(1)break
跳出最近所在的循环(跳过整个循环语句)
continue
跳到最近所在循环的开头处(来到循环的首行)
pass
什么也不做,只是空占位语句
循环else块
只有当循环正常离开时才会执行(也就是没有碰到break语句)
(2)一般的循环格式:
a、加入break和continue语句后,while循环的一般格式为:
while <test1>:
<statements1>
if <test2>:break
if <test3>:continue
else:
<statements2>
break,continue语句可以出现在while(或for)循环主体的任何地方,但通常会进一步嵌在if语句中,根据相应的条件采取相应的操作
b、pass:
pass语句是空占位语句,当语法需要没有任何实用的语句时,就可以实用这条语句;
c、continue/break语句:
eg:
x=10
while x:
x-=1
if x %2!=0:continue
print x
for循环是一个通用的序列迭代器:可以遍历任何有序的序列对象内的元素;可用于字符串、列表、元组、其他内置可迭代对象以及通过类所创建的新对象
(1)一般格式:
for <target> in <object>:
<statements1>
else:
<statements2>
for语句也支持一个选用的else块,如果循环离开时没有碰到break语句,就会执行(也就是所有元素被访问完后)
for循环的完整格式:
for <target> in <object>:
<statements1>
if <test1>:continue
if <test2>:break
else:
<statements2>
迭代工具包括有:for循环,列表解析,in成员测试,map内置函数等
(1)文件迭代器:
a、readline()方法可以从一个文件中读取一行,每调就会前进到下一行,到达文件末尾时返回空字符串
b、next()方法也有类似功能
c、读取文本文件的最佳方式,利用for循环,例如:
for line in open(‘文件’):
print line.upper
(2)其他内置类型迭代器:
a、列表迭代器:当for循环开始时,会通过它传递给iter()内置函数,以便从迭代对象获取一个迭代器,返回的对象含有需要的next()方法
>>>L=[1,2,3]
>>>I=iter(L)
>>>I.next()
1
b、字典迭代器:会自动返回一个键
>>>D={‘a’:1,‘b’:2,’c’:3}
>>>for key in D:
print key,D[key]
…
a 1
b 2
c 3
c、其他迭代环境:(文件‘script1.py’事先已经写好)
in成员关系测试:
>>>uppers=[line.upper() for line in open(‘script1.py’)]
map()内置函数:
>>>map(str.upper(),open(‘script1.py’))
其他内置函数:
>>>L=[1,2,3,4]
>>>sorted(L)
>>>sum(L)
>>>any([‘spam’,’’,’ni’])
True
>>>all([‘spam’,’’,’ni’])
False
5、编写循环的技巧: (1)range函数
range函数传入一个参数时,产生从零算起的整数列表;
range函数传入两个参数时,第一个参数视为下边界;
range函数传入三个参数时,第三个参数提供步进值;
range函数常用于for循环中;
range函数加上步进参数常用来实现非完备遍历;
range函数常用于在循环遍历列表时对其进行修改:
eg:>>>L=[1,2,3,4,5]
>>>for i inrange(len(L)):
L[i]+=1
>>>L
[2,3,4,5,6]
(2)并行遍历:zip()和map()函数:
zip()函数会取得一个或多个序列作为参数,返回值为元组的列表,将这些序列中的并排元素配成对;
map()函数也可以把序列的元素配对,只是参数长度不同时会为较短的序列用None补齐;
a、利用zip()构造字典:
>>>keys=[‘spam’,‘eggs’,’toast’]
>>>vals=[1,2,3]
>>>zip(keys,vals)
>>>D={}
>>>for (k,v) inzip(keys,vals):
D[k]=v
>>>D
{‘spam’:1,’eggs’:2,’toast’:3}
当然我们也可以跳过for循环,利用dic()函数构造字典:
>>>D1=dic(zip(keys,vals))
(3)产生偏移和元素:enumerate()
enumerate()函数返回一个生程器对象:这种对象支持迭代协议,这个对象有一个next()方法,每次遍历列表都会返回一个(index,value)的元组
eg:>>>S=’spam’
>>>E=enumerate(S)
>>>E.next()
(0,’s’)
(1)列表解析基础:从语法上讲,列表解析就是对集合中的每一个元素进行某种运算
eg:>>>L=[1,2,3,4]
>>>L=[x+10 for x in L]
>>>L
[11,12,13,14]
(2)列表解析都可以用for循环来完成
形式 | 角色 |
#注释 | 文件中的文档 |
dir函数 | 对象中可用属性列表 |
文档字符串:_ _doc_ _ | 附加在对象上的文件中的文档 |
PyDoc:help函数 | 对象的交互帮助 |
PyDoc:HTML报表 | 浏览器中的模块文档 |
标准手册 | 正式的语言和库说明 |
网站资源 | 在线教程和例子 |
出版书籍 | 商业参考书籍 |
python支持可自动附加在对象上的文档,而且在运行时可以保存查看。从语法上看,这类注释写成字符串,放在模块文件、函数以及类语句的顶端,就在任何可执行代码 前,python会自动封装这个字符串,成为文档字符串,使其成为相应对象的_ _doc_ _属性。
eg:考虑下面文件docstrings.py
‘’’
Module documentation
Words Go Here
‘’‘
spam=40
def square(x):
‘’’
function documentation
can we have your liver then?
‘’’
return x**2
class employee:
‘class documentation’
pass
print square(4)
print square._ _doc_ _
执行命令:
>>>importdocstrings
16
function documentation
can we have your liverthen?
>>>printdocstrings._ _doc_ _
Module documentation
Words Go Here
>>>print docstrings.employee._ _doc_ _
class documentation
要从模块中类的方法函数的文档字符串,可以路径访问:module.class. method._ _doc_ _
PyDoc提供GUI接口将报表通过HTML网页格式来呈现:linux系统下打开GUI的方法如下:
>>>import pydoc
>>>pydoc.gui()
在网站上可以获得标准库手册等资源。
新闻热点
疑难解答