04-条件、循环和其它语句

赋值魔法

1.序列解包(sequence unpacking)

序列解包也称递归解包:将多个值的序列解开,然后放到变量的序列中,只需要一个表达式就可以完成同时为多个变量赋值的操作。

# 1>给多个变量一次赋值
>>> x,y,z = 1,2,3
>>> print x,y,z
1 2 3  
# 2>交换变量的值--相比C语言真的方便不要太多吧
>>> x,y=y,x
>>> print x,y,z
2 1 3

## 上面的这些操作方法就是赋值的序列解包操作
# 3.更形象的表示方法好比下面这个案例:
>>> values =1,2,3
>>> values
(1,2,3)
>>> x,y,z=values
>>> x
1

**总结:**Python 赋值语句序列解包,必须保证解包的序列元素数量和=等号左边的变量数量相等,如果不一致python在赋值时会引发错误异常。

2.链式赋值(chained assignment)

将一个值赋值给多个变量的捷径。

x=y=1

3.增量赋值(augmented assigment)

一般不写成这种形式x=x+1

>>> x = 2
>>> x += 1
>>> x *=2
>>> x
6

对于其他数据类型也适用

>>> fnord = 'foo'
>>> fnord += 'bar'
>>> fnord *=2
>>> fnord
'foobarfoobar'

条件和条件语句

布尔变量

真值(布尔值)
下面的值在作为布尔表达式的时候,会被解释器看做假(false).

False None 0 “” () [] {}

条件执行和if语句

name =raw_input(‘What’s your name?’)
if name.endswith(‘Gumby’)
print ‘Hello,Mr.Gumby’
if语句可以试下条件执行

else子句

elif子句

嵌套代码块

更复杂的条件

1.比较运算符
2.相等运算符
3.is:同一运算符

is运算符是判定同一性而不是相等性。

>>>x =[1,2,3]
>>>y= [2,4]
>>> x is not y
True
>>> del x[2]
>>> y[1] = 1
>>> y.reverse()
>>> x==y
True
>>> x is y
False

总结:使用==运算符来断定两个对象是否相等,使用is断定两者是否等同(同一对象)。

4.in:成员资格运算符
name = raw_input("What's your name?")
if 's' in name:
    print "'s' is in your name!"
5.字符串和序列比较

可以按照字母顺序排列进行比较

>>>'a' < 'b'hc
True
6.布尔运算符

or和and运算符

7.断言

用伪代码实现有点类似:

if not condition:

crash program
其实这个用if else语句也可以实现

age =-1
assert 0<age<100,'the augument must be realistic'

循环

1.while循环

x = 1
while x<10:
    print x
    x += 1

2.for循环

  • 如果能使用for循环,就尽量不用while循环。
#for循环遍历列表
words = ['this','is','an','ex','parrot']
for word in words:
    print word

范围函数

>>> range(0,3)
[0, 1, 2]
>>> range(3)
[0, 1, 2]

3.循环遍历字典元素

d = {'x': 1,'y': 2,'z': 3}
for key in d:
    print key,d[key]

键-值

for key,value in d.items():
    print key,value

4.一些迭代工具

1.并行迭代
>>> names=['anne','beth','george','damon']
>>> ages=[12,45,32,102]
>>> for i in range(len(names)):
>>>    print names[i],'is',ages[i]
anne is 12
beth is 45
george is 32
damon is 102

zip压缩

>>> zip(names,ages)
[('anne', 12), ('beth', 45), ('george', 32), ('damon', 102)]

# 产生坐标
>>> zip(range(5),xrange(10000))
[(0,0),(1,1),(2,2),(3,3),(4,4)]
2.按索引迭代
>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
>>> for index, name in enumerate(L):
>>> index, '-', name
0 - Adam
1 - Lisa
2 - Bart
3 - Paul

enumerate()函数把[‘Adam’, ‘Lisa’, ‘Bart’, ‘Paul’]变为[(0, ‘Adam’), (1, ‘Lisa’), (2, ‘Bart’), (3, ‘Paul’)]因此,迭代的每一个元素实际上是一个tuple:

for t in enumerate(L):
index = t[0]
name = t[1]
print index, ‘-‘, name

如果我们知道每个tuple元素都包含两个元素,for循环又可以进一步简写为:

for index, name in enumerate(L):
print index, ‘-‘, name

这样不但代码更简单,而且还少了两条赋值语句。

3.翻转和排序迭代

sorted方法返回列表:

sorted([2,3,1,4])
[1, 2, 3, 4]

reversed方法返回一个可迭代对象:

reversed([2,3,1,4])
输出:<listreverseiterator at 0xb1afda0>

5.跳出循环

1.break
for i in range(0,10):
    if i < 8:
        print 'i=',i
    else:
        break

2.continue

跳过剩余的循环体,但是不结束循环.

>>> for letter in 'Python':     # 第一个实例
>>>   if letter == 'h':
>>>      continue
>>> '当前字母 :', letter
当前字母 : P
当前字母 : y
当前字母 : t
当前字母 : o
当前字母 : n
3.while True/break习语
>>> while True:
>>>     word = raw_input('please enter a word:')
>>>     if not word: break
>>>     'The word was '+ word
4.循环中的else子句

在循环中增加一个else子句-它仅在没有调用break时执行

from math import sqrt
for n in range(88,81,-1):
    root =sqrt(n)
    if root == int(root):
        print n
        break
else:
    print 'Don\'t find it!'

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)]

7.三人行

  • pass语句什么都不做,可以作为占位符使用。
  • del语句用来删除变量,或者数据结构的一部分,但是不能删除值。
  • exec语句用于执行Python程序相同的方法来执行字符串。
  • eval函数对写在字符串中的表达式进行计算并且返回结束。
pass

python中空代码块是非法的,正确的使用方法是在语句中加上pass。

name ='bob1'
if name == 'bob':
    pass
else:
    print 'You are wrong!'
del

del会删除那些不在使用的对象

>>> x=1
>>> del x
>>> x
Traceback (most recent call last):
  File "<ipython-input-23-401b30e3b8b5>", line 1, in <module>
    x
NameError: name 'x' is not defined

删除的只是名称,而不是列表本身(值)。在Python中没有办法删除值(也不需要过多考虑删除值的问题,因为在某个值不在使用的时候,Python解释器会负责内存的回收)

exec

exec语句用来执行储存在字符串或文件中的Python语句。例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句,下面是一个简单的例子。

>>> exec 'print "Hello World"'
Hello World

这里有个scope(命名空间,作用域)的概念,为了不破坏现在的scope,可以新建一个scope(一个字典)执行exec(Javascript没有此功能):

>>> scope = {}
>>> exec("a = 4", scope)
>>> a
2
>>> scope['a']
4

>>> scope.keys()
dict_keys(['a', '__builtins__'])

builtins包含了所有的内建函数和值;

而普通的{}不会包含builtins

>>> a = {}
>>> a.keys()
dict_keys([])
eval

同exec一样,eval也可以使用命名空间:

>>> result = eval('2+3')
>>> result
5
>>> scope={}
>>> scope['a'] = 3
>>> scope['b'] = 4
>>> result = eval('a+b',scope)
>>> result
7
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值