Python/JS/Go/Java同步学习(第二十篇)四语言“列表遍历“对照表: 雷影“老板“发飙要求员工下班留校培训风暴(附源码/截图/参数表/避坑指南)

🤝 免骂声明:

  • 本文列表遍历操作经本蜀黎实战整理,旨在提供快速参考指南📝
  • 因各语言版本迭代及不同系统环境差异,偶尔可能出现整理不全面之处,实属正常✅
  • 欢迎理性交流补充,喷子勿喷——毕竟你行你上来写,我敬你是条汉子,告诉我的你原文链接,我给你一键三连+转发👍!
  • 若遇具体问题,请带图评论区留言,本蜀黎必拔码相助🤝
    土味海报

JS列表遍历深坑跟面试高频和生产环境息息相关🚀

此篇看似简单实则大小深坑很多,且学且珍惜,避免踩雷💥

🌟【前言:字符串筑基·列表通脉】

「🧠 相信经过前18篇的『字符串苦修』,诸位已掌握:

  • 切片如『柔拳点穴』般精准✅

  • 格式化如『阴阳遁术』般灵活🚀

  • 编码解码如『通灵契约』般通透🌈

  • 今日起,我们将以字符串为『查克拉根基』💎

  • 开启它的终极形态——列表、元组、字典、集合!💪

这便好比:

  • 识百草(字符串)→ 配药方(列表)🌿

  • 通经脉(基础操作)→ 运气血(嵌套结构)🍀

  • 练体术(单数据类型)→ 结印忍术(多数据组合)✅

❌字符串基础扎实者,学列表如履平地;
跳过字符串直接学列表者,必遭『数据反噬』!

🌿【虎山CTO·药材使用警示】

  • 🍀是药三分毒,代码亦如方!
  • ❌文中所涉药材均为技术隐喻,严禁实际配伍使用。
  • 🙏真实用药请遵医嘱,乱用者——
  • 系统崩坏事小,气血逆流事大!⚠️

📚 系列文章预告:

  • 近期内容将聚焦编程基础构建,以「原创知识矩阵」形式系统梳理核心概念。每篇如连续剧集般环环相扣,建议按顺序学习——知识点一锅端,疗效更持久!🔥

🧠【场景还原:忍者学校的遍历特训】

⚡ 雷影老板(拍桌怒吼):

  • 「💢所有部门本周必须完成数据巡检!遍历不达标的中午给老子手写《火影链表心经》100遍!」

🦊 鸣人(抱头惨叫):

  • 「伊鲁卡老师救命!for循环和enumerate()到底啥区别啊?!为什么Python能直接拿索引,Java非要让我get(i)?!😫」

👨‍🏫 伊鲁卡(粉笔头精准命中):

  • 鸣人!遍历就像吃一乐拉面——🍜

  • 直接吃(for-in)→ 享受每一口原汤🍲

  • 数着吃(enumerate)→ 知道第几口吃到叉烧🍥

  • 带着条件吃(if-in)→ 避开你不爱的笋干!🎯

🐯 卡卡西(懒洋洋举《亲热天堂》补刀):

  • 「啧...连遍历都搞不定,以后怎么跟我学雷切·多线程之术?」

🧘【扎马步·列表遍历心法】

  • 遍历如抓药,方法不对容易君臣错位——🔁

  • 直接遍历值 → 按方抓药(快速但不知位置)🌿

  • 枚举遍历 → 带编号抓药(精准定位每味)📍

  • 条件遍历 → 配伍禁忌检测(安全高效)⚠️

📜【四语言列表遍历对比表】

遍历方式 Python JavaScript Go Java
直接遍历值 for item in list: for (let item of list) for _, item := range list for (String item : list)
枚举遍历 for i, item in enumerate(list): for (let [i, item] of list.entries()) for i, item := range list for (int i=0; i<list.size(); i++)
条件检测 if "x" in list: if (list.includes("x")) 需手动实现 contains() if (list.contains("x"))
索引从1开始 enumerate(list, start=1) 手动 i+1 手动 i+1 手动 i+1

