python基础之条件、循环和其他语句

1.print和import的更多信息

(1)使用逗号输出

前面我们已经接触过python的print来打印表达式,不管是字符还是其他类型,在打印前都将自动转换为字符串。但事实上使用多个表达式也是可以的,只要将它们用逗号隔开就好:

>>> print 'Age:',42
Age: 42

注意:print参数并不能像我们预计的那样构成元组:

>>> 1,2,3
(1, 2, 3)
>>> print 1,2,3
1 2 3
>>> print (1,2,3)
(1, 2, 3)

(2)把某件事作为另一件事导入

从模块导入函数时通常使用:

import module

或者

from module import function

或者

from module import somefunction,anotherfunction,yetaotherfunction

或者

from module import *

只有确定自己想要从给定的模块导入所有功能时候,才应该使用最后一个版本。但是如果两个模块都有open函数怎么办,只需要使用第一种方式导入,然后像这样使用函数:

module1.open(...)

module2.open(...)

但还有另外的选择:可以在语句末尾增加一个as子句,这个子句后给出想要使用的别名,例如为整个模块提供别名:

>>> import math as footbar
>>> footbar.sqrt(4)
2.0

或者为函数提供别名:

>>> from math import sqrt as footbar
>>> footbar(9)
3.0


2.赋值魔法

就算是不起眼的赋值也有一些特殊的技巧

(1)序列解包

赋值语句的例子已经讲过不少,其中包括对变量和数据结构成员的赋值,但是赋值的方法不止这些,例如,多个数赋值操作同时经行:

>>> x,y,z=1,2,3
>>> print x,y,z
1 2 3

用它交换多个变量也是没有问题的:

>>> x,y=y,x
>>> print x,y,z
2 1 3

事实上,我们这里所做的事情叫做序列解包(sequence unpacking)或者递归解包——将多个值得序列解开,然后放到变量的序列中。更形象一点就是:

>>> values=1,2,3
>>> values
(1, 2, 3)
>>> x,y,z=values
>>> x
1

当函数或者方法返回元组(或者其他序列或课迭代对象)时,这个特性尤其有作用。假设需要获取(和删除)字典中的任意一对键值,可以使用popitem方法,并且返回一对元组,那么这对元组可以直接赋值到两个变量中:

>>> a={'name':'a','num':'123'}
>>> key,value=a.popitem()
>>> key
'num'
>>> value
'123'

注意:所解包的序列中的元素数量必须和放置在赋值符号=左边的变量数量完全一致,否则python会在赋值时引发异常。

(2)链式赋值

链式赋值是将同一个值赋给多个变量的捷径。他看起来有些像上节中的并行赋值,不过这里只是处理一个值:

x=y=somefunction()  <==> x=somefunction

但是注意上面的语句和下面的语句是不一样的:

x=somefunction()

y=somefunction()


(3)增量赋值

这里没有将表达式写成x=x+1,而是将表达式运算符放置在赋值运算符=的左边,写成x+=1.这种写法叫做增量赋值,对于所有标准运算符都使用:

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

对于其他数据类型也使用(前提是二元运算符本身使用于这些数据类型即可):

>>> a='a'
>>> a+='b'
>>> a*=2
>>> a
'abab'


3.条件语句

(1)布尔变量的作用

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

false   None  0  ""  ()  {}  []

其他的一切值都被解释为真,包括特殊值True。

(2)条件执行和if语句

我们先来看一个脚本:

name=raw_input('What is your name?')
if name.find('a') != -1:
    print 'Hello,a'

这就是if语句,它可以实现条件执行,即如果条件(在if和冒号之间的表达式)判断结果为真,则会执行后面的语句块,如果为假则不会执行。

(3)else子句

else只能作为if的子句,如果if中的语句块没有执行,则执行else中的语句块:

name=raw_input('What is your name?')
if name.find('a') != -1:
        print 'Hello,a'
else:
        print 'Sorry'

(4)elif子句

如果要检查多个条件可以使用elif语句,是else if的缩写:

num=input('Enter a number')

if num>0:

  print 1

elif num<0

  print -1

else

  print 0

(5)嵌套代码块

if语句里面可以嵌套if语句。


