Python新手还会遇到一个困难,就是缺少do/while循环结构 。例如,我们要把新来的水果做成果汁并且装到瓶子里面,直到水果用完为止 。下面先用普通的while循环来实现:
FRUIT_TO_PICK = [ {'apple': 1, 'banana': 3}, {'lemon': 2, 'lime': 5}, {'orange': 3, 'melon': 2},]def pick_fruit(): if FRUIT_TO_PICK: return FRUIT_TO_PICK.pop(0) else: return []def make_juice(fruit, count): return [(fruit, count)]bottles = []fresh_fruit = pick_fruit()while fresh_fruit: for fruit, count in fresh_fruit.items(): batch = make_juice(fruit, count) bottles.extend(batch) fresh_fruit = pick_fruit()print(bottles)
这种写法必须把fresh_fruit = pick_fruit()写两次,第一次是在进入while循环之前,因为我们要给fresh_fruit设定初始值,第二次是在while循环体的末尾,因为我们得把下一轮需要处理的水果列表填充到fresh_fruit里面 。
如果想复用这行代码,可以考虑loop-and-a-half 模式 。这个模式虽然能消除重复,但是会让while循环看起来很笨,因为它成了无限循环,程序只能通过break语句跳出这个循环 。
FRUIT_TO_PICK = [ {'apple': 1, 'banana': 3}, {'lemon': 2, 'lime': 5}, {'orange': 3, 'melon': 2},]bottles = []while True: # Loop fresh_fruit = pick_fruit() if not fresh_fruit: # And a half break for fruit, count in fresh_fruit.items(): batch = make_juice(fruit, count) bottles.extend(batch)print(bottles)
有了海象操作符,就不需要使用loop-and-a-half模式了,我们可以在每轮循环的开头给fresh_fruit变量赋值,并根据变量的值来决定要不要继续循环 。这个写法简单易读,所以应该成为首选方案 。
FRUIT_TO_PICK = [ {'apple': 1, 'banana': 3}, {'lemon': 2, 'lime': 5}, {'orange': 3, 'melon': 2},]bottles = []while fresh_fruit := pick_fruit(): for fruit, count in fresh_fruit.items(): batch = make_juice(fruit, count) bottles.extend(batch)print(bottles)
在其他一些场合,赋值表达式也能缩减重复代码 。总之,如果某个表达式或赋值操作多次出现在一组代码里面,那就可以考虑用赋值表达式把这段代码改得简单一些 。
要点
- 赋值表达式通过海象操作符(:=)给变量赋值,并且让这个值成为这条表达式的结果,于是,我们可以利用这项特性来缩减代码 。
- 如果赋值表达式是大表达式里的一部分,就得用一对括号把它括起来 。
- 虽说Python不支持switch/case与do/while结构,但可以利用赋值表达式清晰地模拟出这种逻辑 。
关于作者:布雷特·斯拉特金(Brett Slatkin),google首席软件工程师,他是Google Surveys的联合技术创始人,也是PubSubHubbub协议的共同创造者之一 。此外,Slatkin还发布了Google的第一个云计算产品——App Engine 。早在15年前,Slatkin就开始在工作中使用Python管理Google大量的服务器群 。他拥有纽约哥伦比亚大学计算机工程专业学士学位 。本文摘编自《Effective Python:编写高质量Python代码的90个有效方法》(原书第2版),经出版方授权发布 。
推荐阅读
- 蜜蜂卵多少天能孵化? 小蜜蜂卵要几天才能孵出
- python打包exe 小工具
- 被蚂蚁咬后有脓正常吗 蚂蚁咬了起了个小脓包能挤破
- 小苏打洗天霉菌好了,柠檬百香果蜂蜜茶
- 泉州茶烟,茶烟怎么样好吸么
- 小米|3999元!小米首款电子水牌发布:55英寸4K屏
- 跳绳瘦小腿有用吗?
- 上身力量训练怎么训练?
- 做俯卧撑能减肚子的吗?
- 蜜蜂产卵几天能孵出小蜜蜂 蜂卵多久孵化