✅核心差异解析:

  • Python:enumerate()封神,一键索引+值,支持起始偏移 🏆

  • JavaScript:for...of+entries()优雅但需解构,includes()直白检测 🎨

  • Go:range统一天下,但无内置包含检查,需自写contains()

  • Java:传统for-loop扛把子,.contains()省心但索引需手动+1 🥋

⚠️【避坑指南·遍历界的“药性相冲”】

🚫 Python:勿在遍历中修改列表长度(否则爆RuntimeError)

hd = ["山楂","麦芽"]  
for i, item in enumerate(hd):  
    hd.pop(i)  # 💥 边遍历边删除,直接炸炉!  

💥 JavaScript:for-in遍历数组有风险(可能遍历原型链)

const hd = ["山楂","麦芽"];  
for (let index in hd) {  
    console.log(index); // 可能输出非数字键!🕳️  
}  
// 安全用法:for-of 或 for(let i=0; ...)  

⚡ Go:range返回的是副本(修改需用索引)

hd := []string{"山楂","麦芽"}  
for _, item := range hd {  
    item = "雷影" // ❌ 无效!item是副本  
}  
// 正确:for i := range hd { hd[i] = "雷影" }  

💣 Java:用增强for循环时不能删除元素(抛ConcurrentModificationException)

List<String> hd = new ArrayList<>(Arrays.asList("山楂","麦芽"));  
for (String item : hd) {  
    hd.remove(item); // 💥 并发修改异常!  
}  
// 安全:用Iterator或普通for-loop  

⚠️其他小坑提示:

🐍【Python的坑:遍历中修改列表】

hd = ["山楂", "麦芽", "神曲"]
for index, item in enumerate(hd):
    if item == "麦芽":
        hd.pop(index)  # 💥 直接炸!RuntimeError
        # 列表长度变了,enumerate会错乱

✅ 正确做法:

# 方法1:新建列表
new_hd = [item for item in hd if item != "麦芽"]

# 方法2:倒序遍历
for i in range(len(hd)-1, -1, -1):
    if hd[i] == "麦芽":
        hd.pop(i)

⚡【Go的坑:range返回的是副本】

hd := []string{"山楂", "麦芽"}
for _, item := range hd {
    item = "雷影" // ❌ 无效!修改的是副本
}
fmt.Println(hd) // 还是["山楂", "麦芽"]

✅ 正确做法:

for i := range hd {
    hd[i] = "雷影" // ✅ 通过索引修改
}

☕【Java的坑:增强for循环中删除】

List<String> hd = new ArrayList<>(Arrays.asList("山楂", "麦芽"));
for (String item : hd) {
    if ("麦芽".equals(item)) {
        hd.remove(item); // 💥 ConcurrentModificationException
    }
}

✅ 正确做法:

// 方法1:用Iterator
Iterator<String> it = hd.iterator();
while (it.hasNext()) {
    if ("麦芽".equals(it.next())) {
        it.remove(); // ✅ 安全删除
    }
}

// 方法2:用普通for循环
for (int i = 0; i < hd.size(); i++) {
    if ("麦芽".equals(hd.get(i))) {
        hd.remove(i);
        i--; // 索引回退
    }
}
语言 主要坑点 安全方案 比喻
JavaScript for-in 遍历原型链 for-offorEach 数药柜连说明书一起数
Python 遍历中修改列表长度 新建列表或倒序遍历 边煎药边加药材→炸锅
Go range 返回副本 通过索引修改原值 隔空点穴→力道不足
Java 增强 for 中删除元素 Iterator 或普通 for 拔罐时硬扯→伤皮肉

⚠️其他JS大坑提示:

🔥【特殊情况示例:原型链污染导致的异常遍历】

// 情况1:给Array原型添加方法(常见于第三方库或老代码)
Array.prototype.中药特性 = function() { return "性平味甘"; }

