没用过这6个高阶技巧,别说你是Python程序员
【摘要】 大家好,这里是程序员晚枫,全网同名。3年经验Python工程师,被实习生用10行代码当场秒杀?今天这篇文章,带你3分钟掌握6个高阶技巧,直接开挂!首先说明:今天分享的这些技巧,不是网上哪些用一些花里胡哨的入门语法,把多行代码合并为一行那么无聊。────────────────── 技巧 1 collections.Counter刚学算法的时候,经常遇到统计词频的问题。你有没有用过Python...
大家好,这里是程序员晚枫,全网同名。
3年经验Python工程师,被实习生用10行代码当场秒杀?今天这篇文章,带你3分钟掌握6个高阶技巧,直接开挂!
首先说明:今天分享的这些技巧,不是网上哪些用一些花里胡哨的入门语法,把多行代码合并为一行那么无聊。
──────────────────
技巧 1 collections.Counter
刚学算法的时候,经常遇到统计词频的问题。
你有没有用过Python原生的collections这个库?
from collections import Counter
text = '''
Python 自动化 晚枫 python-office 办公 python-office Python 自动化 python-office 自动化 办公 晚枫 程序员 晚枫 python-office
'''
# 一行出词频排行榜
top3 = Counter(text.split()).most_common(3)
print(top3) # [('python-office', 4), ('自动化', 3), ('晚枫', 3)]
──────────────────
技巧 2 装饰器缓存
在函数名和参数不变,并且函数计算很耗时的情况下,这个装饰器,可以快速取出上一次计算的结果。
import functools
import time
@functools.lru_cache(maxsize=None) # 无限缓存
def slow_func(x):
time.sleep(1) # 一些很慢的逻辑
return x * x
print(slow_func(10)) # 第一次1秒
print(slow_func(10)) # 第二次直接读缓存,毫秒级
──────────────────
技巧 3 生成器表达式
记得当年参加校招的笔试,被这道题难住了一晚上!
# 需求:读取百万行日志,统计含“ERROR”的行数
# 传统写法,先把所有行读到内存
with open('huge.log') as f:
lines = f.readlines()
error_lines = [l for l in lines if 'ERROR' in l]
# 高阶写法:把 [] 换成 (),边读边算,内存恒稳
error_lines = (l for l in open('huge.log') if 'ERROR' in l)
print(sum(1 for _ in error_lines)) # 直接计数不占内存
──────────────────
技巧 4 dataclass省掉样板代码
用@dataclass
定义类,简直不要太方便!
而且这个特性早在3.7就引入Python了,你用过吗?
from dataclasses import dataclass
@dataclass
class Employee:
name: str
age: int
salary: float
# 两行搞定__init__/__repr__/__eq__
e = Employee('张三', 28, 20000.0)
print(e) # Employee(name='张三', age=28, salary=20000.0)
──────────────────
技巧 5 解包与通配符
解包是一个非常实用的编程技巧,当需要取出集合最后一个元素,但不知道集合元素总数的时候,你会怎么做?
# 需求:函数返回多个值,忽略中间无用字段
def get_user():
return 'Alice', 28, 'alice@example.com', 'Shanghai'
name, age, _, city = get_user() # _ 占位忽略邮箱
print(name, city)
# 只想要首尾,中间全部打包
first, *_, last = get_user()
print(first, last) # Alice Shanghai
──────────────────
技巧 6 内存视图memoryview
读取大文件必备!
# 需求:大文件切片不复制
with open('big.bin', 'rb') as f:
mm = memoryview(f.read()) # 零拷贝视图
# 只要前1MB与后1MB拼接,不额外占内存
new_data = mm[:1024*1024] + mm[-1024*1024:]
print(len(new_data))
──────────────────
大家在学习Python中有任何问题,欢迎在评论区和我交流!
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)