python 基础知识点
1、三引号输出内容到一行
输出到同一行,在行的末尾加 \
a = '''abcd
ABCD
'''
print(a)
print('----------------')
b = '''abcd\
ABCD
'''
print(b)
输出结果:
abcd
ABCD
----------------
abcd ABCD
2、统计字符串各字符量
a = 'hello python'
# a = ['h', 'e', 'l', 'l', 'o', ' ', 'p', 'y', 't', 'h', 'o', 'n']
# 法一
b = set(a)
print(b) # {'y', 'o', 't', 'l', 'p', 'n', 'e', 'h', ' '}
c = {_: a.count(_) for _ in b}
print(c) # {'y': 1, 'o': 2, 't': 1, 'l': 2, 'p': 1, 'n': 1, 'e': 1, 'h': 2, ' ': 1}
# 法二
from collections import Counter
d = dict(Counter(a))
print(d) # {'h': 2, 'e': 1, 'l': 2, 'o': 2, ' ': 1, 'p': 1, 'y': 1, 't': 1, 'n': 1}
3、字典 key 之不可变
字典 key 是不可变的,可以是 数值、字符串、元组(不能直接或间接包含可变数据类型的)。
4、元组之不可变
元组是不可变数据类型,是指元组的子元素(不包括孙子元素)所指向的内存地址不能改变。
a = (1, 2, [3, 4], (5, 6))
# a[1] = 'tom' # 报错
# a[2] = 'cat' # 报错
a[2][0] = 30
print(a) # (1, 2, [30, 4], (5, 6))
# a[3][0] = 50 # 报错
5、字典取 keys 并排序
获取字典 keys 方法很多,下面介绍不常见但很实用的方法。
- 对一个字典执行 list(dict) 将返回包含字典所有键的一个列表,列表元素(key)顺序为字典key插入的顺序。
a = {'name': 'tom', 'age': 10, 'sex': 'm'}
a['cls'] = 'one'
a['ax'] = 'two'
print(a) # {'name': 'tom', 'age': 10, 'sex': 'm', 'cls': 'one', 'ax': 'two'}
b = list(a)
print(b) # ['name', 'age', 'sex', 'cls', 'ax']
- 返回字典所有的键并排序,可以使用 sorted(dict)。
a = {'name': 'tom', 'age': 10, 'sex': 'm'}
a['cls'] = 'one'
a['ax'] = 'two'
print(a) # {'name': 'tom', 'age': 10, 'sex': 'm', 'cls': 'one', 'ax': 'two'}
b = sorted(a)
print(b) # ['age', 'ax', 'cls', 'name', 'sex']
6、下面输出结果是
例1:
class A(object):
x = 1
class B(A):
pass
class C(A):
pass
>>> B.x = 2
>>> print(A.x, B.x, C.x)
>>> A.x = 3
>>> print(A.x, B.x, C.x)
输出结果为:
1 2 1
3 2 3
分析:
B.x 赋值之前,A.x, B.x, C.x 都引用的是 A类的类变量 x。
B.x 赋值之后,B.x 是 B类拥有了自己的类变量 x(而非 A类变量x),A.x, C.x 都引用的是 A类的类变量 x。
例二:
import time
class Item:
def __init__(self, name, price):
self.name = name
self.price = price
# 定义析构函数,对象在销毁前调用
def __del__(self):
print('del 删除对象')
if __name__ == '__main__':
obj = Item('apple', 10)
x = obj
print(id(x), id(obj))
del obj
print('----------------')
print('end')
time.sleep(3)
print(x.name)
# print(obj.name) # 会报错,因为前面已经删除了 obj 对象与 Item 对象的引用关系
输出:
2212862269136 2212862269136
----------------
end
apple
del 删除对象
del 删除对象 为什么最后打印?
分析:因为 del() 是在对象销毁的时候调用的。
7、类继承之方法和属性
类的 私有方法和属性(双前缀下划线,没有后缀下划线):
- 对继承无效
- 外部不能直接调用
类的 非公有(保护)方法和属性(单前缀下划线,没有后缀下划线): - 对继承类有效
- 不允许外部直接调用(但 python 对此无直接限制,需要开发人员自己保证,通常可通过 pylint 检查发现)
class A():
name = 'tom'
_age = 5
__sex = 'f'
def __index__(self):
pass
def _fun1(self):
self._attr = 1
def __func2(self):
self.__attr2 = 2
def func3(self):
pass
class B(A):
pass
if __name__ == '__main__':
a = A()
a.name
a._age
# a.__sex # 报错
b = B()
b.name
b._age
# b.__sex # 报错
b._fun1()
# b.__fun2() # 报错
b.func3()
8、列表切片拷贝
对列表(可变对象)切片相当于浅拷贝。
a = [1, 2, 3, [4, 5, 6]]
b = a[:]
print(id(a), id(b))
b[1] = 22
print(a, b)
b[3][0] = 11
print(a, b)
输出结果:
2354352755840 2354352763584
[1, 2, 3, [4, 5, 6]] [1, 22, 3, [4, 5, 6]]
[1, 2, 3, [11, 5, 6]] [1, 22, 3, [11, 5, 6]]
9、列表转元组查找数据
在进行大数据的查找时,如果数据类型是列表,最好先将列表转换成元组,再进行查找。因为元组的查询效率要高于列表。
10、命令行执行文件
以 -t
选项来启动 python 命令行解释器,会就代码中混用空格和跳格的位置进行警告信息。
以 -tt
选项,会升级成错误信息。
强烈推荐使用这些选项执行 py 文件。
例:
# YES
python -t demo.py
python -tt demo.py
# NO
python demo.py
11、命名规范
- 包命名尽量短小,使用全部小写的方式,不可以使用下划线。
- 模块命名尽量短小,使用全部小写的方式,可以使用下划线。
模块名就是 py 文件名。- 类的命名使用 CapWords 的方式,模块内部使用的类采用 _CapWords 的方式。如:AddDevDlg。
- 异常命名使用 CapWords + Error 后缀的方式。
- 函数命名使用全部小写的方式,可以使用下划线。
- 常量命名使用全部大写的方式,可以使用下划线。如:MAX_OVERFOLW。
- 类的属性(方法和变量)命名使用全部小写的方式,可以使用下划线。