const hd = ["山楂", "麦芽"];

console.log("🚨 危险遍历 for-in:");
for (let index in hd) {
    console.log(index); // 输出:0, 1, 中药特性 💥
}

console.log("✅ 安全遍历 for-of:");
for (let item of hd) {
    console.log(item); // 输出:山楂, 麦芽 ✅
}

💥 输出结果,我遍历的是值,怎么成索引了?

🚨 危险遍历 for-in:
0
1  
中药特性  // 💥 意外多出来的非数字键!
✅ 安全遍历 for-of:
山楂
麦芽

🛡️【企业级避坑指南】

// ✅ 安全做法1:永远用for-of遍历数组
for (const item of array) { /* 安全 */ }

// ✅ 安全做法2:用forEach
array.forEach((item, index) => { /* 安全 */ })

// ✅ 安全做法3:用普通for循环  
for (let i = 0; i < array.length; i++) { /* 安全 */ }

// 🚫 危险做法:用for-in遍历数组
for (const index in array) { /* 可能踩坑 */ }

🧠【更隐蔽的死坑场景】

// 情况2:Object.defineProperty 定义不可枚举属性
Object.defineProperty(Array.prototype, "隐藏属性", {
    value: "我是原型链上的幽灵",
    enumerable: false  // 不可枚举,但某些情况下仍可能被遍历
});

输出:

情况2:Object.defineProperty 定义不可枚举属性
0 山楂
1 麦芽
中药特性 [Function (anonymous)]

为什么设置了不可枚举限制,还在生效中❌

✅正确做法:

// 先清空原型链,再测试
delete Array.prototype.中药特性;  // 🧹 先清理

// 只设置不可枚举属性
Object.defineProperty(Array.prototype, "隐藏属性", {
    value: "我是原型链上的幽灵",
    enumerable: false
});

const hd = ["山楂", "麦芽"];
console.log("🚨 测试不可枚举属性:");
for (let index in hd) {
    console.log(index); // 应该只输出:0, 1 ✅
}

// 验证属性确实存在但不可枚举
console.log("隐藏属性" in hd); // true
console.log(hd.hasOwnProperty("隐藏属性")); // false
console.log(Object.keys(hd)); // ["0", "1"]

以下是本蜀黎整理源码和截图⏬

JS避坑源码和正确处理方法:

// 情况1:给Array原型添加方法(常见于第三方库或老代码)
Array.prototype.中药特性 = function() { return "性平味甘"; }

const hd = ["山楂", "麦芽"];

console.log("🚨 危险遍历 for-in:");
for (let index in hd) {
    console.log(index); // 输出:0, 1, 中药特性 💥
}

console.log("✅ 安全遍历 for-of:");
for (let item of hd) {
    console.log(item); // 输出:山楂, 麦芽 ✅
}

console.log("\n方法1,2,3输出")
// 方法1:使用 hasOwnProperty 过滤
for (let index in hd) {
    if (hd.hasOwnProperty(index)) {
        console.log(index, hd[index]); // 只输出自有属性
    }
}

// 方法2:直接用 for-of(ES6推荐)
for (let item of hd) {
    console.log(item);
}

// 方法3:传统 for 循环
for (let i = 0; i < hd.length; i++) {
    console.log(i, hd[i]);
}

// 情况2:Object.defineProperty 定义不可枚举属性
Object.defineProperty(Array.prototype, "隐藏属性", {
    value: "我是原型链上的幽灵",
    enumerable: false  // 不可枚举,但某些情况下仍可能被遍历
});

const hd1 = ["山楂", "麦芽"];
console.log("\n情况2:Object.defineProperty 定义不可枚举属性")
// 某些JS引擎或特殊模式下可能出现问题
for (let index in hd1) {
    console.log(index, hd1[index]);
}

避坑1

正确处理生效方法:

