1. 元组解包 - 交换变量值。
a, b = 5, 10
a, b = b, a # 元组解包实现变量交换
print(a, b) # 输出 10, 5
2. 列表推导式与列表生成式 - 生成器表达式节省内存。
# 列表推导式
even_squares = [x**2 for x in range(10) if x % 2 == 0]
# 列表生成式
even_squares_gen = (x**2 for x in range(10) if x % 2 == 0)
print(list(even_squares_gen)) # 输出相同,但生成器更节省内存
3. 字典的键冲突处理 - 使用collections.defaultdict
from collections import defaultdict
counter = defaultdict(int)
counter["apple"] += 1
print(counter) # 输出 {"apple": 1}
4. 列表和集合的区别 - 列表有序,集合无序且不允许重复。
a.列表的定义
# 方式一
lst1 = []
print("method1:", type(lst1)) # 输出 method1: <class 'list'>
# 方式二
lst2 = list()
print("method2:", type(lst2)) # 输出 method2: <class 'list'>
# list()为工厂函数,可以把其他数据类型转换为list
# 若在list()中传递的是可迭代对象时,可挨个存入列表
lst3 = list("123abc")
print("lst3 is", lst3) # 输出 lst3 is ['1', '2', '3', 'a', 'b', 'c']
b.list特点
-
list为有序项目集合
lst = ["a", "b", "c", "d", "e"]
# 输出列表第3个元素
print(lst[2]) # 输出 c
# lst[-1:2:-2] 其中-1为起始位置[正数从头往后, 负数则从后往前],2为结束位置(不包括),-2位步长[正负跟第一参数走, 1代表一个接一个, 2代表中间跳跃一个,以此类推]
# 正数表示从前往后 负数表示从后往前
print(lst[1:3:1])
-
list为可变数据类型
lst = ["abc", "123"] #id()内置函数返回对象的内存地址 print("the id before modifing is", id(lst)) #尝试直接修改原list,查看内存地址是否改变 lst[1] = "xxyy" print("the id after modifing is", id(lst)) #如果直接修改不可变数据类型,会报错 #string为不可变数据类型 str1 = "abc" try: #尝试修改str1的第1个元素 str1[0] = "x" print("modify successful!") except TypeError as err: print(err)
-
list可以存放任何数据类型
#print表示存放内置函数 lst = ["a", 3.4, 4, [1], print]
c. list的增删改查
-
list的新增
函数 | 具体作用 |
appen() | 往列表末尾追加元素 |
insert() | 在指定位置插入元素 |
extend() | 传入的元素为可迭代对象,依次向末尾插入每个元素 |
lst = ["aa", "12", "bb"]
lst.append("xxx")
print("after append:", lst)
lst.insert(2, "***")
print("after insert:", lst)
lst.extend("123")
print("after extend:", lst)
-
list的运算
lst1 = [1, 2] lst2 = [3, 4] print("lst1 + lst2 =", lst1 + lst2) print("lst1 * 3 =", lst1 * 3)
-
list的删除
函数 | 具体作用 |
pop() | 默认删除末尾元素,也可以指定下标删除 可以返回删除的值 |
remove() | 指定元素删除,元素不存在会报错 |
del语句 | 删除切片 |
clear() | 删除全部元素 |
lst = ["a", "b", 1, 2, "c", "d"]
value = lst.pop()
print("delete the end of list:", lst)
print("the value of deleting:", value)
lst.pop(0)
print("delete the first of list:", lst)
try:
lst.remove("d")
print("delete success!")
except:
print("delete fail!")
del lst[2:]
print("delect the a slice of list:", lst)
lst.clear()
print("delete all elements:", lst)
-
list的修改
lst = ["a", "b", "c", "e", "f"] #通过下标修改 lst[2] = "***" print("after modifying by index:", lst) #通过切片修改,赋值对象是一个可迭代对象 lst[3:] = "123" print("after modifying by slice:", lst)
d. list统计
函数 具体作用 len() 统计列表的长度 count() 统计指定元素在列表中出现的次数
index() 返回指定元素在列表中出现的下标位置,若有指定元素有多个,返回第一个元素的下标
lst = ["a", "a", "d", "d", "e"]
print("the length of list:", len(lst))
print("the count of a:", lst.count("a"))
try:
print("the index of d:", lst.index("d"))
except ValueError as err:
print(err)
e. list的拷贝
若直接使用"lst2 = lst1"进行复制,lst1与lst2指向的就是同一个对象,若改变lst2中的值也会对lst1中的值产生影响,可以使用copy()进行浅拷贝--仅拷贝类型的值
lst1 = ["a", "b", "c", "d", "e", "f"]
lst2 = lst1.copy()
#修改lst2的值 不会对lst1产生影响
lst2[2] = "***"
print("lst1 is", lst1)
print("lst2 is", lst2)
#以切片的方式也可以实现浅拷贝
lst3 = lst1[:]
lst3[3] = "***"
print("lst1 is", lst1)
print("lst3 is", lst3)
f. list的反转--reverse
lst = ['a', 'b', 'c', 'd', 'e', 'f']
lst.reverse()
print("reverse list:", lst)
g. list的排序--sort
sort方法默认对列表进行升序排序,若列表内元素是数字,则按照数字从小到大进行排序;若列表内元素为字符串,则按照字符串所有字符的Unicode码之和进行排序
lst = ['f', 'e', 'd', 'c', 'b', 'a']
lst.sort()
print("asc:", lst)
#降序排序
lst.sort(reverse=True)
print("desc:", lst)
h. list的遍历
lst = ["abc", "aa", "xx", "xyz"]
# 依次取列表中的元素
for i in lst:
print(i)
# enumerate返回下标和值
print("key --> value")
for k, v in enumerate(lst):
print(f"{k} --> {v}")
i. set的特点
set可以理解为一个只有key的字典,所有里面的元素都是唯一的,天生去重
该特点可以用于类型的转换,实现去重
无序项目集合
可变数据类型,但集合中的元素必须是不可变数据类型
j. set的新增
s1 = {1, 2, 3}
# 新增1个元素
s1.add(4)
print(f"after add:", s1)
# 一次性新增多个元素update--传递可迭代对象
s1.update("abc")
print(f"after update:", s1)
k. set的删除
s1 = {1, 2, 3, 4, 'a', 'c', 'b'}
# 使用remove删除元素,若要删除的元素set中没有会报错
s1.remove(4)
print("after remove:", s1)
# 使用discard删除元素,要删除的元素不在set中也不会报错
s1.discard("x")
print("after discard:", s1)
l. set集合运算
s1 = {1, 2, 3, 4}
s2 = {2, 4, 5, 6}
# 交集
print("s1 & s2 =", s1 & s2)
# 并集
print("s1 | s2 =", s1 | s2)
# 差集
print("s1 - s2 =", s1 - s2)
print("s2 - s1 =", s2 - s1)
# 对称差集--在s1、s2中,但不同时在两个里面
print("s1 ^ s2 =", s1 ^ s2)
5. 函数返回多个值 - 使用元组或列表。
def get_name_and_age():
return "Alice", 25
name, age = get_name_and_age()
print(name, age) # 输出 Alice 25
6. 列表推导式中的条件判断 - 更灵活的控制。
odds = [x for x in range(10) if x % 2 != 0]
print(odds) # 输出 [1, 3, 5, 7, 9]
7. 上下文管理器with
- 自动关闭资源。
with open("file.txt", "r") as file:
content = file.read()
print(content)
# 文件会在with语句结束后自动关闭
8. Python的魔术方法__str__
- 自定义对象的字符串表示。
a. __str__()方法的作用
将__str__()返回的内容以字符串形式输出
b. 装饰器高级技巧 - 使用functools.wraps
保持原函数信息。
通过print()函数触发
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
one = Person('小红',20)
print(one)
# 运行结果 <__main__.Person object at 0x000001ECF6F25E40>
如上所示,定义一个Person类,创建对象one后使用print输出对象实例时,默认打印对象的内存地址。
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return '姓名是{},年龄是{}'.format(self.name,self.age)
one = Person('小红',20)
print(one)
# 运行结果 姓名是小红,年龄是20
上述代码使用了__str__方法,当调用print()函数时,会找到实例对象one的__str__方法,输出__str__方法的返回值内容。
通过str()函数触发
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return '姓名是{},年龄是{}'.format(self.name,self.age)
one = Person('小红',20)
words = str(one)
print(worlds,type(words))
# 输出结果 姓名是小红,年龄是20<class'str'>
使用str()函数触发__str__方法输出的内容与直接调用print()函数触发的结果看似相同,但是过程是不一样的。
- 使用print()函数触发:触发时,会自动寻找实例对象的方法,若没有则直接按照默认内容输出,有则输出__str__方法的返回值。
- 使用str()函数触发:如上述代码所示,使用str()触发时,worlds类型是str,是一个字符串,打印输出的是一个字符串words。
9. 装饰器高级技巧 - 使用functools.wraps
保持原函数信息。
from functools import wraps
def timer(func):
@wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} took {end_time - start_time} seconds.")
return result
return wrapper
@timer
def my_function():
pass
my_function()
10. 异常处理和try-except-finally
- 控制流程的灵活性。
try:
div_by_zero = 10 / 0
except ZeroDivisionError:
print("Can't divide by zero!")
finally:
print("Execution completed.")