本文主要介绍Python语言的一些容易出错和比较特别的语法,以备不时之需。
通用序列
- 序列求和及乘法
1 | [1, 2] + [1, 2] |
[1, 2, 1, 2]
1 | [1, 2]*3 |
[1, 2, 1, 2, 1, 2]
1 | 'python'*3 |
'pythonpythonpython'
- 成员资格检查
1 | database = [ |
User name: smith
PIN code: 0789
Acess granted
列表
- 入栈和出栈
1 | x = [1, 2] |
[1, 2]
- 不带和带返回值的排序
1 | x = [2, 8, 1, 7] |
[1, 2, 7, 8]
[1, 2, 7, 8]
字符串
1 | # 使用指定宽度打印价格列表 |
Please enter width: 34
==================================
Item Price
----------------------------------
Apple 0.40
Pears 12.50
==================================
字典
- 用字典创建简单数据库
1 | # 字典用人名作为键,每个人用另一个字典表示 |
Name: Alice
Phone number (p) or address (a)?p
Alice's phone number is 2341.
- 对比赋值、浅复制、深复制
1 | # 赋值 |
{'machine': ['foo', 'baz'], 'username': 'user'}
{'machine': ['foo', 'baz'], 'username': 'user'}
{'machine': ['foo', 'baz'], 'username': 'user'}
1 | x = {'username': 'admin', 'machine': ['foo', 'bar', 'baz']} |
{}
赋值语句表示关联,修改关联后的字典,也会修改原始字典。而且如果要清空原始字典,必须使用clear方法
1 | # 浅复制 |
{'machine': ['foo', 'baz'], 'username': 'admin'}
- 当在副本中替换值时,原字典不受影响
- 当在副本中修改值(原地修改,而不是替换)时,原字典也会改变
1 | # 深复制 |
{'machine': ['foo', 'bar', 'baz'], 'username': 'admin'}
深复制可以将原字典的所有值复制给副本,副本的任何变化不影响原字典。
1 | x = {} |
{'key': 'value'}
循环
- 循环列表
1 | numbers = [1, 2, 3] |
1
2
3
- 循环字典
1 | d = {'x': 1, 'y': 2, 'z': 3} |
z = 3
y = 2
x = 1
1 | d = {'x': 1, 'y': 2, 'z': 3} |
z = 3
y = 2
x = 1
- 并行迭代工具
1 | names = ['x', 'y'] |
x = 31
y = 32
- 索引迭代
1 | names = ['x', 'y'] |
name[0]=x
name[1]=y
- 列表推导式
1 | [x*x for x in range(10) if x%3==0] |
[0, 9, 36, 81]
函数
- 收集参数:
在函数定义过程中, - 单星号表示以元组方式收集其余位置的参数 - 双星号表示以字典方式收集其余位置的参数
1 | def print_params_1(title, *params): |
Params:
(1, 2, 3)
1 | def print_params_2(x,y, z=3, *pospar, **params): |
1 2 4
(5, 6, 7)
{'foo': 1, 'bar': 2}
- 参数收集的逆过程
在函数调用过程中, - 单星号表示将元组中的值分配到函数各个位置上的参数上 - 双星号表示将字典中的值分配到函数各个键名的参数上
1 | def add2(x, y): |
3
1 | def hello_3(name, greeting): |
Well met, Robin!
- 在定义和调用函数时都使用了星号,则相互抵消,不起作用。
1 | def with_star(**kwds): |
Gumby 42
Gumby 42
1 | (5,)*2 |
(5, 5)
递归
- 有效递归满足两个条件: > - 当函数直接返回值时,有基本实例(最小可能性问题); > - 递归实例,包括一个或者多个问题较小部分的递归调用。
1 | # 阶乘 |
24
1 | # 幂 |
100
1 | # 二分查找 |
2
异常处理
1 | class MuffledCalculator: |
1 | calculator = MuffledCalculator() |
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-3-75f66264a28b> in <module>()
1 calculator = MuffledCalculator()
----> 2 calculator.calc('10/0')
<ipython-input-2-f519639cf587> in calc(self, expr)
3 def calc(self, expr):
4 try:
----> 5 return eval(expr)
6 except (ZeroDivisionError, TypeError) as e: #捕捉多种异常,并打印异常,继续执行程序
7 if self.muffled:
<string> in <module>()
ZeroDivisionError: division by zero
1 | calculator.muffled = True |
division by zero
1 | calculator.calc('10/2') |
5.0
参考资料
- Magnus Lie Hetland著,司维等人译,Python基础教程(第2版),2017