# 听说你会玩 Python 系列 1 - 六酷技巧

• 1 - 六酷技巧

0

A Python Trick either teaches an aspect of Python with a simple illustration, or it serves as a motivating example, enabling you to dig deeper and develop an intuitive understanding. Dan Bader

Python Trick 表明简单而直观，但可以激发你继续深挖的兴趣，你会说“原来还可以这样做啊”。本帖就介绍几个我最喜欢的 Trick，使用它们可以让你的代码更 Pythonic。

1. 下划线占位符
2. 枚举
3. 打包
4. 解包
5. 动态属性
6. 密码函数

1

```apple_mktcap = 1084000000000
`1542870000000.0`

```apple_mktcap = 1_084_000_000_000
print(total)```
`1542870000000`

`print(f'Total is {total:,} USD')`
`Total is 1,542,870,000,000 USD`

“下划线占位符”解决痛点：容易辨认大数的位数。

2

`languages = ['Python', 'R', 'Matlab', 'Julia']`

```index = 0
for lang in languages:
print(index, lang)
index +=1```
```0 Python
1 R
2 Matlab
3 Julia```

Python 有 enumerate() 函数可以一次性返回列表（任意迭代器）的元素以及其对应的索引，代码如下，优雅吗？

```for index, lang in enumerate(languages):
print(index, lang)```
```0 Python
1 R
2 Matlab
3 Julia```

```for index, lang in enumerate(languages, start=1):
print(index, lang)```
```1 Python
2 R
3 Matlab
4 Julia```

“枚举函数 enumerate()”解决痛点：不需要显性创建索引。

3

```names = ['小罗伯特唐尼', '托比·马奎尔', '克里斯蒂安·贝尔', '杰森·莫玛']
actors = ['钢铁侠', '蜘蛛侠', '蝙蝠侠', '水行侠']```

```for index, name in enumerate(names):
print(f'{name}是{actors[index]}')```
```小罗伯特唐尼是钢铁侠

```for name, actor in zip(names, actors):
print(f'{name}是{actor}')```
```小罗伯特唐尼是钢铁侠

zip() 函数将列表（迭代器）中对应的元素打包成一个个元组，然后返回由这些元组组成的列表。上面代码是不是漂亮多了。

`universes = ['漫威', '漫威', 'DC', 'DC']`
```for name, actor, universe in zip(names, actors, universes):
print(f'{name}是来自{universe}的{actor}')```
```小罗伯特唐尼是来自漫威的钢铁侠

```a = zip(names, actors, universes)
print(*a)```
```('小罗伯特唐尼', '钢铁侠', '漫威')
('托比·马奎尔', '蜘蛛侠', '漫威')
('克里斯蒂安·贝尔', '蝙蝠侠', 'DC')
('杰森·莫玛', '水行侠', 'DC')```

```a = zip(names, actors, universes)
names, actors, universes = zip(*a)
print(names, actors, universes)```
```('小罗伯特唐尼', '托比·马奎尔', '克里斯蒂安·贝尔', '杰森·莫玛')
('钢铁侠', '蜘蛛侠', '蝙蝠侠', '水行侠')
('漫威', '漫威', 'DC', 'DC')```

“打包函数 zip()”解决痛点：能同时遍历多个迭代器

4

```a, b = 1, 2
print(a)
print(b)```
```1
2```

```a, _ = 1, 2
print(a)```
`1`

`a, b, c = 1, 2`
```---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-77-9dbc59cfd6c6> in <module>
----> 1 a, b, c = 1, 2

ValueError: not enough values to unpack (expected 3, got 2)```

```a, b, *c = 1, 2
print(a)
print(b)
print(c)```
```1
2
[]```

```a, b, *c = 1, 2, 3, 4, 5
print(a)
print(b)
print(c)```
```1
2
[3, 4, 5]```

```a, b, *c, d = 1, 2, 3, 4, 5
print(a)
print(b)
print(c)
print(d)```
```1
2
[3, 4]
5```

```a, b, *_, d = 1, 2, 3, 4, 5
print(a)
print(b)
print(d)```
```1
2
5```

“解包”解决痛点：将值赋给正确的变量。

5

```class Instrument():
pass

inst = Instrument()```

```inst.notional = 100_000_000
inst.maturity = '2025-03-25'```
```print(inst.notional)
print(inst.maturity)```
```100000000
2025-03-25```

