Python基础教程 第五章 条件、循环和其他语句

2017年11月15日09:27:21
  • Python基础教程 第五章 条件、循环和其他语句已关闭评论
  • 375 views
  • A+
所属分类:Python基础

print语句、import语句,pass, del和exec语句的用祛

 

 

5.1  print和import的更多信息

5.1.1,使用逗号输出,打印多个表达式也是可行的,只要将它们用逗号隔开就好,同时可以使用+号连接

>>> print 'Age:',42

Age: 42

可以看到,每个参数之间都插人了一个空格符。

print greeting +salutation, name

 

5.1.2把某件事作为另一件事导入

从模块导人函数的时候,可以使用

import somemodule

或者

from somemodule import somefunction

或者

from somemodule import samefunction.anothcrfunction, yetanotherfunction

或者

from somemodule import *

也可以为函数提供别名:

>>> from math import sqrt as foobar

>>> foobar(4)

>>>import math as foobar

>>>foobar.sqrt(4)

 

 

5.2赋值魔法

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

用它交换两个(或更多个)变量

x, y=y, x

事实上,这里所做的事情叫做序列解包(sequence unpacking)或可选代解包

 

当函数或者方法返回元组(或者其他序列或可迭代对象)时,那么这个元组就可以直接赋值到两个变量中

解包的序列中的元素数量必须和放置在赋值符号=左边的变量数量完全一致

 

Python 3.0中有另外一个解包的特性,例如,a,b,rest*=[1,2,3,4]最终会在a和匕都被赋值之后将所有其他的参数都收集到:es七中。

本例中,res七的结果将会是[3, 4]

 

 

5.2.2链式赋值

x = y = somefunction()

 

5.2.3增量赋值

x = 2

x += 1

x *= 2

对于其他数据类型也适用(只要二元运算符本身适用于这些数据类型即可)

 

 

5.3语句块:缩排的乐趣

语句块是在条件为真(条件语句)时执行或者执行多次(循环语句)的一组语句。在代码前放置空格来缩进语句即可创建语句块。

使用tab字符也可以缩进语句块,块中的每行都应该缩进同样的量

Python中,冒号(:)用来标识语句块的开始,块中的每一个语句都是缩进的(缩进量相同)。

当回退到和已经闭合的块一样的缩进量时,就表示当前块已经结束了

 

5.4条件和条件语句

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

False   None   0  ""  ()   []   {}

 

bool函数可以用来(和lis七、s七r以及七uple一样)转换其他值。

