모아두기 추천하는 파이썬 활용팁 20가지!

풀어 주다: 2023-08-09 17:42:31
앞으로
681명이 탐색했습니다.


1. 혼란스러운 연산

이 섹션에서는 일부 Python의 혼란스러운 연산을 비교합니다.

1.1 치환을 사용한 무작위 샘플링과 치환 없는 무작위 샘플링

import random random.choices(seq, k=1) # 长度为k的list,有放回采样 random.sample(seq, k) # 长度为k的list,无放回采样
로그인 후 복사

1.2 람다 함수의 매개변수

func = lambda y: x + y # x的值在函数运行时被绑定 func = lambda y, x=x: x + y # x的值在函数定义时被绑定
로그인 후 복사

1.3 copy 및 deepcopy

import copy y = copy.copy(x) # 只复制最顶层 y = copy.deepcopy(x) # 复制所有嵌套部分
로그인 후 복사

복사 및 변수 앨리어싱 결합 시 함께 사용하면 혼동하기 쉽습니다.

a = [1, 2, [3, 4]] # Alias. b_alias = a assert b_alias == a and b_alias is a # Shallow copy. b_shallow_copy = a[:] assert b_shallow_copy == a and b_shallow_copy is not a and b_shallow_copy[2] is a[2] # Deep copy. import copy b_deep_copy = copy.deepcopy(a) assert b_deep_copy == a and b_deep_copy is not a and b_deep_copy[2] is not a[2]
로그인 후 복사

별칭을 수정하면 원본 변수에 영향을 미칩니다. (얕은) 복사본의 요소는 원본 목록에 있는 요소의 별칭인 반면, 전체 복사는 재귀적으로 복사됩니다. 딥 카피 수정은 원래 변수에 영향을 주지 않습니다.

2、常用工具

2.1 读写 CSV 文件

import csv # 无header的读写 with open(name, 'rt', encoding='utf-8', newline='') as f: # newline=''让Python不将换行统一处理 for row in csv.reader(f): print(row[0], row[1]) # CSV读到的数据都是str类型 with open(name, mode='wt') as f: f_csv = csv.writer(f) f_csv.writerow(['symbol', 'change']) # 有header的读写 with open(name, mode='rt', newline='') as f: for row in csv.DictReader(f): print(row['symbol'], row['change']) with open(name, mode='wt') as f: header = ['symbol', 'change'] f_csv = csv.DictWriter(f, header) f_csv.writeheader() f_csv.writerow({'symbol': xx, 'change': xx})
로그인 후 복사

注意,当 CSV 文件过大时会报错:_csv.Error: field larger than field limit (131072),通过修改上限解决

import sys csv.field_size_limit(sys.maxsize)
로그인 후 복사

csv 还可以读以 \t 分割的数据

f = csv.reader(f, delimiter='\t')
로그인 후 복사

2.2 迭代器工具

itertools 中定义了很多迭代器工具,例如子序列工具:

import itertools itertools.islice(iterable, start=None, stop, step=None) # islice('ABCDEF', 2, None) -> C, D, E, F itertools.filterfalse(predicate, iterable) # 过滤掉predicate为False的元素 # filterfalse(lambda x: x < 5, [1, 4, 6, 4, 1]) -> 6 itertools.takewhile(predicate, iterable) # 当predicate为False时停止迭代 # takewhile(lambda x: x < 5, [1, 4, 6, 4, 1]) -> 1, 4 itertools.dropwhile(predicate, iterable) # 当predicate为False时开始迭代 # dropwhile(lambda x: x < 5, [1, 4, 6, 4, 1]) -> 6, 4, 1 itertools.compress(iterable, selectors) # 根据selectors每个元素是True或False进行选择 # compress('ABCDEF', [1, 0, 1, 0, 1, 1]) -> A, C, E, F
로그인 후 복사

序列排序:

sorted(iterable, key=None, reverse=False) itertools.groupby(iterable, key=None) # 按值分组,iterable需要先被排序 # groupby(sorted([1, 4, 6, 4, 1])) -> (1, iter1), (4, iter4), (6, iter6) itertools.permutations(iterable, r=None) # 排列,返回值是Tuple # permutations('ABCD', 2) -> AB, AC, AD, BA, BC, BD, CA, CB, CD, DA, DB, DC itertools.combinations(iterable, r=None) # 组合,返回值是Tuple itertools.combinations_with_replacement(...) # combinations('ABCD', 2) -> AB, AC, AD, BC, BD, CD
로그인 후 복사