```first_key = 'notional'
first_val = 100_000_000```

```inst = Instrument()
inst.first_key = first_val```

`print(inst.notional)`
```---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-99-50eeb1451324> in <module>
----> 1 print(inst.notional)

AttributeError: 'Instrument' object has no attribute 'notional'```

`print(inst.first_key)`
`100000000`

• 参数 1 - 对象
• 参数 2 - 属性名的变量名
• 参数 3 - 属性值的变量名

```inst = Instrument()
setattr(inst, first_key, first_val)
print(inst.notional)```
`100000000`

• 参数 1 - 对象
• 参数 2 - 属性名的变量名

`getattr(inst, first_key)`
`100000000`

```inst_info = {'ID':'9001001',
'Effective Date':'2020-03-20',
'Maturity Date':'2020-06-20',
'Notional':10_000_000,
'Domestic Currency':'USD',
'Foreign Currency':'EUR',
'Flavor':'Put',
'Strike':1.08,
'Display':'domestic pips',
'Asset Class':'FX',
'Ins trument Type':'European Option',
'Model':'Heston'}```

```inst = Instrument()
for key, val in inst_info.items():
setattr(inst, key, val)```

```for key in inst_info.keys():
print( key, '|', getattr(inst, key))```
```ID | 9001001
Effective Date | 2020-03-20
Maturity Date | 2020-06-20
Notional | 10000000
Domestic Currency | USD
Foreign Currency | EUR
Flavor | Put
Strike | 1.08
Display | domestic pips
Asset Class | FX
Instrument Type | European Option
Model | Heston```

```for key in inst_info.keys():
print( f'{key:18s}|', getattr(inst, key))```
```ID | 9001001
Effective Date | 2020-03-20
Maturity Date | 2020-06-20
Notional | 10000000
Domestic Currency | USD
Foreign Currency | EUR
Flavor | Put
Strike | 1.08
Display | domestic pips
Asset Class | FX
Instrument Type | European Option
Model | Heston```

“动态属性 setattr()”解决痛点：用尽可能少的代码快速创建对象。

6

```username = input('Username: ')
print('Logging In...')```
```Username: Steven
Logging In ...```

```from getpass import getpass
print('Logging In...')```
```Username: Steven
Logging In ...```

“密码函数 getpass()”解决痛点：让输入的密码不可见。

7

• 下划线占位符：容易辨认大数的位数
• 枚举函数 enumerate()：不需要显性创建索引
• 打包函数 zip()：能同时遍历多个迭代器
• 解包：将值赋给正确的变量
• 动态属性 setattr()：用尽可能少的代码快速创建对象
• 密码函数 getpass()：让输入的密码不可见

0 条评论

• ### 听说你会玩 Python 系列 2 - 99% 人会做错的题

题目：在不运行下面代码（Python 3 不是 Python 2）的情况下选择答案。

• ### 盘一盘 Python 系列 1 - 入门篇 (上)

昨晚见到大神 Aurélien Géron 真人讲 Tensorflow 2.0 的 autograph，会后和他聊天得知他已经搬到新加坡了，而且在这边也有一个...

• ### 盘一盘 Python 系列特别篇 - 正则表达式

正则表达式（Regular Expression, RE）就是一组定义某种搜索模式（pattern）的字符。

• ### 微信小程序开发--【Hello World 及代码结构】(二)

通过上一篇我们已经完成了注册及开发环境的搭建，今天我们来开发我们的第一个微信小程序 微信小程序开发注册流程

• ### 我用了7年时间成长为阿里Java架构师，你呢（附学习路线图）

前言：我用了七年的时间，一步一步走到了现在，中途也有了解过其他的技术，也想过要转其他的语言，但是最后还是坚持下来走Java这条路，希望我的经历可以帮助到后来的人...

• ### python 字典(Dictionary)

字典一种key - value 的数据类型，使用就像我们上学用的字典，通过笔划、字母来查对应页的详细内容。

• ### 四步组建高效机器学习团队

在过去的几年里，机器学习得到了巨大的发展。但是，机器学习作为一门年轻的学科，其团队的管理方式却更加年轻。今天，许多机器学习经理被推到管理岗位是出于需求，或者是因...

• ### IT和信息安全备忘单

尽管我们试图积极主动地处理信息安全，IT规划或项目管理，但我们会分心或拖延。这些信息安全备忘单，清单和模板旨在帮助IT专业人员处理困难的情况。