1、is:同一性运算符
>>>x=y=[1,2,3]
>>>z=[1,2,3]
>>>x==y
True
>>>x==z
True
>>>x is y
True
>>>x is z
False
通过以上例子可得is运算符是判定同一性而不是相等性的。变量x和y都被绑定在同一个列表上,而变量z被绑定在另一个焗油相同数值和顺序的列表上。它们的值可能相等,但是却不是同一个对象。
总结:使用==判读两个对象是否相等,使用is判断两个对象是否等同。
2、布尔运算符
and运算符就是所谓的布尔运算符。它连接两个布尔值,并且在两者都为真时返回真,否则返回假。
与它同类的还有两个运算符or和not
3、条件表达式
a if b else c表示b为真则返回a,否则返回c
4、断言
assert相当于语句:
if not condition
crash program(程序崩溃)
你可以试试以语句:
>>> age=-1
>>> assert 0<age<100, 'The age must be realistic'
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError: The age must be realistic
5、while循环
name=''
while not name:
name = raw_input('please enter your name ')
print 'Hello,%s!' %name
运行该程序,如果直接输入一个空格,程序会接受这个名字,因为包括一个空格的字符并不是空的,我们可以把while not name改为while not name or name.isspace()或者改为while not name.strip()
6、for循环
words = ['this', 'is', 'an', 'ex', 'parrot']
for word in words:
print word
for number in range(1,101):
print number
xrange函数类似于range,只是range一次创建整个序列,而xrange一次只创建一个数。
7、循环遍历字典元素
d = {'x':1,'y':2,'z':3}
for key in d:
print key,'corresponds to',d[key]
d = {'x':1,'y':2,'z':3}
for key,value in d.items():
print key,'corresponds to',value
d.items()将键-值对作为元组返回
8、一些迭代工具
(1)并行迭代
程序可以同时迭代两个序列,比如有下面两个列表:
names = ['ann','hjk','ddd']
ages=[12,13,19]
如果想要打印名字和对应的年龄,可以像下面这样做:
for i in range(len(names)):
print names[i], 'is' ,ages[i],'years old'
而内建的zip函数可以用来进行并行迭代,可以把两个序列压缩在一起,然后返回一个元组的列表
如:zip(names,ages)
zip可以应付不等长的序列,当最短的序列“用完”就会停止:
>>> zip(range(5),xrange(100))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
(2)编号迭代
有些时候想要迭代序列中的对象,同时还要获取当前对象的索引
例如在一个字符串列表中替换所有包含'xxx'的子字符串。
可以使用内建的enumerate函数:
for index,string in enumerate(strings):
if 'xxx' in string:
strings[index]= '[censored]'
这个函数可以提供索引的地方迭代索引-值对。
(3)翻转和排序迭代
>>> sorted([4,3,6,8,3])
[3, 3, 4, 6, 8]
>>> sorted('Hello,world!')
['!', ',', 'H', 'd', 'e', 'l', 'l', 'l', 'o', 'o', 'r', 'w']
>>> list(reversed("Hello,world!'))
File "<stdin>", line 1
list(reversed("Hello,world!'))
^
SyntaxError: EOL while scanning single-quoted string
>>> list(reversed('Hello,world!'))
['!', 'd', 'l', 'r', 'o', 'w', ',', 'o', 'l', 'l', 'e', 'H']
>>> ''.join(reversed('Hello,world!'))
'!dlrow,olleH'
reversed和sorted作用于任何序列或可迭代对象上,不是原地修改对象,而是返回翻转或排序后的版本
虽然sorted返回列表,reversed却返回一个更加不可思议的可迭代对象。不能直接对它使用索引,分片以及调用list方法,如果希望进行上述处理,可以使用list类型转换返回的对象。
9、跳出循环
(1)break
from math import sqrt
for n in range(99,0,-1):
root=sqrt(n)
if root==(int)root:
print n
break
range 的第三个参数-表示步长,如果是负数则表示反向迭代。
(2)continue
10、while True/break习语
while True:
word = raw_input('Please input a word: ')
if not word:break
print 'The word was '+ word
11、循环中的else语句
from math import sqrt
for n in range(99,81,-1):
root=sqrt(n)
if root==int(root):
print n
break
else:
print"didn't find it!"
12、列表推导式---轻量级循环
girls = ['alice','bernice','clarice']
boys= ['chris','arnold','bob']
letterGirls = {}
for girl in girls:
letterGirls.setdefault(girl[0],[]).append(girl)
print [b+'+'+g for b in boys for g in letterGirls[b[0]]]
这个程序创建了一个叫letterGirls的字典。
13、什么都没发生
pass相当于C语言的分号;
14、使用del删除
del不仅会移除一个对象的引用,也会移除那个名字本身。
>>> x=1
>>> del x
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'x' is not defined
看起来很简单,但有时理解起来有点难,例如下一个例子:
>>> x=["Hello","World"]
>>> y=x
>>> y[1]="python"
>>> x
['Hello', 'python']
会有人认为删除x后,y也消失了,但并非如此:
>>> del x
>>> y
['Hello', 'python']
x和y都指向了同一个列表,但是删除x并不影响y,原因就是删除的只是名称,而不是列表本身。
在python中是没有办法删除值的,python解释器会负责内存的回收。