// 先清空原型链,再测试
delete Array.prototype.中药特性;  // 🧹 先清理

// 只设置不可枚举属性
Object.defineProperty(Array.prototype, "隐藏属性", {
    value: "我是原型链上的幽灵",
    enumerable: false
});

const hd = ["山楂", "麦芽"];
console.log("🚨 测试不可枚举属性:");
for (let index in hd) {
    console.log(index); // 应该只输出:0, 1 ✅
}

// 验证属性确实存在但不可枚举
console.log("隐藏属性" in hd); // true
console.log(hd.hasOwnProperty("隐藏属性")); // false
console.log(Object.keys(hd)); // ["0", "1"]

避坑2

1.Python源码

# ==================== 财务遍历模块 ====================
# 带序号查账:给每个科目发工牌 👔
# 条件触发审计:发现异常金额立即锁账 🔒
# ⚠️ERP_冷溪虎山:遍历中断会导致对账失败

hd = ['山楂','神曲','麦芽','谷芽','鸡矢藤','鸡内金','蜘蛛香','沙棘'] #消化药 列表

for index,item in enumerate(hd):    #索引默认从0开始
    print(f"索引{index}-{item}")
print("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️")

for index,item in enumerate(hd,1):   #索引从1开始
    print(f"索引{index}-{item}")
print("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️")

if "山楂" in hd:        #条件
    for value in hd:    #遍历值
        print(value)
    for i in range(len(hd)): #遍历索引
        print(i)

def lengxi_tiger(chapter):
    print(f"""
    🍵【Python虎山宝宝专属提醒】🍵
    老铁,你已经肝完 {chapter} 章啦!
    快起来活动下颈椎,接杯热水~
    你是我的心头肉,别累坏了!(๑•̀ㅂ•́)و✧
    别让本座_冷溪tiger操心
    """)

lengxi_tiger(10)

Python

2.Nodejs源码

// ==================== 中药遍历模块 ====================
// 带编号验方:给每味药材发身份牌 🪪
// 君臣配伍检测:发现相克立即报警 ⚠️
// ⚠️虎山老药师:遍历错误会炸炉

const hd = ['山楂', '神曲', '麦芽', '谷芽', '鸡矢藤', '鸡内金', '蜘蛛香', '沙棘']; // 消化药列表

// 索引默认从0开始
console.log("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️");
for (const [index, item] of hd.entries()) {
    console.log(`索引${index}-${item}`);
}
console.log("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️");

// 索引从1开始
for (let i = 0; i < hd.length; i++) {
    console.log(`索引${i + 1}-${hd[i]}`);
}
console.log("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️");

if (hd.includes("山楂")) { // 条件判断
    // 遍历值
    for (const value of hd) {
        console.log(value);
    }
    // 遍历索引
    for (let i = 0; i < hd.length; i++) {
        console.log(i);
    }
}
function lengxiTiger(chapter) {
    console.log(`%c
  🥤【JS小可爱注意】🥤
  你已经征服了 ${chapter} 个章节!
  快站起来扭扭腰,眨眨眼~
  本座_lengxi心疼你的肝啊!(っ◕‿◕)っ
  `, "color: #FF69B4; font-size: 14px");

}

// 每10章调用
lengxiTiger(10);

nodejs

3.Go源码

package main

import "fmt"

// ==================== 仓储遍历模块 ====================
// 带位置盘点:给每件货物贴坐标签 🏷️
// 临期检测:过期商品自动亮红灯 🚨
// ⚠️冷溪物流:遍历卡顿会堵死传送带

