66个有趣的Python冷知识
-
斐波那契数列生成器
- 使用生成器函数可以轻松创建斐波那契数列:
def fibonacci(): a, b = 0, 1; while True: yield a; a, b = b, a + b
- 使用生成器函数可以轻松创建斐波那契数列:
-
无穷迭代器
itertools.count(start=0, step=1)
创建一个无穷迭代器。
-
轮流切换
- 使用
itertools.cycle(iterable)
在提供的序列中循环切换。
- 使用
-
笛卡尔积
itertools.product(*iterables)
计算多个迭代器的笛卡尔积。
-
字符到整数
- 使用
ord()
将字符转换为对应的ASCII码。
- 使用
-
整数到字符
- 使用
chr()
将ASCII码转换为对应的字符。
- 使用
-
默认参数捕获
- 默认参数在函数定义时计算一次:
def func(x=[]): x.append(1); return x
。
- 默认参数在函数定义时计算一次:
-
自定义异常消息
- 自定义异常类可以提供更多的信息:
class MyException(Exception): pass; raise MyException("Custom message")
。
- 自定义异常类可以提供更多的信息:
-
复数支持
- Python内置支持复数类型:
z = 1 + 2j
。
- Python内置支持复数类型:
-
时间睡眠
- 使用
time.sleep(seconds)
让程序暂停指定时间。
- 使用
-
枚举类型
- 使用
enum
模块创建枚举类型:from enum import Enum; class Color(Enum): RED = 1; GREEN = 2; BLUE = 3
。
- 使用
-
递归函数
- Python支持递归函数调用:
def factorial(n): return 1 if n == 0 else n * factorial(n - 1)
。
- Python支持递归函数调用:
-
快速排序
- 可以用递归实现快速排序:
def quicksort(arr): if len(arr) <= 1: return arr; pivot = arr[len(arr) // 2]; left = [x for x in arr if x < pivot]; middle = [x for x in arr if x == pivot]; right = [x for x in arr if x > pivot]; return quicksort(left) + middle + quicksort(right)
。
- 可以用递归实现快速排序:
-
冒泡排序
- 冒泡排序的实现:
def bubble_sort(arr): for i in range(len(arr)): for j in range(0, len(arr) - i - 1): if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j]
。
- 冒泡排序的实现:
-
装饰器传递参数
- 装饰器可以接受参数:
def decorator_with_args(arg): def decorator(func): def wrapper(*args, **kwargs): print(f"Argument: {arg}"); return func(*args, **kwargs); return wrapper; return decorator
。
- 装饰器可以接受参数:
-
类变量和实例变量
- 类变量在所有实例中共享,而实例变量每个实例独有:
class MyClass: class_var = 0; def __init__(self): self.instance_var = 0
。
- 类变量在所有实例中共享,而实例变量每个实例独有:
-
类的私有变量
- 使用双下划线前缀定义私有变量:
class MyClass: def __init__(self): self.__private_var = 0
。
- 使用双下划线前缀定义私有变量:
-
元组作为字典键
- 元组可以作为字典键:
d = {(1, 2): "value"}
。
- 元组可以作为字典键:
-
文件的行数
- 快速统计文件的行数:
num_lines = sum(1 for line in open('file.txt'))
。
- 快速统计文件的行数:
-
字典默认值
- 使用
collections.defaultdict
设置字典的默认值:from collections import defaultdict; d = defaultdict(int)
。
- 使用
-
命名参数传递
- 可以在函数调用时使用命名参数:
def func(a, b): return a + b; result = func(b=1, a=2)
。
- 可以在函数调用时使用命名参数:
-
返回多个值
- 函数可以返回多个值:
def func(): return 1, 2; a, b = func()
。
- 函数可以返回多个值:
-
反向字符串
- 使用切片反转字符串:
reversed_str = 'hello'[::-1]
。
- 使用切片反转字符串:
-
从字符串生成字节
- 使用
bytes()
将字符串转换为字节:byte_data = bytes('hello', 'utf-8')
。
- 使用
-
格式化时间
- 使用
strftime
格式化时间:import time; formatted_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
。
- 使用
-
迭代多个列表
- 使用
zip
并行迭代多个列表:for a, b in zip(list1, list2):
。
- 使用
-
求数组最大公约数
- 使用
math.gcd
求最大公约数:from math import gcd; result = gcd(8, 12)
。
- 使用
-
带索引的迭代
- 使用
enumerate
获取索引和值:for index, value in enumerate(list):
。
- 使用
-
列表去重
- 使用
set
去重:unique_list = list(set(my_list))
。
- 使用
-
随机选择
- 使用
random.choice
从列表中随机选择一个元素:import random; element = random.choice(my_list)
。
- 使用
-
字符串拼接
- 使用
join
高效拼接字符串:joined_str = ' '.join(list_of_strings)
。
- 使用
-
列表解析嵌套
- 列表解析可以嵌套:
nested_list = [[i, j] for i in range(3) for j in range(3)]
。
- 列表解析可以嵌套:
-
列表中最小值
- 使用
min
获取列表中的最小值:min_value = min(my_list)
。
- 使用
-
读取二进制文件
- 使用
'rb'
模式打开二进制文件:with open('file.bin', 'rb') as file:
。
- 使用
-
写入二进制文件
- 使用
'wb'
模式写入二进制文件:with open('file.bin', 'wb') as file:
。
- 使用
-
位移操作
- 使用
<<
和>>
进行位移操作:shifted = value << 2
。
- 使用
-
文件遍历
- 使用
os.walk
遍历目录:import os; for root, dirs, files in os.walk('path'):
。
- 使用
-
进程池
- 使用
multiprocessing.Pool
创建进程池:from multiprocessing import Pool; with Pool(5) as p: p.map(func, iterable)
。
- 使用
-
生成器表达式
- 使用生成器表达式节省内存:
gen = (x*x for x in range(10))
。
- 使用生成器表达式节省内存:
-
基本HTTP服务器
- 使用
http.server
快速启动一个HTTP服务器:python -m http.server
。
- 使用
-
合并两个字典
- 使用
**
操作符合并字典:merged_dict = {**dict1, **dict2}
。
- 使用
-
单行if语句
- 可以在单行中使用if语句:
x = 10 if condition else 20
。
- 可以在单行中使用if语句:
-
默认可变参数
- 使用不可变对象作为默认参数:
def func(x=None): if x is None: x = []
。
- 使用不可变对象作为默认参数:
-
冻结字典
- 使用
types.MappingProxyType
创建不可变字典:from types import MappingProxyType; frozen_dict = MappingProxyType(my_dict)
。
- 使用
-
查找文件扩展名
- 使用
os.path.splitext
获取文件扩展名:import os; ext = os.path.splitext('file.txt')[1]
。
- 使用
-
路径组合
- 使用
os.path.join
组合路径:path = os.path.join('folder', 'file.txt')
。
- 使用
-
字符串对齐
- 使用
str.ljust
,str.rjust
,str.center
对齐字符串。
- 使用
-
清空列表
- 使用切片清空列表:
my_list[:] = []
。
- 使用切片清空列表:
-
从列表中移除元素
- 使用列表解析移除元素:
filtered_list = [x for x in my_list if x != value]
。
- 使用列表解析移除元素:
-
对象相等性
- 使用
==
检查对象相等性,而非is
。
- 使用
-
生成UUID
- 使用
uuid.uuid4()
生成随机UUID:import uuid; id = uuid.uuid4()
。
- 使用
-
格式化数字
- 使用
format
格式化数字:formatted_number = format(1234567, ',')
。
- 使用
-
字符串转日期
- 使用
datetime.strptime
解析字符串为日期:from datetime import datetime; date = datetime.strptime('2021-01-01', '%Y-%m-%d')
。
- 使用
-
求数组最小公倍数
- 使用
math.lcm
求最小公倍数:from math import lcm; result = lcm(8, 12)
。
- 使用
-
转换为二进制
- 使用
bin()
将整数转换为二进制字符串:binary_str = bin(10)
。
- 使用
-
转换为十六进制
- 使用
hex()
将整数转换为十六进制字符串:hex_str = hex(10)
。
- 使用
-
字典键值对排序
- 使用
sorted
对字典键值对进行排序:sorted_dict = dict(sorted(my_dict.items(), key=lambda item: item[1]))
。
- 使用
-
序列化为JSON
- 使用
json.dumps
序列化对象为JSON字符串:import json; json_str = json.dumps(my_dict)
。
- 使用
-
反序列化JSON
- 使用
json.loads
反序列化JSON字符串为对象:import json; my_dict = json.loads(json_str)
。
- 使用
-
自定义排序
- 使用
sorted
和lambda
自定义排序:sorted_list = sorted(my_list, key=lambda x: x[1])
。
- 使用
-
文件是否存在
- 使用
os.path.exists
检查文件是否存在:import os; exists = os.path.exists('file.txt')
。
- 使用
-
创建目录
- 使用
os.makedirs
递归创建目录:import os; os.makedirs('path/to/directory', exist_ok=True)
。
- 使用
-
删除目录
- 使用
os.rmdir
删除空目录:import os; os.rmdir('path/to/directory')
。
- 使用
-
删除文件
- 使用
os.remove
删除文件:import os; os.remove('file.txt')
。
- 使用
-
获取当前时间戳
- 使用
time.time()
获取当前时间戳:import time; timestamp = time.time()
。
- 使用
-
读取环境变量
- 使用
os.getenv
读取环境变量:import os; value = os.getenv('ENV_VAR', 'default_value')
。
- 使用