《python基础教程(第三版)》第五章 条件、循环及其他语句

5.1 再谈print和import

>>> print("I", "wish", "to", "register", "a", "complaint", sep="_")
I_wish_to_register_a_complaint

5.2 赋值魔法

可使用星号运算符(*)来收集多余的值,这样无需确保值和变量的个数相同,如下例所示:

>>> a, b, *rest = [1, 2, 3, 4]
>>> rest
[3, 4]

还可将带星号的变量放在其他位置。

>>> name = "Albus Percival Wulfric Brian Dumbledore"                                                                    >>> first, *middle, last = name.split()                                                                                 
>>> middle                                                                                                              
['Percival', 'Wulfric', 'Brian']                                                                                        
>>> *first,middle,last = name.split()                                                                                   
>>> first                                                                                                               
['Albus', 'Percival', 'Wulfric']  

增强赋值

>>> x=2
>>> x+=1
>>> x
3
>>> x*=2
>>> x
6
>>> fnord = 'foo'                                                                                                       
>>> fnord += 'bar'                                                                                                      
>>> fnord *= 2                                                                                                          
>>> fnord                                                                                                               'foobarfoobar' 

5.3 循环

5.3.1 while循环

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

5.3.2 迭代字典

>>> d = {'x': 1, 'y': 2, 'z': 3}
>>> for key in d:
...  print(key, 'corresponds to', d[key])
...
x corresponds to 1
y corresponds to 2
z corresponds to 3

也可使用keys等字典方法来获取所有的键。如果只对值感兴趣,可使用d.values。你可能还记得,d.items以元组的方式返回键值对。for循环的优点之一是,可在其中使用序列解包。

>>> for key, value in d.items():
...  print(key, 'corresponds to', value)
...
x corresponds to 1
y corresponds to 2
z corresponds to 3

5.3.3 一些迭代工具

并行迭代

有时候,你可能想同时迭代两个序列。假设有下面两个列表:

>>> names = ['anne', 'beth', 'george', 'damon']                                                                         >>> ages = [12, 45, 32, 102]                                                                                            
>>> for i in range(len(names)):                                                                                         
...  print(names[i], 'is', ages[i], 'years old')                                                                       
 ...                                                                                                                     
anne is 12 years old                                                                                                   
beth is 45 years old                                                                                                    
george is 32 years old                                                                                                  
damon is 102 years old  

i是用作循环索引的变量的标准名称。一个很有用的并行迭代工具是内置函数zip,它将两个序列“缝合”起来,并返回一个由元组组成的序列。返回值是一个适合迭代的对象,要查看其内容,可使用list将其转换为列表。

>>> list(zip(names, ages))
[('anne', 12), ('beth', 45), ('george', 32), ('damon', 102)]
>>> for name, age in zip(names, ages):
...  print(name, 'is', age, 'years old')
...
anne is 12 years old
beth is 45 years old
george is 32 years old
damon is 102 years old

5.3.4 跳出循环

1.break

要结束(跳出)循环,可使用break。假设你要找出小于100的最大平方值(整数与自己相乘的结果),可从100开始向下迭代。找到一个平方值后,无需再迭代,因此直接跳出循环。

from math import sqrt
for n in range(99, 0, -1):
   root = sqrt(n)
   if root == int(root):
      print(n)
      break

2.continue

语句continue没有break用得多。它结束当前迭代,并跳到下一次迭代开头。这基本上意味着跳过循环体中余下的语句,但不结束循环。这在循环体庞大而复杂,且存在多个要跳过它的原因时很有用。在这种情况下,可使用continue,如下所示:

for x in seq:
    if condition1: continue
    if condition2: continue
    if condition3: continue
    do_something()
    do_something_else()
    do_another_thing()
    etc() 

5.4 简单推导

列表推导是一种从其他列表创建列表的方式,类似于数学中的集合推导。列表推导的工作原理非常简单,有点类似于for循环。

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

这个列表由range(10)内每个值的平方组成,非常简单吧?如果只想打印那些能被3整除的平方值,该如何办呢?可使用求模运算符:如果y能被3整除,y 3 % 将返回0(请注意,仅当x能被3整除时,x*x才能被3整除)。为实现这种功能,可在列表推导中添加一条if语句。

>>> [x*x for x in range(10) 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)] 

使用圆括号代替方括号并不能实现元组推导,而是将创建生成器,详细信息请参阅第9章的
旁注“简单生成器”。然而,可使用花括号来执行字典推导。

>>> squares = {i:"{} squared is {}".format(i, i**2) for i in range(10)}
>>> squares[8]
'8 squared is 64' 

在列表推导中,for前面只有一个表达式,而在字典推导中,for前面有两个用冒号分隔的表
达式。这两个表达式分别为键及其对应的值。

5.5 什么都不做

有时候什么都不用做。这种情况不多,但一旦遇到,知道可使用pass语句大有裨益。
那么为何需要一条什么都不做的语句呢?在你编写代码时,可将其用作占位符。例如,你可
能编写了一条if语句并想尝试运行它,但其中缺少一个代码块,如下所示:

if name == 'Ralph Auldus Melish':
   print('Welcome!')
elif name == 'Enid':
 # 还未完成……
elif name == 'Bill Gates':
   print('Access Denied')

这些代码不能运行,因为在Python中代码块不能为空。要修复这个问题,只需在中间的代码块中添加一条pass语句即可。

if name == 'Ralph Auldus Melish':
   print('Welcome!')
elif name == 'Enid':
 # 还未完成……
   pass
elif name == 'Bill Gates':
   print('Access Denied')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容