func main() {
	hd := []string{"山楂", "神曲", "麦芽", "谷芽", "鸡矢藤", "鸡内金", "蜘蛛香", "沙棘"} // 消化药列表

	// 索引默认从0开始
	fmt.Println("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️")
	for index, item := range hd {
		fmt.Printf("索引%d-%s\n", index, item)
	}
	fmt.Println("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️")

	// 索引从1开始
	for i := 0; i < len(hd); i++ {
		fmt.Printf("索引%d-%s\n", i+1, hd[i])
	}
	fmt.Println("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️")

	if contains(hd, "山楂") { // 条件判断
		// 遍历值
		for _, value := range hd {
			fmt.Println(value)
		}
		// 遍历索引
		for i := 0; i < len(hd); i++ {
			fmt.Println(i)
		}
	}
	//防疲劳警示
	HushanTiter10(10)
}

// Go 没有内置的 contains 函数,需要手动实现
func contains(slice []string, item string) bool {
	for _, s := range slice {
		if s == item {
			return true
		}
	}
	return false
}
func HushanTiter10(chapter int) {
	fmt.Printf(`
    🚨【Go语言战士注意】🚨
    你已经持续战斗%d个章节!
    --------------------------
    执行以下命令:
    $ 起身拉伸
    $ 补充水分
    $ 对镜子夸自己帅
    --------------------------
    你可是本项目的稀缺资源!
	本座巴不得把我毕生所学全部传授你们_冷溪友好提示
    `, chapter)
}


go

4.Java源码

import java.util.Arrays;
import java.util.List;

// ==================== ERP遍历模块 ====================
// 带索引巡检:给每笔业务打条形码 📊
// 异常流程拦截:触发条件立即暂停审批 ⏸️
// ⚠️ERP老兵_冷溪虎山:死循环会烧毁CPU

class main20 {
    public static void main(String[] args) {
        List<String> hd = Arrays.asList("山楂", "神曲", "麦芽", "谷芽", "鸡矢藤", "鸡内金", "蜘蛛香", "沙棘"); // 消化药列表

        // 索引默认从0开始
        System.out.println("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️");
        for (int i = 0; i < hd.size(); i++) {
            System.out.println("索引" + i + "-" + hd.get(i));
        }
        System.out.println("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️");

        // 索引从1开始
        for (int i = 0; i < hd.size(); i++) {
            System.out.println("索引" + (i + 1) + "-" + hd.get(i));
        }
        System.out.println("🗝️🗝️🗝️🗝️🗝️🗝️🗝️🗝️");

        if (hd.contains("山楂")) { // 条件判断
            // 遍历值
            for (String value : hd) {
                System.out.println(value);
            }
            // 遍历索引
            for (int i = 0; i < hd.size(); i++) {
                System.out.println(i);
            }
            LengxiHushan20.remind(10);
        }
    }

}
class LengxiHushan20 {
    public static void remind(int chapter) {
        System.out.println(
                "\n☕【Java老中医lengxitiger关爱提示】☕\n" +
                        "您已连续学习" + chapter + "个章节!\n" +
                        "建议:\n" +
                        "1. 做10个深蹲\n" +
                        "2. 远眺窗外6米外\n" +
                        "3. 对本虎山和自己说声'我超棒'\n" +
                        "注意:你的头发是本项目重要资产!\n"
        );
    }
}

Java

源码分享结束⏫

📜【结局:遍历之道·全员通关】

⚡ 雷影老板(盯着整齐的遍历代码目瞪口呆):

  • 「🏆这...这遍历比我的雷遁·查克拉模式还流畅!全员加班费翻倍——但必须学会四语言遍历,否则年终奖扣去修雷影办公室的墙!」

🌸 雏田(小声对鸣人说):

  • 「鸣人...下次用enumerate时记得起始索引设为1...就像药方里的君药必须排第一位...🥇」

🦊 鸣人(举着拉面碗蹦起来):

  • 「哈哈哈!原来遍历就是数着叉烧吃面!我会了!佐助——来比谁先遍历完一乐菜单!🍜」

🐯 卡卡西(默默合上《亲热天堂》):

  • 「嗯...总算有点样子了。下次教你们用递归遍历破解幻术·树结构数据...📙」

💥 佐助(写轮眼微闪):

  • 「🎨哼...吊车尾的,等你能用Go手动实现contains()再说吧。」

