0%

Python 条件判断详解:语法、逻辑与实战示例

条件判断是编程中的核心逻辑之一,用于根据 “条件是否成立” 执行不同代码块。Python 中通过 ifelifelse 关键字实现条件判断,语法简洁且逻辑清晰。本文从 “基础语法→多条件判断→嵌套判断→实战场景” 四个维度,系统讲解 Python 条件判断的使用方法,帮你掌握不同场景下的逻辑编写技巧。

基础语法:if 语句(单条件判断)

if 是 Python 条件判断的基础,用于判断 “一个条件” 是否成立:若条件为 True(真),执行缩进的代码块;若为 False(假),则跳过该代码块。

1. 语法格式

1
2
3
4
5
6
if 条件表达式:
# 条件成立时执行的代码(必须缩进,通常用 4 个空格)
代码语句1
代码语句2
# 条件不成立时,跳过缩进块,执行后续代码
后续代码
关键说明:
  • 条件表达式:结果必须是 “布尔值”(True或False),常见形式包括:
    • 比较运算(><==!=>=<=);
    • 逻辑运算(andornot);
    • 成员运算(innot in);
    • 身份运算(isis not)。
  • 冒号(:if 语句结尾必须加冒号,用于标记 “代码块的开始”。
  • 缩进:Python 通过缩进区分代码块(推荐 4 个空格),缩进不一致会报错(IndentationError)。

2. 示例:判断数字大小

阅读全文 »

多触发策略组合问题解析:Cron 与 TimeBased 是否会重复触发

1
2
3
4
5
<Policies>
<CronTriggeringPolicy schedule="0 0 0 * * ?"/>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="1024 MB"/>
</Policies>

<Policies> 同时包含了 CronTriggeringPolicyTimeBasedTriggeringPolicySizeBasedTriggeringPolicy,核心疑问是 “0 点时是否会触发两个策略(Cron 和 TimeBased)”。下面从 Log4j2 多策略执行逻辑、两种时间相关策略的差异入手,详细分析问题并给出优化建议。

多触发策略的核心执行逻辑

Log4j2 的 <Policies>组合触发策略(CompositeTriggeringPolicy),其核心规则是:
只要任意一个策略满足触发条件,就会立即执行日志滚动,且后续策略不再判断(即 “短路执行”,类似if-else的逻辑,而非 “所有满足条件的策略都执行”)。

具体流程如下:

  1. 日志写入时,Log4j2 按 <Policies> 中策略的配置顺序依次检查;
  2. 若第一个策略(如CronTriggeringPolicy)满足条件,则触发滚动,跳过后续策略;
  3. 若第一个策略不满足,再检查第二个(如TimeBasedTriggeringPolicy),以此类推;
  4. SizeBasedTriggeringPolicy 会在每次日志写入时检查文件大小,若达到阈值,无论其他策略是否满足,都会优先触发滚动。

0 点时的策略触发分析

配置中,CronTriggeringPolicy(0 点触发)和 TimeBasedTriggeringPolicy(默认按天触发)在 “0 点” 这个时间点看似都满足条件,但实际不会重复触发,原因如下:

1. 两种时间策略的本质差异

虽然两者都与 “时间” 相关,但触发逻辑和依赖条件完全不同:

策略 触发逻辑 依赖配置 执行方式
CronTriggeringPolicy 基于 Cron 表达式的定时任务,内部启动独立线程,到时间后主动标记 “需要滚动” schedule(Cron 表达式) 主动触发(与日志写入无关)
TimeBasedTriggeringPolicy 基于 filePattern 时间粒度,日志写入时检查当前时间是否超出粒度范围 filePattern(如%d{yyyyMMdd} 被动触发(依赖日志写入)

2. 0 点时的实际执行场景

阅读全文 »

jq 处理 JSON 详解:从安装到高级应用

在日常工作中,JSON 格式的日志、配置文件或接口响应非常常见,jq 作为轻量级的命令行 JSON 处理器,能高效完成过滤、提取、分组、计数等操作,是处理 JSON 数据的必备工具。本文将从安装 jq 开始,围绕 JSON 数组和 “每行一个 JSON 对象”(JSON Lines)两种常见格式,详解 jq 的核心用法。

安装 jq

jq 不是系统默认安装的工具,需手动安装,以下是主流操作系统的安装方法:

Linux 系统

(1)Debian/Ubuntu 系列
1
sudo apt-get update && sudo apt-get install -y jq
(2)CentOS/RHEL 系列
1
2
3
4
5
6
# CentOS 7 及以上(需启用 EPEL 源)
sudo yum install -y epel-release
sudo yum install -y jq

# CentOS 8 / Rocky Linux 等(使用 dnf)
sudo dnf install -y jq
(3)Fedora
1
sudo dnf install -y jq
(4)Arch Linux
1
sudo pacman -S jq

macOS 系统

(1)使用 Homebrew(推荐)
阅读全文 »

推荐系统中的协同过滤算法:原理、实现与应用

协同过滤(Collaborative Filtering)是推荐系统中最经典且应用广泛的算法之一,其核心思想是利用用户群体的行为数据(如评分、点击、购买),发现用户或物品之间的相似性,进而为用户推荐其可能感兴趣的物品。与基于内容的推荐不同,协同过滤无需依赖物品的具体特征(如电影的类型、书籍的作者),仅通过用户行为的 “协同” 模式即可生成推荐。

协同过滤的核心思想与分类

协同过滤的核心假设是:

如果用户 A 和用户 B 在过去对某些物品有相似的偏好,那么用户 A 未来可能喜欢用户 B 喜欢的其他物品;反之亦然。

根据数据利用方式的不同,协同过滤可分为两大主流类型:

  1. 基于用户的协同过滤(User-Based Collaborative Filtering) 找到与目标用户兴趣相似的 “邻居用户”,将邻居用户喜欢的物品推荐给目标用户。
  2. 基于物品的协同过滤(Item-Based Collaborative Filtering) 计算物品之间的相似度(如 “喜欢物品 A 的用户也喜欢物品 B”),为用户推荐与其之前喜欢的物品相似的其他物品。

基于用户的协同过滤(User-Based CF)

算法流程

步骤 1:构建用户 - 物品评分矩阵

假设存在用户集合U = {u1, u2, ..., um}和物品集合I = {i1, i2, ..., in},构建一个m×n的评分矩阵R,其中R[u][i]表示用户u对物品i的评分(若未评分则为 0 或空)。

示例矩阵(行:用户,列:物品,值:评分 1-5):

用户 \ 物品 电影 A 电影 B 电影 C 电影 D 电影 E
用户 1 5 4 0 0 1
用户 2 0 0 5 4 0
用户 3 5 0 0 0 1
用户 4 0 0 4 5 0
步骤 2:计算用户相似度

衡量两个用户uv的相似度,常用方法:

  • 皮尔逊相关系数(Pearson Correlation):衡量两个用户评分趋势的一致性(取值范围 [-1,1],越接近 1 越相似)。 公式:

    其中,I_uv是用户uv共同评分的物品集合,\bar{R}[u]是用户u的平均评分。

  • 余弦相似度(Cosine Similarity):将用户的评分向量视为高维空间中的向量,相似度为向量夹角的余弦值(取值范围 [0,1])。 公式:

阅读全文 »

Hadoop 配置实践:从零开始搭建单机环境

以下以 Apache Hadoop 2.7.x 为例,讲解单机环境的核心配置与启动流程(生产环境需配置分布式集群)。

步骤 1:核心配置文件

Hadoop 配置文件位于 $HADOOP_HOME/etc/hadoop 目录,主要包括:

1. core-site.xml(核心配置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- NameNode 节点的 URI:协议、主机、端口 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<!-- Hadoop 临时文件存储目录(需手动创建)
如果在hdfs-site.xml中不配置NameNode节点和DataNode节点的数据存放位置时,默认放在该目录下
-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/data/hadoop/tmp</value>
</property>
<!-- 缓冲区大小,默认 4096 -->
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
</configuration>

2. hdfs-site.xml(HDFS 配置)

阅读全文 »