条件循环和其它语句

使用逗号输出

print 的参数并不能像我们预期的那样构成一个元组

print 1, 2, 3

输出结果:
预想 (1, 2, 3)
实际 1, 2, 3


如果在结尾处加个逗号,那么接下来的语句会与前一条语句在同一行打印,例如:

print 'Hello,',
print 'world!'

输出结果:
Hello,world!

赋值魔法

  1. 序列解包
a, b, c = 1, 2, 3
print a
print b
print c

输出结果:
1
2
3
解包序列中的元素数量必须和放置在赋值符号=号左边的变量数量完全一致,否则Python在赋值时引发异常

a, b, c = 1, 2

输出结果:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: need more than 2 values to unpack

a, b = 1, 2, 3

输出结果:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
注意:
Python 3.0中有另一个解包的特性:可以想在函数的参数列表中一样使用星号运算符。例如:a, b, *reset = [1, 2, 3, 4]最终会在a和b都被赋值之后将所有其他的参数都收集到reset中。本例中,reset的结果将会是[3, 4]。使用星号的变量也可以放在第一个未知,这样它就总会包含一个列表。右侧的赋值语句可以是可迭代对象。

  1. 链式赋值
    链式赋值是将同一个值赋给多个变量的捷径。
x = y = 'abc'
# 和下面语句的效果是一样的:
x = 'abc'
x = y
# 但不一定等价于下面语句
x = 'abc'
y = 'abc'
  1. 增量赋值,对于*、/、%等标准运算符都使用
x = 2
x += 1
x *= 2
print x

输出结果:
6

布尔值

下面的值在作为布尔值表达式的时候,会被解释器看作假(False):
False None 0 "" () [] {}
换句话说,也就是标准值False和None、所有类型的数字0(包括浮点型、长整型和其他类型)、空序列(比如空字符串、元组和列表)已经空的字典都为假。其它的一切都被解释为真,包括特殊值True。

布尔值True和False属于布尔类型,bool函数可以用来(和list、str以及tuple一样)转换其他值。

print bool("I'm bool")
print bool(520)
print bool("")
print bool(0)

输出结果:
True
True
False
False
因为所有值都可以用作布尔值,所以几乎不需要对它显示转换(可以说Python会自动转换这些值)
注意:尽管[]和""都是假值(也就是说bool([]) == bool("") == False),它们本身却并不相等(也就是说[] != "")。对于其他不同类型的假值对象也是如此(例如() != False)

断言 assert

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

age = 10
assert 0 < age < 100
age = -1
assert 0 < age < 100

输出结果:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError

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

age = -1
assert 0 < age < 100, 'age 必须大于0小于100'

输出结果:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: age 必须大于0小于100

一些迭代工具

  1. 并行迭代
    程序可以同时迭代两个序列。比如有下面两个列表
names = ['Daniel', 'zhuqipeng']
ages = [23, 22]

如果想要打印名字和对应的年龄,可以像下面这样做:

for i in range(len(names)):
    print names[i], 'is', ages[i], 'years old'

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

zip(names, ages)
# [('Daniel', 23), ('zhuqipeng', 22)]

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

for name, age in zip(names, ages):
    print name, 'is', age, 'years old'

输出结果:
Daniel is 23 years old
zhuqipeng is 22 years old

zip函数也可以作用于任意多的序列。关于它很重要的一点是zip可以应付不等长的序列,最短的序列 “用完” 的时候就会停止:

zip(range(5), xrange(10000))

输出结果:
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]

  1. 翻转和排序迭代
    另外两个函数:reversed和sorted,它们同列表的reverse和sort(sorted和sort使用同样的参数)方法类似,但作用于任何序列或可迭代对象上,不是原地修改对象,而是翻转或排序后的版本:
sorted([5, 4, 3, 2, 1])
sorted('Daniel')
list(reversed('Daniel'))
''.join(reversed('Daniel'))

输出结果:
[1, 2, 3, 4, 5]
['D', 'a', 'e', 'i', 'l', 'n']
['l', 'e', 'i', 'n', 'a', 'D']
leinaD

注意:sorted方法返回列表,reversed方法却返回一个不可思议的可迭代对象。在for循环以及join方法中使用不会有任何问题。不过却不能直接对它使用索引、分片已经调用list方法。

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

  1. exec 执行一个字符串的语句
    很多情况下可以给它提供命名空间-可以放置变量的地方。这样做使代码不会干扰命名空间(也就是改变你的变量),比如下面的代码中干扰到了sqrt
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

所以为了安全起见,可以增加一个字典,起到命名空间的作用。可以通过增加 in <scope>来实现,其中的<scope>就是起到放置代码字符串命名空间作用的字典。

from math import sqrt
scope = {}
exec 'sqrt = 1' in scope
sqrt(4)
scope['sqrt']

输出结果:
2.0
1

  1. eval 用于求值,是类似于内建函数。exec语句会执行一系列Python语句,而eval会计算Python表达式(以字符串形式书写),并且返回结果值,(exec 语句并不返回任何对象,因为它本身就是语句)
    跟exec一样,eval也可以使用命名空间。
    初探作用域
# 给exec或者eval语句提供命名空间时,还可以在真正使用命名空间前放置一些值进去:
scope = {}
scope['x'] = 2
scope['y'] = 3
eval('x * y', scope)
# 同理,exec或者eval调用的作用域也能在另外一个上面使用:
scope = {}
exec 'x = 2' in scope
eval('x * x', scope)

输出结果:
6
4

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

推荐阅读更多精彩内容