Python易错点6
73.数组切片
hhh='ABCabcDEFdef' print(hhh[2:-1:3])
运行结果:CcF
[开始:结束:间隔]
不包括结束位置
74. 编码与解码
编码就是编成字节码。
字符串根据utf8编码encode为字节码,字节解码decode对应的字符串。
有一个UTF-8编码的文件,需要转码成GBK编码的文件:decode(‘utf-8’) —> encode(‘gbk’),注意这里文件就是字节码
先解码再编码
75.python
空字符,空数组,空元组,空字典
False、0、''、[]、{}、()、set()都可以视为False,但不是None
可变对象 空[]、空{}和空set is为False,不可变对象 空()、空'' is 都为True
空对象id()都相同
# 空元组 为False if (): print('()') if not (): print('not ()') # 空字符 为False if '': print("\'\'") if not '': print("not \'\'") # 空列表 为False if []: print('[]') if not []: print('not []') # 空{} 为False if {}: print('{}') if not {}: print('not {}') # 空set 为False if set(): print('set()') if not set(): print('not set()')
75.比较操作
字符串与任何类型比较在python3中都不允许
print(100<'a')
print({}<'abc')
print("abc" > [1,2])
TypeError: '>' not supported between instances of 'str' and 'list'
75.1 整形和布尔形可以比较,bool是Int的子类
bool类型是int的子类,且True=1, False=0
print(1.2 > True) # True print(1 > True) # False print(bool('0')) # True print(bool('1')) # True print(bool('-1')) # True
75.2 字符比较,按照字典序:'ab'>'aa'
(True)
75.3 整形和字符不可比较
str和int比较时会抛出异常
TypeError: '<' not supported between instances of 'int' and 'str'
75.4 序列对象通常可以与相同序列类型的其他对象比较。这种比较使用字典式顺序
[1,5]<[3,4,6] # True [1,4,[5,6]]<[3,4,6] # True [3,4,[5,6]]<[3,4,6] # typeError: '<' not supported between instances of 'list' and 'int'
76 python链式比较
python的链式比较按照数据表达式的方式进行计算:
4>3==3
(True)# 4>3 and 3==3
优先级 比较 高于 等于
77 for循环删除列表元素
注意,列表起始位置的内存地址不变,每次删除一个元素时会将后面的元素向前移动。而for遍历时记录的是位置。
答案:B
因为for循环实际是循环的列表下标(索引),同时由于列表的可变性,每一次删除一个元素,列表的长度就会发生变化,元素的索引也会发生变化。
而remove是对值进行操作的
第一次循环,循环索引为0,此时索引为0的元素是1,因此data_list中第一个1被删除了,此时data_list 为[2, 3, 4, 5]
第二次循环,循环索引为1,此时索引为1的元素是3,因此data_list中元素3被删除了,此时data_list为[2, 4, 5]
第三次循环,循环索引为2,此时索引为2的元素是5,因此data_list中元素5被删除了,
此时data_list为[2, 4]
由于新列表长度为2,于是循环结束
78. 序列相加相乘
print([1, 2] + [3, 4]) # [1, 2, 3, 4] print([1, 2] * 3) # [1, 2, 1, 2, 1, 2] print('abc' * 3) # abcabcabc单元素必须加逗号才是元组,否则就是单变量 print(('abc',) * 3) # ('abc', 'abc', 'abc')
79. 可变参数传递
- 函数中同时存在元组参数与字典参数时,元组参数一定要放在字典参数前边。
- 只要是可变参数,一定要放在普通参数后边。
- 可变参数在函数调用时必须解封装后传递,否则函数内部会当做一个参数进行处理(无论元组或者字典)。
80. 字符串拼接方法
- str 是不可变对象,所以每次拼接都会生成一个新对象,效率很低
- 列表拼接
chunks = [] my_strings = ['a', 'b', 'c'] for s in my_strings: chunks.append(s) result = ''.join(chunks) print(result)
除了使用列表的方式io.StringIO拼接也可以用于字符串拼接
import io output = io.StringIO() output.write('Fisrt line.\n') print('Second line.', file=output) contents = output.getvalue() output.close() print(contents)
- bytearray方法不能拼接字符串
81. windows环境变量的先后顺序
windows 环境变量的查找顺序是按照文件的录入的顺序从前向后找的,最前面一条的优先级最高,如果找到命令就不会再向后找 因此新增环境变量的时候,最好将新添加的放在最前面 以获得最高优先级
82. 什么是模块?库?和包?
python模块是:
自我包含并且有组织的代码片段为模块。
表现形式为:写的代码保存为文件。这个文件就是一个模块。sample.py 其中文件名smaple为模块名字。
python包是:
包是一个有层次的文件目录结构,它定义了由n个模块或n个子包组成的python应用程序执行环境。
通俗一点:包是一个包含__init__.py 文件的目录,该目录下一定得有这个__init__.py文件和其它模块或子包。
python库是:
参考其它编程语言的说法,就是指python中的完成一定功能的代码集合,供用户使用的代码组合。在python中是包和模块的形式。
2.如何导入包和模块?
1、import xxx.xx
2、from xxx.xx import xxx
3、__init__.py
3.1、 __all__ = []
3.2、 from xx.xx import *
3.3、 from xxx import xx
83. 面向对象编码
(1)对于类的公有属性,不应该在名称前加下划线
(2)对于简单的类公有变量,最好不要设置过多的getter/setter,直接访问即可
(3)classmethod首选使用cls拼写作为第一个参数的名称
(4)避免使用属性进行计算成本高昂的操作
84.转义字符
当你用单引号' '定义字符串的时候,它就会认为你字符串里面的双引号" "是普通字符,从而不需要转义。反之当你用双引号定义字符串的时候,就会认为你字符串里面的单引号是普通字符无需转义
print("a'b") # a'b print("""a'b""") # a'b print("a\'b") # a'b print("a'b") # a'b print('a''b'"c") # abc
85.元组
注意单纯的()不是元组,单个元素的元组需要加上逗号(1,)