附录A
pwd
'/Users/momo/code/python/learnpython'
ls
100odd.py fab.py leapyear.py
1to100.py fib_401.py odd.py
3.30_primenumber.py fiverings.py parallel.py
MCMC.py get_counts.ipynb printlist.py
Narcissus_number.py guess8.py redyellowblue.py
Untitled.ipynb guess8_1.py sanyuanfu.py
__init__.py guess8_2.py scoreABCD.py
binary_decima.py guessrandom.py square.py
color_square.py hanoi.py stepstairs.py
countseconds.py hellowho.py 打飞机框架.txt
decima_bianry.py ipython_1.py
%run odd.py #会在同一个进程中执行指定的文件中的代码
------------奇偶数------------
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]
a=4;b=5
isinstance(a,(bool,float)) #可以检查多种数据类型,用元组来指定
False
a='abcd'
getattr(a,'split') #访问属性和方法,还有相关的hasattr and setattr
<function str.split>
迭代器(看到这个问题,意外补充的内容)
迭代器就是有一个 next() 方法的对象,而不是通过索引来计数。当你或是一个循环机制(例如 for 语句)需要下一个项时,
调用迭代器的 next() 方法就可以获得它。条目全部取出后,会引发一个 StopIteration 异常,这并不表示错误发生,
只是告诉外部调用者,迭代完成.
不过,迭代器也有一些限制。例如你不能向后移动,不能回到开始,也不能复制一个迭代器.如果你要再次(或者是同时)迭代同个对象,
你只能去创建另一个迭代器对象。不过,这并不糟糕,因为还有其他的工具来帮助你使用迭代器。
reversed() 内建函数将返回一个反序访问的迭代器。enumerate() 内建函数同样也返回迭代器.另外两个新的内建函数,
any() 和 all() ,在 Python 2.5 中新增,如果迭代器中某个/所有条目的值都为布尔真时,则它们返回值为真。
本章先前部分展示了如何在 for 循环中通过索引或是可迭代对象来遍历条目。
同时 Python 还提供了一整个 itertools 模块,它包含各种有用的迭代器.
使用迭代器
- 序列
- try-except语句来处理导常
- 字典
- 文件
可变对象和迭代器
如何创建迭代器
- 序列
#面对序列:列表,元组,字符串
m=iter('abcd')
tuple1=(1,'dkf',3,'adsf')
n=iter(tuple1)
print m.next()
print m.next()
print m.next()
print m.next()
print n.next()
print n.next()
print n.next()
print n.next()
a
b
c
d
1
dkf
adf
adsf
如果这是一个实际应用程序,那么需要把代码放在一个 try-except 块中。序列现在会自动地产生它们自己的迭代器,所以一个 for 循环:
#这里不是很理解!!!
#示例:
for i in seq:
do_something_to(i)
#实际工作方式:
fetch = iter(seq)
while True:
try:
i = fetch.next()
except Stoplteration:
break
do_something_to(i)
- try-except语句来处理导常
它如何工作
我们把所有可能引发错误的语句放在try块中,然后在except从句/块中处理所有的错误和异常。except从句可以专门处理单一的错误或异常,或者一组包括在圆括号内的错误/异常。如果没有给出错误或异常的名称,它会处理 所有的 错误和异常。对于每个try从句,至少都有一个相关联的except从句。
如果某个错误或异常没有被处理,默认的Python处理器就会被调用。它会终止程序的运行,并且打印一个消息,我们已经看到了这样的处理。
你还可以让try..catch块关联上一个else从句。当没有异常发生的时候,else从句将被执行。
#如果你在写python程序时遇到异常后想进行如下处理的话,一般用try来处理异常,假设有下面的一段程序:
try:
语句1
语句2
.
.
语句N
except .........:
do something .......
但是你并不知道”语句1至语句N”在执行会出什么样的异常,但你还要做异常处理,且想把出现的异常打印出来,并不停止程序的运行,所以在”except ……”这句应怎样来写呢?
这里总结了一3个方法:
#方法一:捕获所有异常
try:
a=b
b=c
except Excepiton,e:
print Exception,":",e
#方法二:采用traceback模块查看异常
#引入PYTHON中的traceback模块,跟踪错误
import traceback
try:
a=b
b=c
except:
traceback.print_exc()
#方法三:采用sys模块查看异常
import sys
try:
a=b
b=c
except:
info=sys.exc_info()
print info[0],":",info[1]
但是,如果你还想把这些异常保存到一个日志文件中,来分析这些异常,那么请看下面的方法:
把 traceback.print_exc() 打印在屏幕上的信息保存到一个文本文件中
import traceback
try:
a=b
b=c
except:
f=open("c:log.txt",'a')
traceback.print_exc(file=f)
f.flush()
f.close()
- 字典
字典和文件是另外两个可迭代的 Python 数据类型。字典的迭代器会遍历它的键(keys).
语句 for eachKey in myDict.keys() 可以缩写为 for eachKey in myDict ,例如:
legends = {('Poe','author'): (1809,1849,1976),
('Gaudi','architect'): (1852,1906,1987)}
for eachLegend in legends:
print 'Name:%s Occupation:%s'%eachLegend
print 'Birth:%s Death:%s Album:%s'%legends[eachLegend]
Name:Poe Occupation:author
Birth:1809 Death:1849 Album:1976
Name:Gaudi Occupation:architect
Birth:1852 Death:1906 Album:1987
另外,Python 还引进了三个新的内建字典方法来定义迭代:
myDict.iterkeys() (通过 keys 迭代),myDict.itervalues() (通过 values 迭代),以及 myDicit.iteritems() (通过 key/value 对来迭代)
注意,in操作符也可以用于检查字典的 key 是否存在,之前的布尔表达式myDict.has_key(anyKey) 可以被简写为 anyKey in myDict。
- 文件
文件对象生成的迭代器会自动调用 readline() 方法。
这样循环就可以访问文本文件的所有行。程序员可以使用 更简单的 for eachLine in myFile 替换 for eachLine in myFile.readlines():
myFile=open(‘config-win.txt’)
for eachLine in myFile:
print eachLine
- 如何创建迭代器
对一个对象调用 iter() 就可以得到它的迭代器。它的语法如下:
iter(obj)
iter(func,sentinel)
如果传递一个参数给 iter() ,它会检查你传递的是不是一个序列,如果是,那么很简单:
根据索引从 0 一直迭代到序列结束。另一个创建迭代器的方法是使用类,将在第 13 章详细介绍,一个实现了 iter() 和 next() 方法的类可以作为迭代器使用.
如果是传递两个参数给 iter() ,它会重复地调用 func ,直到迭代器的下个值等于sentinel。
#书上内容
def isiterable(obj):
try:
iter(obj)
return True
except TypeError:
return False