再梳理一遍 Python 系列知识点,夯实基础,无他,唯手熟尔
Python 系列总结都是我自己平时的学习笔记,如果有不正确的地方,希望各位佬儿哥指正纠偏
for......else......的执行顺序:
当迭代对象完成所有迭代后且此时的迭代对象为空时,如果存在 else 子句则执行 else 子句,没有则继续执行后续代码;如果迭代对象因为某种原因(如带有 break 关键字)提前退出迭代,则 else 子句不会被执行,程序将会直接跳过 else 子句继续执行后续代码;
数值型比较不能使用 not in,因为 not in 本质是循环遍历右侧数据,用左侧数据进行比对,len() in range(1,5) 可以使用,因为 range 是一个集合,可以遍历, "li" in "lili"不建议使用,因为返回结果为 True(包含),达不到预期结果,所以准确比较建议使用'==';
字典取值:有两种方式,a={'name':'lili'}
第一种:a['name']
第二种: a.get('name')
区别:a['wenwen'] 报错-KeyError a.get('wenwen') 不报错-None
如果在方法中给全局变量赋值,则要在方法中提前声明全局变量-global;
列表转成字符串''.join(list)
用''中的字符串作为连接,拼接 list 列表中的每个元素 --- 只能用在每个元素都是字符串的时候可以用,要不然就会报错;
集合数据类型 set 取值
因为集合(set)是一种无序的不重复的元素的集合。因为集合中的元素没有特定的顺序,所以无法通过下标索引来访问。
可以使用循环遍历取值,也可使用 in 判断目标元素是否在集合中。
当遇到复杂计算的数字字面量时,保留整个数学公式,提示可读性也不会降低性能;
要判断某个容器是否包含特定成员,用集合比用列表更合适,因为集合底层使用了哈希表数据结构
# 列表数据越多效果越明显
VALID_NAMES = ['pip', 'lili', 'name']
VALID_NAMES_SET = set(VALID_NAMES)
def validate_name(name):
if name not in VALID_NAMES_SET:
raise ValueError(f'{name} is not a valid name')
nums = [10, 2, 3, 21, 10, 3]
def ordered_dict(member: list[int]):
from collections import OrderedDict
result = list(OrderedDict.fromkeys(member).keys())
return result
print(ordered_dict(nums))
----------------------------------------------------
[10, 2, 3, 21]
在遍历时不要直接修改原列表,可以启用一个新列表来保存修改后的成员;
对于未来可能会变动的多返回值函数来说,可以使用 NamedTuple 类型对返回结果进行建模,可以减少后期代码变动对已有程序的影响
from typing import NamedTuple
class Address(NamedTuple):
"""地址信息结果"""
country: str
province: str
city: str
def latlon_to_address(lat, lon):
return Address(
country = country,
province= province,
city = city,
)
addr = latlon_to_address(lat, lon)
# 通过属性名来使用addr
# addr.city / addr.country / addr.province
from itertools import product
print(list(product([1,2],[3,4])))
----------------------------------------
[(1, 3), (1, 4), (2, 3), (2, 4)]
# 常用多层嵌套循环
def find_twelve(nem_list1, num_list2, num_list3):
"从这三个数字列表中,寻找是否存在和为12的3个数"
for num1 in num_list1:
for num2 in num_list2:
for num3 in num_list3:
if num1 + num2 + num3 == 12:
return num1, num2, num3
# 使用product()扁平化多层嵌套循环
from itertools import product
def find_tewlve_v2(num_list1, num_list2, num_list3):
for num1, num2, num3 in product(num_list1, num_list2, num_list3):
if num1 + num2 + num3 == 12:
return num1, num2, num3
# 方法1:使用enumerate
def parse_titles(filename):
"""从各行数据文件中取数据"""
with open(filename, 'r') as fp:
for i, line in enumerate(fp):
if i % 2 == 0:
yield line
if __name__ == '__main__':
message_generator = parse_titles('logs.txt')
while True:
try:
print(next(message_generator))
except StopIteration as e:
break
但如果需求变更为每隔 3 行读取或者每隔 4 行读取,那我们按照以上的写法应该怎么筛选呢?
# 方法2:使用islice
from itertools import islice
def parse_titles_v2(filename):
"""使用slice实现隔行取值"""
with open(filename, 'r') as fp:
for line in islice(fp, 0, None, 2): # islice(seq, start, end, step)
yield line
if __name__ == '__main__':
message_generator = parse_titles_v2('logs.txt')
while True:
try:
print(next(message_generator))
except StopIteration as e:
break
如果需求变更为每隔 3 行读取或者每隔 4 行读取,我们只需要将 islice(seq, start, end, step) 中的 step 改成 3 或者 4 就行了