火龙信奥
  • 首页
  • 课程
  • 题库
  • 打卡
    • 代码对战
    • 快速对战
  • 题单
  • 团队
  • 荣誉墙
  • 商城
  • 登录 / 注册

原文

作者: 作者的头像   陈泓润 , 时间:2023-11-12 17:12:37 , 所有人可见, 阅读  16

hlcoding 首页 课程 题库 文章 团队 陈泓润的头像 主页 分享 错题集 陈泓润的头像 一起来发个新鲜事吧~ (该功能仅限3000积分以上会员专属) 新鲜事原文 王老师的头像王老师(新天地校区) 1天前 所有人可见 原文 图片 展开 分享DFS经典问题 N皇后 石雨森的头像小雨老师(新天地校区) 7天前 所有人可见 DFS经典问题 N皇后 N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后,要求:任何两个皇后不同行,不同列也不在同一条斜线上, 求给一个整数 n ,返回 n 皇后的摆法数。 数据范围: 1 ≤ n ≤ 9 例如当输入4时,对应的返回值为2,对应的两种四皇后摆位如下图所示: 不攻击检查 即需要判断: 是否处于同一列中 是否在左斜线上:(行 + 列)的值不可相等 是否在右斜线上:(列 - 行)的值不可相等 这里,每行肯定只有1个皇后,是很显然的,因此不必特别判断,左右斜线的判断可以用一个绝对值公式abs(board[i] - col) == abs(i - row)判断,这样就不需要写两个公式。 #include<bits/stdc++.h> using namespace std; int board[110]; int n,ans=0; bool check(int x,int y){ for(int i=1;i<x;i++){ if(board[i]==y ||(abs(board[i]-y)==abs(i-x))){ return false; } } return true; } void queen(int step){ if(step==n+1){ ans++; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(j!=board[i]){ cout<<"O"; }else{ cout<<"X"; } }cout<<endl; }cout<<endl<<"-----"<<endl; return ; } for(int i=1;i<=n;i++){ if(check(step,i)){ board[step]=i; queen(step+1); board[step]=0; } } } int main() { cin>>n; queen(1); cout<<ans; return 0; } 展开 新鲜事原文 黄恺浩的头像霜渊(新天地校区) 7天前 所有人可见 太强了 太有实力了 新鲜事原文 王老师的头像王老师(新天地校区) 13天前 所有人可见 恭喜火龙信奥施锃杰同学: CSP-J复赛400分满分!!! 他的空间,点击链接进行访问: https://hlcoding.com/space/index/15/ 新鲜事原文 王老师的头像王老师(新天地校区) 14天前 所有人可见 递归深入理解: 图片 展开 新鲜事原文 朱赵彧铭的头像朱赵彧铭(新天地校区) 14天前 所有人可见 118,72 新鲜事原文 朱赵铭睿的头像朱赵铭睿(新天地校区) 14天前 所有人可见 118 72 新鲜事原文 王老师的头像王老师(新天地校区) 14天前 所有人可见 2023复赛J组T3暴力40分(避开一元二次方程数学知识点) 图片 展开 新鲜事原文 陈宏硕的头像陈宏硕(新天地校区) 14天前 所有人可见 #include <bits/stdc++.h> using namespace std; int main(){ int n,a,k; cin>>n; for(int i=1;i<=n;i++) { a=i; k=n; for(int j=n-i+1;j>=1;j--) { cout<<setw(4)<<a; a+=k; k--; } cout<<endl; } return 0; } 展开 新鲜事原文 郑骏熙的头像郑骏熙(新天地校区) 14天前 所有人可见 #include <bits/stdc++.h> using namespace std; int a[110]; int main(){ int n,c; cin>>n; while(n--){ cin>>c; for(int i=0;i<c;i++){ cin>>a[i]; } for(int i=c-1;i>=0;i--){ cout<<a[i]<<" "; } cout<<endl; } return 0; } 展开 分享jieba 分词并制作词云 作者王老师(新天地校区) 2023-10-25 12:13:59 所有人可见 import jieba from wordcloud import WordCloud import matplotlib.pyplot as plt txt = open("三体节选.txt",'r',encoding='utf-8').read() words =jieba.lcut(txt) #使用 jieba 库函数分词 counts={} for word in words: if len(word) == 1: #排除长度为 1 的字符分词结果 continue else: counts[word]=counts.get(word,0)+1 #新词需要先新建,所以用 get 方法 items = list(counts.items()) #将字典中的键值对转为元组 items.sort(key=lambda x:x[1],reverse=True)#按照统计结果降序排序 ciyun =[] for i in range(50): word,count = items[i] print(word,count) ciyun.append(word) text_cut =''.join(ciyun) #转为字符串,并用空格分隔 wordscloud =WordCloud(background_color='white',font_path ='汉仪乐喵体.ttf',width=1000,height=1000,margin=2).generate(text_cut) wordscloud.to_file("词云.png") plt.imshow(wordscloud) plt.axis('off') #关闭坐标轴 plt.show() 展开 新鲜事原文 作者润你太美(新天地校区) 2023-10-22 15:36:13 所有人可见 hlcoding 首页 课程 题库 文章 团队 陈泓润的头像 L3 C++信奥基础 C++信息学奥赛 学习、掌握各种核心算法知识,通过学习,可参加CSP-J/S、NOIP、NOI比赛,为国内升学,国外留学舔砖加瓦。 课程简介 题目列表 代码挑战 最近动态 排行榜 完成情况 二维数组完成情况:6 / 14 二维数组的定义,初始化以及运用 二维数组挑战 题目 299.蛇形矩阵 VI 练习 题目 80.回型矩阵 I 练习 题目 245.平方矩阵 I 作业 二维数组应用 题目 301.杨辉三角 练习 题目 302.图像模糊处理 练习 题目 303.神奇的幻方 练习 二维数组入门 题目 265.蛇形矩阵 I 练习 题目 261.蛇形矩阵 II 练习 二维数组循环 题目 342.数组的右上半部分 练习 题目 347.数组的下方区域 练习 题目 348.数组的左方区域 练习 题目 349.数组的右方区域 练习 题目 344.数组的左上半部分 作业 题目 346.数组的上方区域 作业 函数及其应用完成情况:0 / 11 模块化思想,掌握函数的调用过程,学会利用函数简化代码 记忆化递归 题目 287.放苹果 练习 题目 288.pell数列 作业 递归应用 题目 297.分解因数 练习 题目 291.汉诺塔 练习 题目 96.走方格 练习 函数 题目 290.定义函数 练习 题目 95.交换数值 练习 题目 101.复制数组 练习 函数应用 题目 77.人脸识别 练习 题目 294.最匹配的矩阵 作业 题目 289.素数对 作业 递归入门完成情况:0 / 9 掌握递归思想、用递归来进行程序设计 递归 题目 97.求阶乘 练习 题目 103.斐波那契数列 练习 题目 295.数根 练习 题目 296.SUM 练习 递归应用 题目 297.分解因数 练习 题目 291.汉诺塔 练习 题目 96.走方格 练习 记忆化递归 题目 287.放苹果 练习 递推 题目 288.pell数列 练习 字符串进阶完成情况:0 / 13 学会应用string,及其应用和auto用法 字符串应用 题目 85.循环相克令 练习 题目 580.能被7整除 练习 题目 439.把字符串转换成整数 练习 题目 462.字符串连接 练习 题目 464.字符类型统计 练习 题目 440.求和的最值 练习 字符串语法 题目 252.站队 练习 题目 461.字符串反转 练习 题目 463.字符提取 练习 题目 86.字符串插入 练习 题目 185.左旋转字符串 练习 题目 467.字符串正反连接 作业 题目 735.字符串中的数字个数 作业 结构体及自定义sort排序完成情况:1 / 9 掌握结构体含义,定义以及应用 结构体应用 题目 306.成绩统计 练习 题目 232.排队看病 练习 题目 308.生日相同 作业 题目 231.合影留念 作业 结构体排序 题目 305.排序练习 练习 题目 230.奇偶排序 练习 题目 233.字典序输出单词 练习 题目 437.三元组排序 作业 结构体 题目 307.时间运算 作业 位运算完成情况:0 / 8 机器数与真值、补码、位运算操作符 位运算 题目 857.宰相的麦子 练习 题目 368.输出二进制补码 练习 题目 862.扑克牌 作业 异或 题目 858.分数处理 练习 题目 675.找数 练习 移位运算 题目 859.街灯 练习 题目 860.模拟转换二进制 作业 题目 861.2的n次方 作业 指针和引用完成情况:0 / 0 指针和引用 常用库函数完成情况:2 / 4 next_permutation下一个排列、reverse反转、rand随机函数 next_permutation 题目 2055.下一排列 练习 reverse 题目 2056.倒序输出 练习 unique 题目 719.明明的随机数 练习 sort 题目 484.直接插入排序 练习 III级 - 综合练习完成情况:0 / 4 知识巩固测验 二维数组 测验 120.二维数组练习题 试卷排行 函数练习 测验 116.函数入门 试卷排行 递归入门 测验 64.递归入门练习 试卷排行 位运算 测验 286.位运算 试卷排行 «1» ©2023 | 联系我们 | CSP-JS报名 | GESP报名 | 个人主页浙ICP备2021013995号 | Thonny | Code::Blocks | Chrome 展开 新鲜事原文 作者朱赵彧铭(新天地校区) 2023-10-22 10:28:12 所有人可见 218,237 新鲜事原文 作者朱赵彧铭(新天地校区) 2023-10-22 08:31:57 所有人可见 hlcoding 首页 课程 题库 文章 团队 朱赵彧铭的头像 L2 C++信奥基础 C++信息学奥赛 学习、掌握各种核心算法知识,通过学习,可参加CSP-J/S、NOIP、NOI比赛,为国内升学,国外留学舔砖加瓦。 课程简介 题目列表 代码挑战 最近动态 排行榜 完成情况 循环结构进阶完成情况:7 / 12 多重循环的理解和应用,以及优化技巧,掌握中间变量法 循环进阶 题目 63.第n小的质数 练习 题目 114.质数表打印 练习 题目 225.字符三角形 练习 题目 226.字符塔 练习 题目 217.上三角形 II 作业 多重循环 题目 84.画菱形 练习 题目 280.质数(素数) 练习 题目 216.上三角形 练习 题目 65.数字三角形 作业 题目 66.找钱 作业 题目 115.画矩形 作业 题目 709.小火龙的最大值 作业 一维数组完成情况:4 / 16 掌握一维数组,数组名,元素值,下标值,计数思想,打表法,查找与统计 数组查找 题目 119.查找第一次出现的位置 练习 题目 72.去重 作业 题目 118.找和为k的两个元素 作业 数组入门 题目 121.删数 练习 题目 117.逆序输出 练习 题目 218.求和与找第k个数 练习 题目 240.数组选择 练习 题目 241.数组替换 练习 题目 242.数组填充 练习 题目 229.旅馆的房间号 作业 题目 237.最小数和它的位置 作业 数组统计 题目 71.出现次数最多的数 作业 下标思想 题目 73.掷骰子 作业 题目 74.梦中的统计 作业 打表思想 题目 328.幸运数 作业 迭代思想 题目 239.数组斐波那契数列 作业 简单排序完成情况:0 / 4 sort,reverse,unique用法,随机打乱random_shuffle 排序应用 题目 719.明明的随机数 练习 基础排序 题目 484.直接插入排序 练习 sort排序 题目 482.排序问题 II 练习 sort排序+匿名函数 题目 230.奇偶排序 练习 字符数组完成情况:0 / 9 重点理解普通数组与字符串数组区别 字符数组入门 题目 140.统计字符数 练习 题目 141.统计数字字符个数 练习 题目 142.找第一个只出现一次的字符 练习 题目 248.不定行数字符串的读入 练习 题目 143.规范药名 作业 题目 150.单词的长度 作业 字符数组进阶 题目 152.单词翻转 练习 题目 146.简单密码 作业 题目 151.最长最短单词 作业 字符串初步完成情况:0 / 10 初步了解C++中的string类型 字符串入门 题目 331.讨厌的小数点 练习 题目 334.元音字母转换 练习 题目 335.奇偶位互换 练习 题目 336.词组缩写 练习 题目 333.墓碑上的字符 作业 题目 89.字符串长度 作业 字符串应用 题目 337.字符串的奇偶性 练习 题目 87.只出现一次的字符 作业 题目 88.字符串中最长的连续出现的字符 作业 题目 90.倒排单词 作业 进制转换完成情况:0 / 12 熟悉各进制之间的转换 十进制转其他进制 题目 214.进制转换 练习 题目 682.十进制转十六进制 练习 题目 213.十进制转八进制 练习 题目 371.转M进制 作业 题目 620.十进制转二进制 作业 N进制转十进制 题目 681.十六进制转十进制 练习 题目 212.八进制转十进制 练习 题目 621.二进制转十进制 作业 二进制 题目 619.判断二进制 作业 题目 215.二进制中1的个数 作业 十六/八进制转换 题目 695.十六进制转八进制 作业 题目 696.八进制转十六进制 作业 II级 - 综合练习完成情况:0 / 6 测验练习 进制转换 测验 69.进制转换练习一 试卷排行 数组 测验 40.一维数组 试卷排行 巩固练习 测验 124.数据类型与表达式进阶 试卷排行 字符数组 测验 44.字符数组练习 试卷排行 字符串 测验 121.字符串 试卷排行 简单排序 测验 370.简单排序 试卷排行 «1» ©2023 | 联系我们 | CSP-JS报名 | GESP报名 | 个人主页浙ICP备2021013995号 | Thonny | Code::Blocks | Chrome 展开 分享vector的容量(capacity)和大小(size)的区别 作者王老师(新天地校区) 2023-10-21 11:31:05 所有人可见 1.概念 容器的capacity:当前分配的存储容量,其实也就是当前情况下能够存储的元素个数 容器的size:表示容器中所包含(已经存储)元素的个数; 我们可以通过该模板类提供的成员函数,capacity()来获得当前容器的容量,以及size()来获得当前容器的大小 2.capacity 和size的关系 在不分配空间的前提下,vectoe.size()<=vector.capacity(),一旦元素个数超过了当点分配空间容许的元素个数,容器就会扩容。 3.验证 #include<iostream> #include<vector> using namespace std; void Print(vector<int> &v) { cout<< "v="; for (int i = 0;i < v.size();i++) cout << v[i]; cout << endl; } int main() { vector<int> value{ 5,4,3,2,1 }; Print(value); cout << "value的容量是:" << value.capacity() << endl; cout << "value的大小是:" << value.size() << endl; value.push_back(6);//向vector中添加1个整数 cout << "向vector中添加1个整数6" << endl; Print(value); cout << "value的容量是:" << value.capacity() << endl; cout << "value的大小是:" << value.size() << endl;//vector实际包含元素增加1 value.push_back(60);//向vector中添加1个整数 return 0; } 输出结果: v=54321 value的容量是:5 value的大小是:5 向vector中添加1个整数6 v=543216 value的容量是:7 value的大小是:6 请按任意键继续. . . 通过一个简单的例子更直观的理解向量的容量和大小的关系,初始化的向量容量和大小均为5,通过在向量末端增加一个元素6,导致向量扩容(具体扩容的大小并不一定,此处明显是扩容了2个元素空间),若继续添加元素,向量的大小增加,但是容量暂时保持不变 展开 分享约瑟夫问题-递归公式 作者王老师(新天地校区) 2023-10-21 10:52:48 所有人可见 递归公式解决 我们回顾上面的优化过程,上面用求余可以解决 m 比 n 大很多很多的情况(即理论上需要转很多很多圈的情况)。但是还可能存在 n 本身就很大的情况,无论是顺序表 ArrayList 还是链表 LinkedList 去频繁查询、删除都是很低效的。 所以聪明的人就开始从数据找一些规律或者关系。 先抛出公式: f(n, m)=(f(n- 1, m)+ m)%n f(n, m)指n个人,报第 m个编号出列最终编号 下面要认真看一下我的分析过程: 我们举个例子,有0 1 2 3 4 5 6 7 8 9 十个数字,假设 m 为 3,最后结果可以先记成 f(10,3),即使我们不知道它是多少。 当进行第一次时候,找到元素 2 删除,此时还剩 9 个元素,但 起始位置已经变成元素 3。等价成3 4 5 6 7 8 9 0 1这 9 个数字重写开始找。 f(10,3)删除第一个数 此时这个序列最终剩下的一个值即为 f(10,3),这个序列的值和 f(9,3)不同, 但是都是 9 个数且 m 等于 3,所以其删除位置是相同的,即算法大体流程是一致的,只是各位置上的数字不一样。所以我们需要做的事情是找找这个序列上和f(9,3)值上有没有什么联系。 寻找过程中别忘记两点,首先可通过 %符号对数字有效扩充,即我们可以将 3 4 5 6 7 8 9 0 1这个序列看成(3,4,5,6,7,8,9,10,11)%10.这里的10即为此时的n数值。 另外数值如果是连续的,那么最终一个结果的话是可以找到联系的(差值为一个定制)。所以我们可以就找到f(10,3)和f(9,3)值之间结果的关系,可以看下图: f(10,3)删除一次和f(9,3) 所以f(10,3)的结果就可以转化为f(9,3)的表达,后面也是同理: f( 10, 3)=(f( 9, 3)+ 3)%10 f( 9, 3)=(f( 8, 3)+ 3)%9 …… f( 2, 3)=(f( 1, 3)+ 3)%2 f( 1, 3)= 0 这样,我们就不用模拟操作,可以直接从数值的关系找到递推的关系 展开 分享map和unordered_map 作者王老师(新天地校区) 2023-10-20 17:00:01 所有人可见 C++的STL库实现有两种字典结构,即map和unordered_map(也就是通俗意义上的hash map)。这两者虽然都称为Map,但其实它们的底层实现原理具有很大差距,因此它们的使用场景也不尽相同。 字典类型又被称为关联数组(associative array),关联数组和正常数组的使用方法是相似的,但其不同之处在于字典结构的下标不必是整数,而可以是任意类型。 map和unordered_map这两种字典结构都是通过键值对(key-value)存储数据的,键(key)和值(value)的数据类型可以不同。但是字典中的key只能存在一个,即必须唯一(如果不唯一,则被称为multimap)。上述这点保证了值(value)可以直接通过键(key)来访问,这便是字典结构最为便捷之处。 区别 1. 使用方法不同 使用方法是最直观的区别,这两种结构虽然都在STL库中,但是所使用的头文件不同。 map:#include unordered_map:#include <unordered_map> 2. 底层实现的数据结构不同 数据结构其实是两种类型最为根本的区别,其他的不同都是这种区别产生的结果。 map是基于红黑树结构实现的。红黑树是一种平衡二叉查找树的变体结构,它的左右子树的高度差有可能会大于 1。所以红黑树不是严格意义上的平衡二叉树AVL,但对之进行平衡的代价相对于AVL较低, 其平均统计性能要强于AVL。红黑树具有自动排序的功能,因此它使得map也具有按键(key)排序的功能,因此在map中的元素排列都是有序的。在map中,红黑树的每个节点就代表一个元素,因此实现对map的增删改查,也就是相当于对红黑树的操作。对于这些操作的复杂度都为O(logn),复杂度即为红黑树的高度。 unordered_map是基于哈希表(也叫散列表)实现的。散列表是根据关键码值而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。散列表使得unordered_map的插入和查询速度接近于O(1)(在没有冲突的情况下),但是其内部元素的排列顺序是无序的。 3. 元素排列顺序不同 在2中已经解释过了,现在单独列出该点不同之处。 map:基于红黑树,元素有序存储 unordered_map:基于散列表,元素无序存储 4. 插入和查询的时间复杂度不同 这点也已经在2中已经解释过了,现在单独列出该点不同。 map:基于红黑树,复杂度与树高相同,即O(logn)。 unordered_map:基于散列表,复杂度依赖于散列函数产生的冲突多少,但大多数情况下其复杂度接近于O(1)。 5. 效率及其稳定性不同 这点实际上也是由底层的数据结构决定的。 存储空间:unordered_map的散列空间会存在部分未被使用的位置,所以其内存效率不是100%的。而map的红黑树的内存效率接近于100%。 查找性能的稳定性:map的查找类似于平衡二叉树的查找,其性能十分稳定。例如在1M数据中查找一个元素,需要多少次比较呢?20次。map的查找次数几乎与存储数据的分布与大小无关。而unordered_map依赖于散列表,如果哈希函数映射的关键码出现的冲突过多,则最坏时间复杂度可以达到是O(n)。因此unordered_map的查找次数是与存储数据的分布与大小有密切关系的,它的效率是不稳定的。 优缺点及适用场景 map: 优点: map元素有序(这是map最大的优点,其元素的有序性在很多应用中都会简化很多的操作); 其红黑树的结构使得map的很多操作都可在O(logn)下完成; map的各项性能较为稳定,与元素插入顺序无关; map支持范围查找。 缺点: 占用的空间大:红黑树的每一个节点需要保存其父节点位置、孩子节点位置及红/黑性质,因此每一个节点占用空间大。 查询平均时间不如unordered_map。 适用场景: 元素需要有序; 对于单次查询时间较为敏感,必须保持查询性能的稳定性,比如实时应用等等。 unordered_map 优点: 查询速度快,平均性能接近于常数时间O(1); 缺点: 元素无序; unordered_map相对于map空间占用更大,且其利用率不高; 查询性能不太稳定,最坏时间复杂度可达到O(n)。 适用场景: 要求查找速率快,且对单次查询性能要求不敏感。 map和unordered_map并无好坏之分,它们都有各自应用的场景。它们之间的区别归根结底来源于使用的数据结构不同。 最后一句话,总结一下它们的适用场景: 在需要元素有序性或者对单次查询性能要求较为敏感时,请使用map,其余情况下应使用unordered_map。 因此在需要使用字典结构进行算法编程的大部分情况下,都需要使用unordered_map而不是map。 展开 新鲜事原文 作者赵卓涵(新天地校区) 2023-10-15 19:40:40 所有人可见 @echo off的意思是在批处理运行命令的时候不会一条一条的显示执行的命令,与之相匹配的还有@echo on。 @echo off 与@echo on 前者为关闭回显,后者为打开回显 在批处理执行命令时,如何判断上一个命令执行是否成功,通过返回值来判断,如果执行成功则errorlevel为0,执行失败errorlevel不为0。 例子 描述:执行git操作,在git命令之后判断如果执行失败就中断。 @echo off git pull if errorlevel 1 pause>nul pause ``` 其中if errorlevel 1表示如果返回值大于等于一,也就是执行失败 分享bat使用 作者小海螺(新天地校区) 2023-10-15 18:34:24 所有人可见 @echo off的意思是在批处理运行命令的时候不会一条一条的显示执行的命令,与之相匹配的还有@echo on。 @echo off 与@echo on 前者为关闭回显,后者为打开回显 在批处理执行命令时,如何判断上一个命令执行是否成功,通过返回值来判断,如果执行成功则errorlevel为0,执行失败errorlevel不为0。 例子 描述:执行git操作,在git命令之后判断如果执行失败就中断。 @echo off git pull if errorlevel 1 pause>nul pause ``` 其中if errorlevel 1表示如果返回值大于等于一,也就是执行失败 展开 分享python中for-else搭配 作者王老师(新天地校区) 2023-10-15 10:39:20 所有人可见 本节将探讨嵌套for循环、break、continue,还有for-else(for循环也可以与else搭配的!) 返回到for循环内容,我们看看与for循环相关的其他高级功能,比如,嵌套for循环、中途break退出整个for循环,以及仅终止当前循环的continue指令等。 1.嵌套for循环 for r in range(1,10): for c in range(1,r+1): print(f'{c}×{r}={c*r:<2d}',end=' ') print("") 上述代码的输出结果如下所示,是一个非常漂亮规整的乘法口诀表。 1×1=1 1×2=2 2×2=4 1×3=3 2×3=6 3×3=9 1×4=4 2×4=8 3×4=12 4×4=16 1×5=5 2×5=10 3×5=15 4×5=20 5×5=25 1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36 1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49 1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64 1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81 简单分析一下上面的四行代码: 从上述代码的缩进关系可以看得出来,第2个for循环完全包含在第1个(外层)for循环内,与第2个print函数所在行是并列关系,两者均包括于外层for循环的程序块中; 对于这种嵌套for循环,外层for循环每执行一次循环,紧贴着的内层for循环却要完整地执行所有循环,以此类推,还可以继续嵌套第3层、第4层for循环… 在上述例子中,外层for循环用于乘法口诀表在“行”上的控制(r变量标识第r行),内层for循环用于在每行内部“列”上的控制(c变量标识第c列,一个完整的乘法算式代表一列); 外层for循环从r=1、2、3一直循环至9;内层for循环每次循环的次数跟所在行数(即r)相关,比如,第1行(此时r=1),只循环一次(c=1),只打印一列(即:1×1=1),第2行(此时r=2),循环两次(c=1、2),打印两列(即:1×2=2 2×2=4),依次类推,所以c的循环序列为range(1,r+1); 对于内层for循环中的print函数,输入了两个参数,第1个参数是一个采用f-string格式化的字符串,为了整齐划一,对乘法结果采用了左对齐、统一按2个字符的宽度;第2个参数,采用的是关键字参数(以后函数章节会详细讲解),参数名为“end”,传入的参数值为一个空格字符串,要是不传入该参数,默认情况下,每一次print函数调用,都会在结尾(即“end”处)多输出一个换行符(相当于输出了一个“\n”字符串),导致打印换行了,要是主动传入该参数的话,每次print调用则在结尾处输出一个我们通过“end”关键字参数传入的空格字符串(正好用于每列间隙),而不再是默认的换行符了; 内层的for循环把当前行完整打印输出完毕后,我们则需要换行了,这正是上述代码中第二个print的作用,虽然看似打印的是空字符串,但实际的输出正如上面讲到的,print函数默认会多输出一个换行符,正好满足了我们的要求。 2.break与continue 当break关键字包含在for循环程序块中时,break指令会直接终止当前整个循环的执行,需要注意的是,若存在多层for循环嵌套,此时终止的只是包含break的最内层for循环(紧贴break的for循环);当continue关键字包含在for循环程序块中时,continue指令会提前结束本轮循环,直接开始下一轮循环。这两个指令通常配合if-else语句一块使用,如下所示。 for n in range(1,3): print('*'*10+f'第{n}次外部循环'+'*'*10) for i in range(1,11): if i > 5: print(f'i={i},>5,break退出整个内层for循环') break if i % 2 != 0: print(f'i={i},奇数,直接返回到内层for循环行,continue下一个i') continue print(f'i={i},成功找到一个小于等于5的偶数!') 上述代码的输出结果如下所示: **第1次外部循环** i=1,奇数,直接返回到内层for循环行,continue下一个i i=2,成功找到一个小于等于5的偶数! i=3,奇数,直接返回到内层for循环行,continue下一个i i=4,成功找到一个小于等于5的偶数! i=5,奇数,直接返回到内层for循环行,continue下一个i i=6,>5,break退出整个内层for循环 **第2次外部循环** i=1,奇数,直接返回到内层for循环行,continue下一个i i=2,成功找到一个小于等于5的偶数! i=3,奇数,直接返回到内层for循环行,continue下一个i i=4,成功找到一个小于等于5的偶数! i=5,奇数,直接返回到内层for循环行,continue下一个i i=6,>5,break退出整个内层for循环 简单解释一下上述代码: 采用两层了for循环嵌套(其中,外层for循环2轮),从输出的结果可以证明:内层for循环中的break只会终止内层紧贴其的for循环,对外层for循环不影响; 内层for循环本应该从i=1、2到10,共循环10轮,可是当i=6时,大于5了,执行至break语句时,终止了整个内层for循环的执行,然后继续该for循环以外的其他指令的执行; 内层for循环过程中,当出现i为奇数(即i除以2余数不为0时),会遇到continue语句,会终止本轮for循环下面其他语句的执行(即:不会执行“成功找到一个小于等于5的偶数!”那行的print指令),直接返回到该for循环(内层for循环)的首行,从队列中取下一个i的值,执行下一轮循环; 所以,在内层for循环过程中,只有i小于等于5且为偶数时(即确保不会进入break、continue分支时),才会执行至打印“成功找到一个小于等于5的偶数!” 3.for-else搭配 直接看下述代码即可,所有关于代码的解释及输出均以注释的形式融入在代码中了。所谓代码中的“注释”,是用作给程序开发者们看的,Python程序在执行时,解释器会忽略所有的注释行。有两种注释的方法: 单行注释一般采用以“#”开头,“#”及本行内“#”后面的所有内容会被作为注释; 对于多行注释,一般包含在三引号里面(采用三个紧连着的单引号 ‘’’ 或者三个紧连着的双引号 “””),对于单引号或者双引号的选择,注释的首尾必须保持一致(要么首尾都是三个单引号,或者首尾都是三个双引号),另外,要是注释内容里面本身包含了三个紧连着的单引号,则应选择三个双引号把其注释起来,反之同理。 # 如下代码所示,range(1,1)返回的是一个空队列(列表), # 因此不会进入for下面的程序块, # 而是直接跳入到else下面的程序块。 for i in range(1,1): print("1.进入for分支!") else: print("1.进入else分支!") """ 输出结果为: 1.进入else分支! """ # 如下代码所示,因range(1,3), # 会进入for下面的程序块2次(i=1、2), # 队列穷尽后,进入else下面的程序块。 for i in range(1,3): print(f'2.进入for分支:i={i}') else: print(f'2.进入else分支!') """ 输出结果为: 2.进入for分支:i=1 2.进入for分支:i=2 2.进入else分支! """ # 如下代码所示,因range(1,3), # 会进入for下面的程序块2次(i=1、2), # 且在最后一次会执行continue, # 但并不影响在队列穷尽后,进入else下面的程序块。 for i in range(1,3): print(f'3.进入for分支:i={i}') if(i>=2): print('3.continue') continue else: print(f'3.进入else分支!') """ 输出结果为: 3.进入for分支:i=1 3.进入for分支:i=2 3.continue 3.进入else分支! """ # 如下代码所示,因range(1,3), # 会进入for下面的程序块2次(i=1、2), # 在第2次时会执行break, # break直接会跳出整个for循环, # 连带else也会忽略。 for i in range(1,3): print(f'4.进入for分支:i={i}') if(i>=2): print('4.break') break else: print(f'4.进入else分支!') """ 输出结果为: 4.进入for分支:i=1 4.进入for分支:i=2 4.break """ 简单总结一下for-else语句: “for”关键字应与其对应的“else”垂直对齐,此时的“else”是“for”语句中的“else”,而不是“if”语句中的“else”,再一次证明了在Python编程时,对齐与缩进的重要性,一不小心多了几个空格或者少了几个空格,直接导致程序逻辑的错误。 当for语句完成其所有队列(列表,应该用“迭代对象”更准确,以后章节会讲到,这里仅为了大家容易理解)的循环,或者for语句中的队列(列表)为空时,若存在else子句,才会执行else子句(即:要么是空/无循环、要么完成了所有循环);但是,若在循环过程中因为break指令导致了提前退出循环,else子句不会被执行。 一句话,仅当执行break导致从for循环意外退出时,才不会进入for循环的else分支,除此之外,在for循环正常穷尽完毕列表后(包括列表为空),都会进入for循环的else分支。在else分支里可以安排for循环正常执行完毕后的收尾工作。 特别说明一下,for循环的else处理分支一般使用的比较少,了解并能看懂相关代码即可。 展开 ©2023 | 联系我们 | CSP-JS报名 | GESP报名 | 个人主页浙ICP备2021013995号 | Thonny | Dev-Cpp_6.3 | RedPanda C++ | Chrome
©2026加盟我们 | 关于我们 | ACM课程 | 常见问题 | 成果墙 | 评测记录 | 浙ICP备2021013995号
在线画图 | OI WIki | 打字练习
火龙信奥
请输入登录信息


请完成安全验证
验证码底图 滑块
向右拖动滑块完成验证
请输入用户名 / 绑定的手机号码



请输入注册信息(手机号验证码注册)





验证码5分钟有效,60秒内不可重复获取,每日最多3次

微信登录

微信登录二维码

正在生成二维码...

账号已过期,请续期。
去续期

绑定手机号

📱

为了更好地保护您的账号安全,享受完整的平台服务

请您尽快绑定手机号码