4.更复杂的条件

上面我们说了条件语句,下面让我们回到条件,因为它才是条件语句的执行时最有趣的部分:

(1)比较运算符

在条件中最基本的就是比较运算符,>、<>=<=!=

(2)is:同一运算符

这个运算符看起来和==一样,实际上不相同,is判断的是同一性而不是相等性:

>>> x=y=[1,2,3]
>>> z=[1,2,3]
>>> x==y
True
>>> x==z
True
>>> x is y
True
>>> x is z
False

(3)布尔运算符

布尔运算符有and,or,not。当and链接两者都为真时候返回真,否则都为假。

(4)assert断言

assert语句可以作为初期测试和调试工具的辅助条件,它可以在条件后添加字符串,用来解释断言:

>>> age=-1
>>> assert 0<age<100,'The age must be realistic'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: The age must be realistic


5.循环

(1)while循环

如果我们需要打印1到100怎么办呢?当然不能一个一个的打印,在python里面我们可以这样做:

x=1

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

Python会一直执行while下的语句块,知道while后的表达式不成立为止。

(2)for循环

for循环为一个集合(序列或者其他可迭代对象)的每个元素执行一次序列块。

words=['a','b','c']
for word in words:
        print word

因为迭代某范围的数字是很常见的,所以有个内建的范围函数提供使用:

>>> range(1,5)
[1, 2, 3, 4]

range函数的工作方式和分片很像,它包含下限,不包含上限,如果希望下限为0可以只提供上限。

xrang函数的循环行为类似与range函数,区别 在于range函数一次性创建整个序列,而xrange一次性只创建一个数。

(3)循环遍历字典元素

一个for语句就可以遍历整个字典的所有键:

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

d.items()方法会将键-值作为元组返回,for循环的一个好处就是可以循环中使用序列解包:

d={'x':'1','y':'2','z':'3'}
for key,value in d.items():
        print key,'and',value

(4)一些迭代工具

并行迭代

程序可以同时迭代两个序列,比如有两个下面的列表需要打印相对的名字和年龄,可以像下面这样做:

names=['a','b','c','d']
ages=[12,13,14,15]
for i in range(len(names)):
        print names[i],'is',ages[i],'years old'

而内建的zip函数就可以用来经行并行迭代,把两个序列“压缩”在一起,然后返回一个元组的列表,这样就可以循环中解包元组:

>>> a=[1,2,3]
>>> b=['a','b','c']
>>> zip(a,b)
[(1, 'a'), (2, 'b'), (3, 'c')]
>>> for  num,name in zip(a,b):print num,'is',name

zip函数可以用于任意多的 序列,知道最短的序列“用完”的时候就会停止:

>>> zip(range(5),range(1000))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
按索引迭代

有些时候我们需要访问更多迭代中的对象,例如:在一个字符串中替换所有的'xxx'。实现方法很多,比如我们可以这样做:

for string in strings"

     if 'xxx' in string:

          index=strings.index(string)

          string[index]='consider'

这样的方法比较笨,不过可以接受,另外一种方法是使用内建的enumerate函数,这个函数可以在提供索引的地方迭代索引-值对。

(5)跳出循环

我们可以是用break和continue语句实现跳出循环,其中,break语句会跳出整个循环,continue语句只会跳出当前循环,直接经行下一次循环,不会完全跳出循环体。


6.列表推导式——轻量级循环

列表推导式是利用其它列表创建新的列表,工作方法类似与for循环,也很简单:

>>> [x*x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

在里面可以使用更多的if或者for语句:

>>> [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

下面,我们来看下另外三个语句:pass,del和exec

(1)pass

有时候我们需要程序什么都不用做,例如:

if a>0:

  print 'a>0'

elif a==0:

  #什么也不做

elif a<0:

  print 'a<0'

这样代码是不会执行的,因为python中的空白代码块是非法的,pass语句就用来解决这种问题,只需要在代码块中加上pass语句就可以解决了。

(2)del

del语句会删除一个对象的名称,而不会删除这个对象。例如:

>>> a=[1,2,3]
>>> b=a

>>> del a
>>> b
[1, 2, 3]
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not define



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值