Python知识点汇总
1. 位置参数 *args 关键字参数**kwargs
args、kwargs也可以换成别的表达
示例:
def example_function(arg1, arg2, *args, **kwargs):print(f"固定参数: {arg1}, {arg2}")print(f"额外位置参数: {args}")print(f"额外关键字参数: {kwargs}")example_function(1, 2, 3, 4, 5, name="Alice", age=25)
# 输出:
# 固定参数: 1, 2
# 额外位置参数: (3, 4, 5)
# 额外关键字参数: {'name': 'Alice', 'age': 25}
2. PEP 8 相关规范
什么是PEP 8规范:PEP8 是 Python 官方制定的代码风格指南,规定了命名规范、缩进、空行、注释等代码编写细节,旨在提高 Python 代码的可读性和一致性
- 不要使用反斜杠连接行
- 方法定义之间空1行,顶级定义之间空两行(顶级定义(Top-level definitions) 指的是直接定义在模块(.py 文件)最外层的代码元素,不属于任何类、函数或其他代码块的定义。简单来说,就是没有缩进的定)
3. __new__
和__init__
的区别
class MyClass:# __new__:创建实例(静态方法)def __new__(cls, *args, **kwargs):print(f"__new__ 被调用,正在创建 {cls.__name__} 实例")# 调用父类的__new__创建并返回实例instance = super().__new__(cls)return instance# __init__:初始化实例(实例方法)def __init__(self, name):print(f"__init__ 被调用,正在初始化实例")self.name = name # 设置实例属性def show(self):print(f"实例属性 name = {self.name}")# 创建实例
obj = MyClass("测试对象")
obj.show()# 输出结果:
# __new__ 被调用,正在创建 MyClass 实例
# __init__ 被调用,正在初始化实例
# 实例属性 name = 测试对象
new 的第一个参数是 cls(当前类),必须返回一个实例。
init 的第一个参数是 self(new 返回的实例),无需返回值。
4. range
和xrange
的区别
# Python 2 环境下
# 遍历 range()(直接遍历已存在的列表)
for i in range(1, 5):print(i) # 1, 2, 3, 4# 遍历 xrange()(动态生成每个元素)
for i in xrange(1, 5):print(i) # 1, 2, 3, 4(结果相同,但生成方式不同)
- Python 2:range() 返回列表(占用内存多),xrange() 返回生成器(节省内存)。
- Python 3:仅保留range(),功能等同于 Python 2 的 xrange()。
5. 字符串统计单词个数
from collections import Counter# 定义一个英文句子
sentence = "I like python, python is easy, I like coding, coding is fun"# 简单处理:去除标点并转为小写(避免大小写和标点影响统计)
processed = sentence.replace(",", "").lower()# 按空格分割成单词列表
words = processed.split()# 使用Counter统计每个单词的出现次数
word_counts = Counter(words)print("单词出现次数:")
for word, count in word_counts.items():print(f"{word}: {count}次")
6. 列表扁平化
def flatten(nested):result = []for item in nested:if isinstance(item, list):# 如果是列表,递归扁平化后合并result.extend(flatten(item))else:# 否则直接添加result.append(item)return result# 测试三层嵌套列表
nested_list = [1, [2, [3, 4], 5], [6, [7, [8]]]]
print(flatten(nested_list)) # 输出:[1, 2, 3, 4, 5, 6, 7, 8]
7. 二分查找
(1)非递归——左右指针
def binary_search(data,target):left = 0right = len(data)-1while left <= right:mid = (left+right)//2if data[mid] == target:return Trueelif data[mid] > target:right = mid-1else:left = mid+1return False
(2)递归
def binary_search(data,target):n = len(data)if n>0:mid = n//2if data[mid] == target:return Trueelif data[mid]<target:binary_search(data[mid+1:],target)else:binary_search(data[:mid],target)return False
8. == 和 is 的区别
9. 字典和json的转换
“dump 出”:把字典 “倒出来” 变成 JSON 字符串。
“load 入”:把 JSON 字符串 “装进去” 变成字典。
import json# 原字典
my_dict = {"name": "张三", "age": 30}# dumps:字典 → JSON字符串(dump出字符串)
json_str = json.dumps(my_dict)
print(type(json_str)) # <class 'str'>(是字符串)# loads:JSON字符串 → 字典(load入字典)
new_dict = json.loads(json_str)
print(type(new_dict)) # <class 'dict'>(是字典)
10.字典推导式
# 键是数字,值是数字的平方
square_dic = {x: x**2 for x in [1, 2, 3, 4]}
# 结果:{1: 1, 2: 4, 3: 9, 4: 16}# 从列表生成键,值是键的长度
len_dic = {word: len(word) for word in ["apple", "banana", "cat"]}
# 结果:{'apple': 5, 'banana': 6, 'cat': 3}