确保用户输入名字:
name=raw_input('enter your name: ')
while not name:
name=raw_input('enter your name: ')
print 'hello,%s'%name
空格也会被判断为名字:可以将while not name 改为while not name or name.isspace() 或者while not name.strip()
name=raw_input('enter your name: ')
while not name.strip():
name=raw_input('enter your name: ')
print 'hello,%s'%name
5.5.2 while语句可以用来在任何条件为真的情况下重复执行一个代码块,for 循环,例如为一个集合的每个元素都执行一个代码块
names=['my','name','is','yin','ya','liang']
for test in names:
print test
range 包含下限0 不包含上限
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for i in range(10):
print i
5.5.3 循环遍历字典元素
d={'x':'1','y':'2','z':'3'}
for test in d:
print test,'corresponds to',d[test]
y corresponds to 2
x corresponds to 1
z corresponds to 3
d={'x':'1','y':'2','z':'3'}
for test,value in d.items():
print test,'corresponds to',value
y corresponds to 2
x corresponds to 1
z corresponds to 3
5.5.4 一些迭代工具
1、并行迭代 程序可以同时迭代两个序列
name=['age','beth','george','damon']
ages=[12,45,32,102]
for i in range (len(name)):
print name[i],'is', ages[i],'years old'
i是循环索引的标准变量名
zip函数可以用来并行迭代,可以把两个序列‘’压缩‘’在一起,然后返回一个元组的值
name=['age','beth','george','damon']
ages=[12,45,32,102]
zip(name,ages)
for name,age in zip(name,ages):
print name,'is',age,'years old'
打印zip(name,ages)
[('age', 12), ('beth', 45), ('george', 32), ('damon', 102)]
2 编号迭代
一个字符串列表中替换所有包含'xxx'的字符串
name=['wang','zhang','li','zhao']
for string in name:
if 'wang' in string:
index = name.index(string)
name[index]= '[sun]'
print name
更改的版本如下:
name=['wang','zhang','li','zhao']
index=0
for string in name:
if 'wang' in string:
name[index]= '[sun]'
index += 1
print name
还有一种方法使用enumerate模块
name=['wang','zhang','li','zhao']
for index, string in enumerate(name):
if 'wang' in string:
name[index]='[sun]'
print name
3、反转和排序迭代
>>> sorted([5,3,7,89,4,6,5,33,56,7,4])
[3, 4, 4, 5, 5, 6, 7, 7, 33, 56, 89]
>>> list(reversed('hello,world!'))
['!', 'd', 'l', 'r', 'o', 'w', ',', 'o', 'l', 'l', 'e', 'h']
>>> ''.join(reversed('hello,world!'))
'!dlrow,olleh'
5.5.5 跳出循环
1、break
跳出循环可以使用break
>>> for n in range(99,0,-1):
a=sqrt(n)
if a==int(a):
print n
break
81
2 continue 会让当前的迭代结束,跳刀下一轮循环的开始,也就是 : 跳出剩余的循环体,但是不结束循环
3、while True/break
>>> while True:
world=raw_input('enter your name:')
if not world:break
print 'your name is ',world
enter your name:test
your name is test
enter your name:
5.5.6 循环中的else子句
for n in range(99,81,-1):
a=sqrt(n)
if a==int(a):
print n
break
else:
print 'Didn't find it'
5.6列表推导式-轻量级循环
>>> [x*x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [x*x for x in range(10) if x % 3==0]
[0, 9, 36, 81]
>>> [(x,y) for x in range(3) for y in range(3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
5.7 三人行 pass del exec
5.7.1 什么都没有发生
if name =="palph auldus melish":
print 'welcome!'
elif name =='enid':
#还没完
pass
elif name=='bill gates':
print 'access deny'
5.7.2 使用del删除
>>> a={'test':42}
>>> b=a
>>> a
{'test': 42}
>>> b
{'test': 42}
>>> a=None
>>> a
>>> b
{'test': 42}
当把b也置为None时,字典就“飘”在了内存里,python解释器会直接删除那个字典,成为垃圾收集,另外一个方法就是使用del语句,它不仅会移除对象的引用,也会移除那个名字本身
>>> a=1
>>> del a
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
python中是无法删除值的
5.7.3 使用exec和eval执行和求值字符串
有时候可以能需要动态的创造python代码,将其作为语句执行或作为表达式计算
下面学习执行存储在字符串中的python代码,这样做会有潜在的安全漏洞
>>> exec "print 'hello world'"
hello world
很多情况下给它提供一个命名空间,或者称为作用域
>>> from math import sqrt
>>> exec "sqrt = 1"
>>> sqrt(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
命名空间或称为作用域(scope)
>>> from math import sqrt
>>> scope={}
>>> exec 'sqrt=1' in scope
>>> sqrt(4)
2.0
2 eval
exec语句会执行一系列的pythone语句,而eval会计算python表达式(以字符串形式书写),并且返回结果值
>>> eval(raw_input("enter you number:"))
enter you number:2*8
16
eval(raw_input(...))相当于input(...)
和exec一样eval也可以使用命名空间,提供两个命名空间,全局和局部,全局必须是字典,局部的可以是任何形式的映射
>>> scope={}
>>> scope['x']=2
>>> scope['y']=3
>>> scope={}
>>> exec 'x=2' in scope
>>> eval('x*x',scope)
4
导入 可以使用import ... as ... 语句进行函数的局部重命名