多个序列合并:

itertools.chain(*iterables) # 多个序列直接拼接 # chain('ABC', 'DEF') -> A, B, C, D, E, F import heapq heapq.merge(*iterables, key=None, reverse=False) # 多个序列按顺序拼接 # merge('ABF', 'CDE') -> A, B, C, D, E, F zip(*iterables) # 当最短的序列耗尽时停止,结果只能被消耗一次 itertools.zip_longest(*iterables, fillvalue=None) # 当最长的序列耗尽时停止,结果只能被消耗一次
로그인 후 복사

2.3 计数器

计数器可以统计一个可迭代对象中每个元素出现的次数。

import collections # 创建 collections.Counter(iterable) # 频次 collections.Counter[key] # key出现频次 # 返回n个出现频次最高的元素和其对应出现频次,如果n为None,返回所有元素 collections.Counter.most_common(n=None) # 插入/更新 collections.Counter.update(iterable) counter1 + counter2; counter1 - counter2 # counter加减 # 检查两个字符串的组成元素是否相同 collections.Counter(list1) == collections.Counter(list2)
로그인 후 복사

2.4 带默认值的 Dict

当访问不存在的 Key 时,defaultdict 会将其设置为某个默认值。

import collections collections.defaultdict(type) # 当第一次访问dict[key]时,会无参数调用type,给dict[key]提供一个初始值
로그인 후 복사

2.5 有序 Dict

import collections collections.OrderedDict(items=None) # 迭代时保留原始插入顺序
로그인 후 복사

3、高性能编程和调试

3.1 输出错误和警告信息

向标准错误输出信息

import sys sys.stderr.write('')
로그인 후 복사

输出警告信息

import warnings warnings.warn(message, category=UserWarning) # category的取值有DeprecationWarning, SyntaxWarning, RuntimeWarning, ResourceWarning, FutureWarning
로그인 후 복사

控制警告消息的输出

$ python -W all # 输出所有警告,等同于设置warnings.simplefilter('always') $ python -W ignore # 忽略所有警告,等同于设置warnings.simplefilter('ignore') $ python -W error # 将所有警告转换为异常,等同于设置warnings.simplefilter('error')
로그인 후 복사

3.2 代码中测试

有时为了调试,我们想在代码中加一些代码,通常是一些 print 语句,可以写为:

# 在代码中的debug部分 if __debug__: pass
로그인 후 복사

一旦调试结束,通过在命令行执行 -O 选项,会忽略这部分代码:

$ python -0 main.py
로그인 후 복사

3.3 代码风格检查

使用 pylint 可以进行不少的代码风格和语法检查,能在运行之前发现一些错误

pylint main.py
로그인 후 복사

3.4 代码耗时

耗时测试

$ python -m cProfile main.py
로그인 후 복사

测试某代码块耗时

# 代码块耗时定义 from contextlib import contextmanager from time import perf_counter @contextmanager def timeblock(label): tic = perf_counter() try: yield finally: toc = perf_counter() print('%s : %s' % (label, toc - tic)) # 代码块耗时测试 with timeblock('counting'): pass
로그인 후 복사

代码耗时优化的一些原则

  • 전체 코드가 아닌 성능 병목 현상이 발생하는 위치를 최적화하는 데 집중하세요.
  • 전역 변수를 사용하지 마세요. 지역 변수는 전역 변수보다 빠르게 조회되며, 함수 내에서 전역 변수를 정의하는 코드 실행은 일반적으로 15%-30% 더 빠릅니다.
  • 속성에 액세스하려면 . 자주 액세스되는 클래스 멤버 변수 self.member를 로컬 변수에 넣으려면 from module import name을 사용하는 것이 더 빠릅니다.
  • 내장된 데이터 구조를 사용해 보세요. str, list, set, dict 등은 C로 구현되어 매우 빠르게 실행됩니다.
  • 불필요한 중간 변수 및 copy.deepcopy() 생성을 피하세요.
  • a + ':' + b + ':' + c와 같은 문자열 연결은 쓸모없는 중간 변수를 많이 생성하며 ':',join([a, b, c])는 생성되지 않습니다. 효율적인 소수. 또한 문자열 연결이 필요한지 여부를 고려해야 합니다. 예를 들어 print(':'.join([a, b, c]))는 print(a, b, c, sep=':'보다 효율성이 떨어집니다. ).

위 내용은 모아두기 추천하는 파이썬 활용팁 20가지!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:Python当打之年
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!