Python3 编程注意点

基本数据类型操作

  1. 整除 3//2
  2. 数字转字符串 str(12) = "12",数字字符串转数字 int("12") = 12,字符转化为数字:ord('a') = 97,数字转化为字符ASCLL:chr(97) = 'a'
  3. 十进制转二进制 bit(5) = "0b101",十进制转八进制 oct(10) = "012",十进制转十六进制 hex(-12) = "-0xc"
  4. 二进制转十进制 int("101", 2) = 5,转八进制和十六进制只需要改变第二个参数
  5. Python中的逻辑操作符为 andornot,而不是 && || 和 !
  6. Python中的运算符 &(与)|(或)^(异或)~(按位取反,等价于 -x-1,如 ~6 = -7)
  7. 条件语句:if-elif-else
  8. input(提示语) 将所有输入视为字符串,如果输入数字必须使用int()转化,如 age=input(), age=int(age)
  9. Python中所能表示的最大/最小的数: float("inf") / float("-inf")
  10. 格式化输出:print("%s/(%d)" % ("123", 45)) # 123/(45)
  11. 不换行输出:print("ab", end=" "); print("cd", end="\t") # ab cd\t
  12. 对一个数同时求出商和余数可以使用 a, b = divmod(5, 2) # a为2,b为1

字符串

  1. 字符串所有方法不修改字符串本身:
    .upper().lower().strip()/.lstrip()/.rstrip().split().zfill(width)(右对齐,前面补够0,达到长度width).replace('a','b')(把字符串中的a替换为b).title()(每个单词的首字母都是大写,其余都是小写).startswith(substr).endswith(substr).isdigit()isupper()islower()
  2. 不可以直接修改字符串中的字符,因为字符串是不可变对象。如果想要修改,可以用str.replace('a','b') 或者将字符串转化为可变对象 str = list(str),切片方式修改完成后再改回来 "".join(list)
  3. 字符串排序:"".join(sorted(str)),因为 sorted(str) 会返回排序后的 list
  4. 字符串反转:str[::-1],同样适用于 list

列表

  1. 列表方法修改列表本身 .append().insert(ind,val)del list[index]/.pop(可选index,默认最后一个) /.remove(element).sort(可选 key = lambda x: x[1], 可选reverse=True)(key可以指定按照列表第几维排序,reverse= True可以指定从大到小排序).reverse()
  2. 列表方法不修改列表本身 sorted()len()min()max()sum()
  3. 列表循环 for val in list:
  4. 创建数字列表 list(range(1,6,2)) # [1,3,5]
  5. 列表解析 list=[condition for val in list]
  6. 复制列表的正确做法是使用切片 lista=listb[:],而不是直接复制
  7. 检查特定值是否在列表中 val (not) in list:,返回 bool
  8. 二维列表(m行n列)初始化(全0)的正确方法:dim2 = [[0 for col in range(n)] for row in range(m)],或者 [[0] * n for row in range(m)],千万不要用 [[0] * n] * m 的错误方法(乘以 m 相当于把对象的引用复制了m次,如果修改二维列表中的一个元素,则该列的所有元素都会被修改)
  9. 二维列表得到前几行的表示法:A[:3][:] # 获得前3行;但是使用 A[:][:3] 却不是得到前 3 列,如果要获得某一列,只能通过循环一个一个获得
  10. 二维列表排序:按照第一维升序、如果第一维相同按照第二维降序,可以写成 .sort(key=lambda x: (x[0], -x[1]));同理,按照第二维降序、如果第二维相同按照第一维升序,可以写成 .sort(key=lambda x: (-x[1], x[0]));注意,这两种排序的结果可能是不同的,如 A = [[1,5], [6,4], [6,5], [3,2]],前者的排序结果是 [[1, 5], [3, 2], [6, 5], [6, 4]],后者的排序结果是 [[1, 5], [6, 5], [6, 4], [3, 2]]

字典

  1. 空字典的创建 dict(){}
  2. 字典遍历 for key,val in dic.items():,遍历所有键 for key in,dic.keys():,遍历所有值 for val in dic.values()
  3. 判断键值是否存在 if key (not) in dic:,根据键得到值 dic.get(key),如果键不存在,可以写成 dic.get(key, 0),会返回 0。
  4. 字典按照key/value找到最大值/最小值: max(dic.keys() / dic.values())min(dic.keys() / dic.values())
  5. 字典排序:
    sorted(dic.keys() / dic.values()) # 返回一个list
    如果想要将键和值都返回,应该使用 sorted(dic.items(), key=lambda x :x[0]/x[1]) # 返回一个list,每个元素是一个tuple,即 [(键,值), (键,值), ...],key 指明应该按照键还是值排序
  6. 创建字典数组的正确做法:dict_array = [dict() for _ in range(m)],不能使用 dict_array = [dict()] * m,因为这样的方式,在修改 dict_array[i] 时,其他的 dict 也会一同修改,即这种方式是传引用的。