bool('I think. therefore I am)

True

因为所有值都可以用作布尔值,所以几乎不需要对它们进行显式转换,也就是说Python中的所有值都能被解释为真值

 

注意:尽管[]和””都是假值,它们本身却并不相等,就是说[] !=””

 

 

5.4.2条件执行和if语句

 

5.4.3else子句

if name.endswith('Gumby'):

print 'Hello,Mr. Gumby'

else:

print 'Hello,stranger'

 

5.4.4   elif子句

它是"else if"'的简写

 

 

5.4.5嵌套代码块

if ...else... 中嵌套if...else...

 

            表5-1  Python中的比较运算符

表达式描述

x == y                                x等于Y

x<y                                x小于Y

x>y                                x大于Y

x>=y                                x大于等于Y

x<=y                                x小于等于Y

x != y                               x不等于Y

x is y                               x和Y是同一个对象,同一性运算符

x is not y                           x和Y是不同的对象

x in y                               x是Y容器(例如,序列)的成员,成员资格运算符

x not in y                           x不是Y容器(例如,序列)的成员

 

5.字符串和序列比较

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

>>>"alpha"<"beta"

True

实际的顺序可能会因为使用不同的locale而和上边的例子所有不同(请参见标准库文档中locale模块节)。

 

如果字符串内包括大写字母,那么结果就会有点乱(实际上,字符是按照本身的顺序值排列

的。一个字母的顺序值可以用。ord函数查到,ord函数与chr函数功能相反)。如果要忽略大小写字

母的区别,可以使用字符串方法upper和lower(请参见第3章)。

 

其他的序列也可以用同样的方式进行比较,

>>>[1.,2]<[2.,1]

True

 

 

6.布尔运算符

if number<=10:

if number>=1:

print 'Great!'

else:

print 'Wrong!'

else:

print 'Wrong!'

这样做没问题,但是方法太笨了,笨在需要写两次Print’Wrong!’,应采用下面的方法

if  1 <= number <=10 and

print 'Great!'

else:

print 'Wrong!'

 

and运算符就是所谓的布尔运算符。它连接两个布尔值,与它同类的还有两个运算符,or和not

 

 

5.4.7断言

一般说来,你可以要求某些条件必须为真(例如,在检查函数参数的属性时,或者作为初期测试和调试过程中的辅助条件)。

语句中使用的关键字是assert

>>>age=10

>>>assert 0<age<100

>>>age=-1

如果需要确保程序中的某个条件一定为真才能让程序正常工作的话,assert语句就有用了,它可以在程序中置入检查点。

条件后可以添加字符串,用来解释断言:

 

>>>assert 0<age<100, 'The age must be realistic'  后面的字符串就相当于注释

Tracebaclc (most recent cal.last):

file "<stdin>".line 1. in?

AssertionError: The age must be realistic

 

5.5循环

5.5.1   while循环

x=1

while x<=100:

print x

x+=1

 

name=''

while not name:

name=raw input('Please enter your name')

print 'Hello.%s!' % name

 

5.5.2 for循环

numbers = [0. 1. 2, 3, 4,5, 6,7, 8, 9]

for number in numbers:

print number

Range函数的工作方式类似于分片。它包含下限(本例中为0),但不包含上限(本例中为10).如果希望下限为0,可以只提供上限:

 

>>>range(10)

[0. 1. 2. 3. 4, 5. 6, 7, 8. 9]

 

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

一次只创建一个数。当需要迭代一个巨大的序列时xrange会更高效,不过一般情况下不需要过多关注它。

 

 

5.5.3 循环遍历字典元素

Phonebook = {'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'}

for temp in Phonebook:
print temp,':',phonebook[temp]

 

输出

Beth : 9102

Alice : 2341

Cecil : 3258

 

5.5.4一些迭代工具

而内建的zip函数可以用来进行并行迭代,可以把两个序列“压缩”在一起,然后返回一个元组的列表:

现在我可以在循环中解包元组:

Names = ['beth', 'damon', 'Job']
Ages = [32, 55, 23]
result = zip(Names,Ages)
print result
for name,age in zip(Names,Ages):
    print name ,'is' ,age,'years'

输出

[('beth', 32), ('damon', 55), ('Job', 23)]

beth is 32 years

damon is 55 years

Job is 23 years

 

 

2.编号迭代

有些时候想要迭代序列中的对象,同时还要获取当前对象的索引。例如,在一个字符串列表

中替换所有包含’xxx’的子字符串。实现的方法肯定有很多,假设你想像下面这样做:

 

因为python总不存在java中的循环计数器,所以for循环中的循环技术需要自建变量来获取

index=0

for string in strings:

if 'xxx' in string:

strings[index] ='[censored]'

index+=1

 

方法有些笨,不过可以接受。另一种方法是使用内建的enumerate函数:

 

for index, string in enumerate(strings):

if 'xxx' in string:

strings[index]='[censored]'

 

 

3.翻转和排序迭代

让我们看看另外两个有用的函数:reversed和sorted:它们同列表的reverse和sort (sorted和sort使用同样的参数)方法类似,

但作用于任何序列或可迭代对象上,不是原地修改对象,而是返回翻转或排序后的列表

 

排序

>>>sorted([4, 3, 6, B, 3])

[3, 3, 4, 6, B]

>>>sorted('Hello, world!')

[' ', '!', ',', 'H', 'd', 'e', 'l', 'l', 'l', 'o', 'o', 'r', 'w']

反转

>>>list(reversed('Hello, world!'))  #此处必须要用list

['!', 'd', 'l', 'r', 'o', 'w', ' ', ',', 'o', 'l', 'l', 'e', 'H']

>>>'',join(reversed('Hello, world!'))

'!dlrow ,olleH'

 

 

5.5.5跳出循环

  1. break

结束(跳出)循环可以使用break语句。

  1. continue

continue语句比break语句用得要少得多。它会让当前的迭代结束,“跳”到下一轮循环的开始

 

  1. while Truelhreak习语

如果需要当用户在提示符下输人单词时做一些事情,并且在用户不输入单词后结束循环

word=raw_input('Please enter a word')

while word:

word=raw_input('Please enter a word')

#处理word

print 'The word was '+word

 

下面的代码更优秀

while True:

word=raw_input('Please enter a word')

if  not  word: break

#处理word

print 'The word was '+word

 

while True的部分实现了一个永远不会自己停止的循环

 

 

5.5.6循环中的else子句

但是有些时候想要在没有跳出之前做些事情,可以使用布尔变量,在循环前将其设定为False,跳出后设定为丁rue。然后再使用if语句查看循环是否跳出了:

broke_out=false

for x in seq:

do something(x)

if condition(x):

broke_out = True

break

do_ something_else(x)

 

if not broke_out:

print "I didn't break out!”

 

下面的代码更优秀

更简单的方式是在循环中增加一个else子句—它仅在没有调用break时执行

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!"

 

注意:else是和for为同一条语句,而非if...else...语句,当执行了break后就不会执行else中的语句了,否则循环结束后就会执行else

 

5.6列表推导式轻量级循环

列表推导式(list comprehension)是利用其他列表创建新列表的一种方法。它的工作方式类似于for循环,也很简单

print [x*x for x in range(11)]

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

 

如果只想打印出那些能被3整除的平方数呢?那么可以使用模除运算符一v}3,当数字可以被3整除时返回0

print [x*x for x in range(11) if x % 3 ==0]

[0, 9, 36, 81]

 

也可以增加更多for语句的部分:

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

 

也可以和if子句联合使用,像以前一样:

