作为入门学习,首先是学习了 Python Crash Course ,了解了大致的架构体系。但是很多知识点还没有完全掌握,现在再简略地过一遍 Begining Python 这一本书,补充一些还比较新鲜的内容。
相关的书籍资源:
CHPT01 基础知识
进制数与复数
1
2
3
4
5
6
7
8
9
10
11
12
13
# 二进制、八进制和十六进制
print(0b0001, 0b0010, 0b0100, 0b1000, 0b1111)
print(0o0001, 0o0010, 0o0100, 0o1000, 0o7777)
print(0x0001, 0x0010, 0x0100, 0x1000, 0xFFFF)
print(0xAAAA + 0b0011) # 可以相互进行算术运算
bin(123)
oct(123)
hex(123)
# 复数
import cmath
cmath.sqrt(-10) # 1j
(1+3j) * (9+4j) # python 本身支持复数类型
字符编码
Python 字符串使用 Unicode 编码,每个 Unicode 字符都用一个 code point 表示,码点就是 Unicode 给每个字符指定的一个数字。通用形式为:前缀 \u
加上一个 16 位或 32 位的十六进制数。另外还可以使用 Unicode 名称:\N{name}
。
1
2
3
print('\u00c6')
print('\U0001F60A')
print('A \N{cat} is being chased by a \N{dog}')
Unicode 编码的问题:在内存和磁盘中,所有对象以二进制形式表示,在 C 等编程语言中,这些字节(8 组二进制数为一字节)完全暴露。Python提供了两种类似的类型:不可变的 bytes 和可变的 bytearray。如果需要,可如下直接创建 bytes 对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
byte__ = b'Hello, World!'
print(byte__)
# UTF-8 与 UTF-32
print('Hello'.encode('ASCII'))
print('Hello'.encode('UTF-8'))
print('Hello'.encode('UTF-32'))
print(len('Hello'.encode('UTF-8')))
print(len('Hello'.encode('UTF-32')))
# 可以不必使用encode或decode,直接创建bytes或str
string = str(b'H\xc3\xa6ll\xc3\xa5, w\xc3\xb8rld', encoding='utf-8')
byte = bytes(string, encoding='utf-8')
print(string)
print(byte)
# 使用encode和decode:
print(string.encode('ASCII', 'replace'))
print(string.encode('ASCII', 'ignore'))
print(string.encode('UTF-8'))
print(byte.decode())
CHPT02 列表
花式索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
numbers = [i for i in range(1,11)]
# 定义索引步长
print(numbers[0:10:2])
# 简写
print(numbers[::2])
# 当步长为负数
print(numbers[10:0:-3])
print(numbers[::-2])
# 仅定义起点或终点
print(numbers[5::-2])
print(numbers[:8:2])
# 通过索引插值(这个操作有点难理解,但是合法的)
num = [1,5]
num[1:1] = [2,3,4];
列表操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 序列相加
print('Hello, ' + 'World!')
print([1,2,3] + [4,5,6])
# 序列倍乘
print('ha'*10)
print([8]*8)
# 空序列初始化(注意 None 和 np.nan 的区别)
seq = [None] * 10
print(seq)
print([np.nan] * 10)
# 成员资格
print('P' in 'Python')
# 常用操作集合
a = num.copy() # 复制列表
num.clear() # 就地清空列表
a.extend(a) # append 函数的升级版
a.count(5) # 对某值计数
a.index(5) # 返回值的索引,“找到即止”
a.pop() # 弹出栈顶
a.pop(0) # 弹出对应位置(栈底)
a.remove(3) # 删除该值,“找到即止”
a.reverse() # 逆序
sorted(a) # 排序返回
a.sort() # 就地排序
del a[3] # 就地删除
CHPT03 字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 希腊字母 pi 的 Unicode
syn = '\u03c0'
# 分别使用str、repr和ascii进行转换
text = "{pi!s}/{pi!r}/{pi!a}".format(pi = syn)
# 指定转换类型
text = "a float number: {num:f}".format(num=1)
text = "a binary number: {num:b}".format(num=7)
# 其他类型说明符:
# x--十六进制小写、X--十六进制大写、d--十进制、o--八进制、
# e--使用科学计数法、%--表示为百分比值、c--Unicode码点、s--保持字符串
# 宽度、精度和千分位分隔符
print("{:10}".format(3))
print("{:10}".format('ABC')) # 加入了空格
print("{num:.3f}".format(num=1.23456789)) # 自动四舍五入
print("一个天文数字:{:,}".format(2**1000)) # 加入了逗号
# 模块 string:好像并没有什么L用
print(string.printable)
# 一些有趣的功能
print('一些有趣的功能'.center(50, '#'))
print('ABCDEFG'.find('EFG'))
print('C:\\'+'\\'.join(list('ABCDEFG')))
CHPT04 字典
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
d = dict(
[('name','a dictionary'),
('length',3),
('creator','sexymotherfucker')]
)
dc = d.copy()
# 基本操作
len(d)
print(d['name'])
del d['creator']
print('name' in d)
d.clear()
d = {}.fromkeys(['name', 'length']) # 只初始化键的字典,值为 None
d['name'] # 旧版本中字典不能索引空值,不知道什么时候就可以了
d.update(dc) # 使用一个字典更新另一个字典
d.pop('name') # 类似列表的 pop
CHPT05 流程控制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 序列解压
a, b, c = [1,2,3]
# 收集多余的值
a, b, *c = [1,2,3,4,5,6,7,9]
# 链式赋值
x = y = max(c) # 等价于 y = max(c); x = y
# 增强赋值
a += 1
a *= a
c *= 2
text = 'abc'
text *= 10
# 条件终止程序
assert False
print('如果没有终止,我就会出现!')
# 并行迭代
a = [1,2,3]; b = ['a','b','c']
for num, letter in zip(a, b):
print(f"{num}: {letter}") # 只生成迭代器,不产生新对象
# 迭代索引
for i, item in enumerate(b):
print(f"{i}: {item}")
# del语句
x = y = 10
del y
print(x)
try:
print(y)
except NameError:
print('variable does not exit!')
# 可以看到只删除了命名空间的名称,不删除实际对象。
# 动态代码:
exec('a = 1'); print(a) # 执行语句,无返回
print(eval(hex(123456))) # 执行运算,返回值
CHPT06 抽象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 参数只存在于局部命名空间:
a = 0
def test(a):
a = 'something else'
print(a)
test(a)
print(a)
# 收集参数:
add = lambda x, y: x + y
args = (1, 2) # 位置参数,使用元组或列表
add(*args)
kwargs = {'x': 1, 'y': 3} # 关键字参数,使用字典
add(**kwargs)
CHPT07 类
- 1.多态:可以对不同类型的对象执行相同的操作;
- 2.封装:对外隐藏对象工作细节;
- 3.继承:基于通用类创建专用类。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Person:
def __init__(self, s):
self.txt = s
def set_name(self, name):
self.name = name
def get_name(self):
return self.name
def greet(self):
print(f'Hello, {self.name}!')
person = Person('dewrethryju') # 实例化
person.set_name('Martin') # 调用方法 method
person.get_name()
person.greet()
person.txt # 调用属性 attribution
# 类方法与函数的区别在于参数self,self将参数关联到所属的实例。
待续