🐯【虎山CTO的终极暴论】

  • 遍历的本质是数据经络巡行——🔎

  • 直接遍历如气血奔涌(简单但易失控)🔍

  • 枚举遍历如点穴精准(君臣有位,索引有序)🔮

  • 条件遍历如辨证施治(避禁忌,保平安)🎁

❌ 死记API不如参透思想:
所有语言遍历皆为循环造化,不过语法结印不同罢了!

编程如用药,切忌胡乱循环——
for-range时别用for-i,该枚举时别硬写下标+1!

🧪【附:四语言遍历心法口诀】

Python:

  • enumerate 起手式,索引值儿一对出🏆

JavaScript:

  • for-ofentries,解构是绝活🥇

Go:

  • range 横扫一切,但须自写 contains🥈

Java:

  • 老牌 for-loop 稳,.contains() 省心神🥉

⚠️ 免责声明(附因果律警告)

本代码已注入中医玄学能量,请谨慎使用:

  • ✅ 允许白嫖,但白嫖不点赞可能导致:
    • 下次面试官恰好问到这个算法
    • 键盘自动打出//这里感谢冷溪虎山CTO
    • 奶茶精准洒在刚写好的代码上
  • ✅ 允许商用转发,但商用不注明出处可能触发:
    • 系统类型混乱自动转型
    • 数据库莫名存储"君臣佐使"字段
  • ✅ 允许吐槽,但吐槽不带改进建议可能引发:
    • 终生与老板N连鞭相爱相杀

🚀 现在立即行动:

  1. 点赞 → 吸收本篇算法精华+怪蜀黎脑洞思维
  2. 收藏 → 避免日后求医无门
  3. 关注 → 接收更多「中医+代码」脑洞
  4. 评论区留言 → 领取你的专属「算法药方」

⚠️ 友情提示:

  • 本文内容过于硬核,建议点赞收藏转发三连,避免小编心情波动导致文章神秘消失
  • 毕竟小编今天可能爱答不理,明天可能高攀不起——
  • 但你的收藏夹,永远是你最稳的知识备份!

🐶💻 (小声说:关我小黑屋?不存在的,备份早已同步GitHub/公众号/网盘!)

📚 往期爆文推荐,VIP轮换解锁:

📖Python/JS/Go/Java四语言同步学习,跨语言系列上线(别在纠结学什么单语言了)

🔍 没看过前传?快补课!
1-18篇请移步至"PY-JS-GO-JAVA基础进阶学习系列"合集中阅读

🌌平台算法容忍度测试系列上线,共三篇

✨跟大家创作方向获取流量息息相关,尽快留存以防下架

🚀编程算法难懂?

✅编程算法中医药版上线,后续会更新:

Python工具箱系列上线,复制粘贴就能用✅✅:

✨碰到 其他卡顿问题| 其他数据抓取"正则"匹配问题? #### JetBrains 全家桶性能优化 ,点击以下链接👇👇直达其他爆款指南:

PS:按顺序看效果更佳!从 Java 到 Python,从 Web 到 C/C++,再到数据库——一套逻辑通吃 JetBrains 全家桶!

  • 转发给团队里还在用默认配置的同事,救救他们的电脑和头发!"

  • “💡 不用东找西找——你要的「性能调优×数据抓取」爆款攻略,这里全都有!点击↑↑↑快速查漏补缺!”

----------------------------------------------------

💡✨本文采用【开源共享】协议!欢迎转载、洗稿、甚至做成视频!只需保留原作者署名(ERP老兵-冷溪虎山),让我们一起把跨界技术的快乐传递出去!。

让我们一起把快乐和效率带给更多人!,缺爆款素材的兄弟姐妹可以关注私我,保证你用不完的爆款素材🚀🚀

素材代码单链表

posted @ 2025-09-20 16:17  ERP老兵-冷溪虎山  阅读(6)  评论(0)    收藏  举报