Python 入门知识补充

总结 Python 基础中不太熟悉的知识点

Posted by Paradise on February 12, 2021

作为入门学习,首先是学习了 Python Crash Course ,了解了大致的架构体系。但是很多知识点还没有完全掌握,现在再简略地过一遍 Begining Python 这一本书,补充一些还比较新鲜的内容。

相关的书籍资源:

Python Crash Course | 提取码:4os7

Begining Python | 提取码:zbs8

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将参数关联到所属的实例。

待续