'ABC'.encode('ascii') # 输出的 `b'…'` 其中的 b 代表数据类型为 bytes
b'ABC'
1
2
# 中文编码转换
'中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
1
'中文'.encode('GBK')
b'\xd6\xd0\xce\xc4'
1
'中文'.encode('ascii')
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
<ipython-input-56-b318511b2a75> in <module>()
----> 1 '中文'.encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
1
2
# 解码
b'ABC'.decode('utf-8')
'ABC'
1
2
# 中文解码
b'\xd6\xd0\xce\xc4'.decode('gbk')
'中文'
1
2
# 字符串长度
len('ABC')
3
1
2
# 中文字符串长度
len('中文')
2
1
2
# 中文字符串转码后的长度
len('中文'.encode('utf-8'))
6
字符串输出格式化
1
2
# %d 整数
'%2d-%02d' % (3, 5)
' 3-05'
1
2
# %f 浮点数
'%.2f' % PI
'3.14'
1
2
# %s 字符串
'Age: %s' % 25
'Age: 25'
1
2
# %x 十六进制整数
'%x' % 43
'2b'
1
2
# 输出格式为 'xx.x%'
"%.1f%%" % 72
'72.0%'
1
2
# 字符串的单个字符替换
'abcba'.replace('a', 'A')
'AbcbA'
列表 list
1
2
3
# 列表 list
list1 = ['0', 'a1', '2b', '3c']
list1
['0', 'a1', '2b', '3c']
1
2
# 列表长度
len(list1)
4
1
2
# 索引(下标)访问
list1[0]
'0'
1
list1[2]
'2b'
1
2
# 越界访问
list1[4]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-33-895f56fd4693> in <module>()
1 ## 越界访问
----> 2 list1[4]
IndexError: list index out of range
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
1
2
3
4
deff2(a, b, c=0, *, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
f2(1, 2, d=99, ext=None)
a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}
1
2
3
4
# 通过 tuple 和 dict 也可以调用上述函数
args = (1, 2, 3, 4)
kw = {'d': 88, 'x': '#'}
f1(*args, **kw) ##### 不要漏掉 `*` 和 `**`
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 88, 'x': '#'}
1
2
args = (1, 2, 3)
f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}
递归函数
1
2
3
4
5
6
7
# 递归函数
deffactorial(n):
if n == 1:
return1
return n * factorial(n - 1)
factorial(5)
120
1
2
# 递归嵌套过深导致栈溢出
factorial(1000)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-95-e1ef40be0628> in <module>()
1 # 递归嵌套过深导致栈溢出
----> 2 factorial(1000)
NameError: name 'factorial' is not defined
1
2
3
4
5
6
7
8
9
# 尾递归(优化内存使用)
deffactorial2(n, p=1):
if n == 1:
return p
# (尾递归的)思路:将中间结果先计算出来,再返回去!就可以减少使用的栈空间(只用一个栈帧)
return factorial2(n - 1, n * p)
# 虽然已经使用了尾递归的写法,可是 Python 编译器没有做相关优化,所以还是会栈溢出
factorial2(1000)
---------------------------------------------------------------------------
RecursionError Traceback (most recent call last)
<ipython-input-98-354f146d0995> in <module>()
7
8 # 虽然已经使用了尾递归的写法,可是 Python 编译器没有做相关优化,所以还是会栈溢出
----> 9 factorial2(1000)
<ipython-input-98-354f146d0995> in factorial2(n, p)
4 return p
5 # (尾递归的)思路:将中间结果先计算出来,再返回去!就可以减少使用的栈空间(只用一个栈帧)
----> 6 return factorial2(n - 1, n * p)
7
8 # 虽然已经使用了尾递归的写法,可是 Python 编译器没有做相关优化,所以还是会栈溢出
... last 1 frames repeated, from the frame below ...
<ipython-input-98-354f146d0995> in factorial2(n, p)
4 return p
5 # (尾递归的)思路:将中间结果先计算出来,再返回去!就可以减少使用的栈空间(只用一个栈帧)
----> 6 return factorial2(n - 1, n * p)
7
8 # 虽然已经使用了尾递归的写法,可是 Python 编译器没有做相关优化,所以还是会栈溢出
RecursionError: maximum recursion depth exceeded in comparison
1
2
3
4
5
6
7
8
# 教程中原来的尾递归写法(以上是我自己的写法)
deffact(n):
return fact_iter(n, 1)
deffact_iter(n, p):
if n == 1:
return p
return fact_iter(n - 1, n * p)
切片
1
2
3
# 准备切片素材
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
L
['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
1
2
# 取前 3 个元素
[L[0], L[1], L[2]] # 笨拙的写法
['Michael', 'Sarah', 'Tracy']
1
2
# 快捷的写法:切片!
L[:3]
['Michael', 'Sarah', 'Tracy']
1
2
# L[:3] 等价于以下写法
L[0:3]
['Michael', 'Sarah', 'Tracy']
1
2
# 切片第一个参数「起始索引」!(参数由 `:` 分隔)
L[1:3] # 即从第几个元素开始切
['Sarah', 'Tracy']
1
2
# 从倒数的索引开始切片
L[-2:]
['Bob', 'Jack']
1
2
# 切片第二个参数「末尾索引」!
L[-2:-1] # 体会它与 `L[-2:]` 的区别:不包括末尾索引位置的那个元素!
['Bob']
1
2
3
# 切片第三个参数「索引步长」!
L = list(range(10)) # 复习:整数列生成
L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1
L[::2] # 每两个元素中取一个元素
[0, 2, 4, 6, 8]
1
L[::-2] # 负的步长 -> 倒序取元素!
[9, 7, 5, 3, 1]
1
2
# 复制列表
L[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1
L.copy() # 另一种复制方法
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1
2
# 元组切片
tuple(range(10))[:3]
(0, 1, 2)
1
2
# 字符串切片
'ABCDEFG'[:3]
'ABC'
1
'ABCDEFG'[::3]
'ADG'
迭代 iterate
1
2
3
4
5
6
# 迭代
d = {'a': 1, 'b': 2, 'c': 3}
for k in d: # 单个参数只能获取到元组的键(key)
print(k)
a
b
c
1
2
for k, v in d: # 两个参数也不能正确地分别获取到元组的键值对(key 和 value)
print(k, v)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-131-106ecdc04604> in <module>()
----> 1 for k, v in d: # 两个参数也不能正确地分别获取到元组的键值对(key 和 value)
2 print(k, v)
ValueError: not enough values to unpack (expected 2, got 1)
1
2
3
# 直接获取元组的 value 的写法:`*.values()`
for v in d.values():
print(v)
1
2
3
1
2
3
# 正确获取元组的 key => value 的写法:`*.items()`
for k, v in d.items():
print(k, '=>', v)
a => 1
b => 2
c => 3
1
2
3
# 字符串迭代
for c in'ABC':
print(c)
A
B
C
对象可否迭代 Iterable
1
2
3
4
# 判断对象是否可迭代?
from collections import Iterable # 只导入特定包中的需要用到的特定对象
Too many arguments!
['/usr/local/lib/python3.6/site-packages/ipykernel/__main__.py', '-f', '/Users/IceHe/Library/Jupyter/runtime/kernel-f9ae0017-3106-4f62-8484-4df0beb75b9d.json']
1
__name__
'__main__'
1
__doc__
'Automatically created module for IPython interactive environment'
Show Comments