集合

  1. 初始化: {i for i in range(10)} 或者 set()
  2. 创建和添加: a = set((1,1,2,3)); a.add(4) # 自动去重 {1,2,3,4}
  3. 移除:b = set((1,2,3)); b.remove(3) # {1,2}
  4. 两个集合的交、并、差分别用 & | -表示;
  5. 判断集合元素是否存在 if ele in set: # 该方法的时间复杂度为 O(1)

函数

  1. 定义函数 def func():,return 可返回任意类型,函数中修改传入的列表参数是永久性的,如果不想在函数中修改列表,可以传入列表的切片形式,如 func(list[:])
  2. 传递任意数量实参: func(*ele),所有ele组合成一个tuple
  3. 传递任意数量的关键字('a'='b')实参:func(**keyval),所有keyval组合成一个字典

  1. 定义类 class name():
  2. 定义子类 class sub_name(sup_name):,且父类 sup_class必须在前面定义。如果子类要继承父类所有属性,则需要在子类的def _ _init() _ _(self, ...)中初始化父类属性super(). _ _init() _ _(...)
  3. 导入模块中的类并创建实例 from car import Car, Battery; my_car = Car(...)

文件

  1. 文件打开: with open(文件, 'r'/'w'/'r+'/'a') as file:
  2. 文件读写:file.read() / file.write(str) / file.readlines()

异常

  1. 异常处理
    try: 表达式
    except ZeroDivisionError: print(错误)
    else: print(正确)

高级数据结构

  1. Python的映射(map)、归并(reduce)函数用法:
    from functools import reduce
    list(map(lambda x: x*2, [1,2,3])) # [2,4,6]
    reduce(lambda x,y:x+y, [1,2,3]) # 6
  2. collections模块有三个有用的组件:deque()defaultdict(int/str/list/set...)Counter(list)deque() 是双向队列,支持 popleft() / pop()appendleft() / append()defaultdict(...) 是默认字典,当键不存在时返回参数类型的默认值(如 int 类型返回0),而不像dict当键不存在时返回 keyError;Counter(list) 统计各个项出现的次数,返回一个字典,键为各个项,值为各个项的次数;类似的用法有 list/str.count(number/ch),统计某个列表或字符串中某数字或某字符出现的次数;Counter(list).most_common(k) 可以返回前 k 个经常出现的元素
  3. 将字符串按照相同字符分割可以利用 Python 的 itertools 中的 groupby 函数,用法是:from itertools import groupby; base = [(x[0], len(list(x[1]))) for x in groupby("heeellllooo")],将会得到 [('h', 1), ('e', 3), ('l', 4), ('o', 3)]
  4. itertools 有乘积、排列组合的函数,即 product('ABCD', repeat=2) # AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD;permutations('ABCD', 2) # AB AC AD BA BC BD CA CB CD DA DB DC;combinations('ABCD', 2) # AB AC AD BC BD CD;combinations_with_replacement('ABCD', 2) # AA AB AC AD BB BC BD CC CD DD
  5. heapq 实现堆操作,用法如下:heapq.heappush(list, num) # 加入堆;heapq.heappop(list) # 弹出堆中最小值(堆顶元素);heapq.heapreplace(list, new_num) # 删除最小值(堆顶元素),加入新元素;heapq.nlargest(K, list, key=lambda x: x)heapq.nsmallest(K, list, key=lambda x: x) # 获取堆中前K大或前最小的元素(优先队列的使用)
  6. random模块中有随机数组件:
    random() # 0 <= n < 1 的浮点数
    uniform(a,b) # a <= n <= b 的浮点数(a>b也可以, b <= n <= a)
    randint(a,b) # a <= n <= b的整数
    shuffle(list) # 将list打乱,会改变该list
    sample(list, n) # 将 list 的前 n 个元素打乱,返回一个新 list,不会修改原来的 list

正则表达式

  1. 使用格式为 import rere.match(r"^...$", s) ,其中 ^ 表示匹配 s 的开始,$ 表示匹配 s 的结尾,... 就是自己写的表达式。匹配成功会返回一个对象。
  2. 常见的正则表达式符号:
    \d:数字;?:0次或1次;*:0次到n次;+:1次到n次;\.:匹配 ".";[]:字符集合;():分组;.:任意一个字符。

其它

  1. 使用as可以给导入的模块(Python文件)或模块中的函数(文件中的函数)重命名,如 from numpy import random as rand
  2. 避免使用 from numpy import * 这种,尽量使用 import numpy as np; np.random() 或者 from numpy import random; random()
  3. all(iterable) 函数接收一个可迭代的元组或列表,如果都为 True,返回 True,否则返回 False。如 all([i in [0,1,3] for i in range(2)]) # True

你可能感兴趣的:(Python3 编程注意点)