girls=['slice','bernice','clarice']
boys=['chris', 'arnold','bob']
print [b + '+' + g for b in boys for g in girls if b[0]==g[0]  ]

输出

['chris+clarice', 'bob+bernice']

这样就得到了那些名字首字母相同的男孩和女孩。

 

letterGirls = {}
for girl in girls:
letterGirls.setdefault(girl[0],[]).append(girl)
temp =  [b + '+' + g for b in boys for g in letterGirls[b[0] ]]
print temp

 

5.7 3个语句:pass, del和exec

有的时候,程序什么事情都不用做。这种情况不多,但是一旦出现,就应该让pass语句出马了

 

5.7.2使用del删除

一般来说,Python会删除那些不再使用的对象

x=1

del x

x就不存在了

 

x = ["Hello","world"]

y = x

y[1]  = "Python"

print x

['Hello','Python']

会有人认为删除X后,Y也就随之消失了,但并非如此:

del x

print y

['Hello', 'Python']

原因就是删除的只是名称,而不是列表本身(值)。事实上,在Python中是没有办法删除值的,因为在某个值不再使用的时候,

Python解释器会负责内存的回收

 

5.7.3使用exec和eval执行和求值字符串

有些时候可能会需要动态地创造Python代码,然后将其作为语句执行或作为表达式计算,在此之前,一定要慎之又慎,仔细考虑

exec语句最有用的地方在于可以动态地创建代码字符串

from math import sqrt

scope={}

exec 'sqrt= 1'  in scope

print sqrt(4)

2.0

print scope['sqrt']

1

 

可以看到,潜在的破坏性代码并不会覆盖5qrt函数,原来的函数能正常工作,而通过exec赋值的变量sqrt只在它的作用域内有效。

注意,如果需要将scope打印出来的话,会看到其中包含很多东西,因为内建的_builtins_字典自动包含所有的内建函数和值:

>>> len(scope)

2

scape.keys()

>>>scope.key()

['sqrt', _builtins_']

 

  1. eval

eval(用于“求值”)是类似于exec的内建函数。exec语句会执行一系列扮thon语句,而eval

会计算Python表达式(以字符串形式书写),并且返回结果值,(exec语句并不返回任何对象,因

为它本身就是语句)。例如,可以使用下面的代码创建一个Python计算器:

>>>eval(raw_input("Enter an arithmetic expcession: "))

Enter an arithmetic expressipn:b+18*2

42

exec是语句,eval是函数

 

 

作用域

5.8小结

本章中介绍了几类语句和其他知识。

口打印。print语句可以用来打印由逗号隔开的多个值。如果语句以逗号结尾,后面的print  语句会在同一行内继续打印。

口导入。有些时候,你不喜欢你想导人的函数名—还有可能由于其他原因使用了这个函  数名。可以使用import...as…语句进行函数的局部重命名。

口赋值。通过序列解包和链式赋值功能,多个变量赋值可以一次性赋值,通过增量赋值可  以原地改变变量。

口块。块是通过缩排使语句成组的一种方法。它们可以在条件以及循环语句中使用,后面  的章节中会介绍,块也可以在函数和类中使用。

口条件。条件语句可以根据条件(布尔表达式)执行或者不执行一个语句块。几个条件可  以串联使用if/elif/else。这个主题下还有一种变体叫做条件表达式,形如aifbelseco

口断言。断言简单来说就是肯定某事(布尔表达式)为真,也可在后面跟上这么认为的原  因。如果表达式为假,断言就会让程序崩溃(事实上是产生异常—第8章会介绍)。比  起让错误潜藏在程序中,直到你不知道它源于何处,更好的方法是尽早找到错误。

口循环。可以为序列(比如一个范围内的数字)中的每一个元素执行一个语句块,或者在  条件为真的时候继续执行一段语句。可以使用continue语句跳过块中的其他语句然后继续  下一次迭代,或者使用break语句跳出循环。还可以选择在循环结尾加上else子句,当没  有执行循环内部的break语句的时候便会执行else子句中的内容。

口列表推导式。它不是真正的语句—是看起来像循环的表达式,这也是我将它归到循环  语句中的原因。通过列表推导式,可以从旧列表中产生新的列表、对元素应用函数、过  滤掉不需要的元素,等等。这个功能很强大,但是很多情况下,直接使用循环和条件语  句(工作也能完成),程序会更易读。

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

 

表5-2本章的新函数

函数描述

chr(n)当传入序号n时,返回n所代表的包含一个字符的字符串,(0 S n< 256)

eval(sourcef, globalsC. locals]])将字符串作为表达式计算,并且返回值

enumerate(seq)产生用于迭代的(索引,值)对

ord(c)返回单字符字符串的int值

range([start〕stop[, step])    yJ建整数的列表

reversed(seq)产生seq中值的反向版本,用于迭代

sorted(seq[, cmp]C. key][, reverse])返回seq中值排序后的列表

xrange([start]stopC. step])创造xrange对象用于迭代

zip(seql, seq2....)创造用于并行迭代的新序列

 

 

 

 

 

 

avatar