python for循环的基础及面试题


当前版本:

  • Python 3.8.4

简介

    for 循环是一种重复执行特定代码块的控制流结构。它可以遍历序列(例如列表、元组、字符串)或其他可迭代对象(例如字典、集合)中的元素。每次迭代循环时,会将元素赋值给一个变量,然后执行循环体内的代码。

    本篇文章会从 for 循环的基本到应用详细介绍,包括基本用法、迭代对象和面试题。

        

文章目录如下

1. for循环的作用

2. for循环的语法

2.1. 基本写法

2.2. 跳出循环体

2.3. 单行写法

3. for循环的迭代对象

3.1. 遍历字符串

3.2. 遍历整数

3.3. 遍历列表

3.4. 遍历元组

3.5. 遍历字典

3.6. 遍历集合

3.7. 遍历元素索引

4. 常见面试题

4.1. 整数求和

4.2. 九九乘法表

4.3. 冒泡排序

4.4. 求水仙花数

4.5. 佩波纳契数列


        

1. for循环的作用

    python 中的 for 循环提供了一种便捷且高效的方式来处理数据集合,能够以一种简单的语法结构遍历和处理数据,节省了编写代码的时间和精力。同时,for 循环也使得代码更加可读性强、易于理解和维护,提高了程序的可靠性和可扩展性。
        

举例说明,需要单独处理数字1、2、4、7、8

print("处理数字:1")
print("处理数字:2")
print("处理数字:4")
print("处理数字:7")
print("处理数字:8")

使用 print 举例说明(在实际场景中一般是调用函数处理),如果不使用循环则需要编写5行代码。当需要处理上万行数据时,还能手动去写吗?显然不太现实,所以循环的方式为我们解决了这个问题。使用 for 循环来处理仅需2行代码:

for i in "12478":
    print(f"处理数字:{i}")

        

需要注意的是:for 循环的语法要求迭代对象必须是一个可迭代对象,例如列表、字符串、字典等。不支持直接在 for 循环中直接使用数值或空格分隔的数值。错误的写法:

for i in 12478:
    print(f"处理数字:{i}")

        

当然了,遍历出来的变量并不会因为循环的结束而销毁。例如:循环结束后查看变量 i

# 循环遍历字符串
for i in "12478":
    pass    # 占位符,什么也不做

# 这行代码不在循环中
print(f"当前i的值为:{i}")

  • 遍历的最后一个字符为8,所以变量 i 的最终值就是8 

        

2. for循环的语法

2.1. 基本写法

语法如下:

# for循环遍历一个可迭代对象
for 变量名 in 迭代对象:
    循环体
  • for in 和冒号是固定的语法,不可修改。
  • 迭代对象:俗称被处理的对象,可以是字符串、列表...等。
  • 变量名:自定义的一个名称,将迭代对象遍历出来的值赋值给变量,用于后续处理。
  • 循环体:必须被包含在循环内,需要比 for 多一个缩进。

    将迭代对象理解为一筐苹果,每个苹果都需要检查是否完好,如果苹果是好的,则可以售卖;如果苹果是坏的,则扔掉。

    for 循环可以理解为:将一筐苹果的每一个苹果都拿出来,逐个处理。那么拿出来的这个苹果需要有一个名字,我们将其定义为变量名。有了名字后我们需要检查、处理,处理的方法需要在循环体中进行。

        

为什么循环体必须用缩进呢?

实际上缩进的目的是提供代码的可读性和结构化,使用缩进能够清晰地区分出循环中的代码块,并使代码更易于理解和维护。比如多层嵌套(错误语法):

for i in "AAA":
for j in "BBB":
print("处理事件1")
print("处理事件2")

这样看起来是不是有点头大,如果是更多层级则更是分不清,换成正确的写法:

for i in "AAA":    # 第1层循环
    for j in "BBB":    # 第2层循环
        print("处理事件1")    # 第2层的循环体
    print("处理事件2")    # 第1层的循环体

这种写法也称为多层嵌套,理论上嵌套的层数没有限制,但只要理解规则就能掌握:

  1. 每个for循环都需要有与之对应的缩进代码块,用于表示循环体。
  2. 当有多个for循环嵌套时,每个内层循环的缩进级别都比外层循环的缩进级别多一个缩进倍数,用于明确表示嵌套关系。
  3. 循环变量的命名应该不同,以在内层循环中保持唯一性,并在代码中清楚地标识出每个循环的作用。

        

用多层嵌套举一个房间的例子

for i in "12":    # 楼层数
    for j in "123":    # 每个房间号
        print(f"当前房号为:{i}-{j}")

        

2.2. 跳出循环体

当程序满足某个条件或者达到了预期的目标时,可以跳出循环,避免继续执行不必要的循环迭代,可以提高代码的效率和性能。python 中给出了2种跳出循环的方法:

  • break:跳出整个循环
  • continue:跳出当前循环

        

【案例一】跳出整个循环

for i in "12345":    # 遍历一组数字
    if i == "3":     # 当i为3时,跳出整个循环
        break
    print(f"当前i的值为:{i}")

        

【案例二】跳出当前循环

for i in "12345":    # 遍历一组数字
    if i == "3":     # 当i为3时,跳出当前循环
        continue
    print(f"当前i的值为:{i}")

        

2.3. 单行写法

使用单行表达式的方式来编写 for 循环被称为列表推导(List Comprehension),示例

num = [1, 2, 3, 4, 5]
# 变量 = [循环体  for循环]
squared_num = [x**2 for x in num]
  • for 循环语法不变,将循环体放到 for 前面即可。 

        

如果需要使用条件判断,则

num = [1, 2, 3, 4, 5]
# 变量 = [循环体  for循环  if判断]
even_num = [x for x in num if x % 2 == 0]
  • for 循环后面写 if 判断,循环体仍然放在最前面

        

遍历多层嵌套也是一样的写法

[ print(i,j) for i in range(0,2) for j in range(10,12) ]
[ print(i,j,k) for i in range(0,2) for j in range(10,12) for k in range(20,22) ]

        

注意

    单行写法可以提高代码的简洁性和可读性,但过度使用单行写法可能会导致代码变得难以理解和维护。所以在使用单行写法时,需要在简洁性和可读性之间进行权衡,并根据实际情况选择是否使用。

        

3. for循环的迭代对象

for 循环的迭代对象可以是字符串、整数序列、列表、元组、字典、集合等,本章节将对这几种迭代对象展开介绍。

3.1. 遍历字符串

for 循环可以直接遍历字符串

for i in "1a+bc":    # 遍历字符串
    print(f"当前字符为:{i}")

        

也支持遍历为字符串的变量

var = "1a+bc"
for i in var:    # 遍历变量
    print(f"当前字符为:{i}")

        

遍历字符串是逐个遍历,因此空格也会被遍历

for i in "a b c":    # 遍历字符串
    print(f"当前字符为:{i}")

        

3.2. 遍历整数

for 循环并不能直接遍历整数,而是需要通过 range 函数生成的一个序列来遍历

range 默认从0开始,范围:0 ~ (结束值-1)

for i in range(3):    # 遍历0~2
    print(f"当前数字为:{i}")

        

range 也支持指定开始值和结束值(这个结束值依然是 -1)

for i in range(10,13):    # 遍历10~12
    print(f"当前数字为:{i}")

        

也支持指定间隔,比如遍历10~15,间隔2个

for i in range(10,15,2):    # 遍历10~14, 间隔2
    print(f"当前数字为:{i}")

        

如果要生成一个列表,可以直接使用 range,不需要循环

numbers = list(range(1, 10, 3))

        

3.3. 遍历列表

for 可以直接遍历列表中的元素,比如:

# 定义一个列表
L = ["AAA", "B", 1, 2]

# 遍历这个列表
for i in L:
    print(f"当前元素为:{i}")

        

如果列表中包含列表,会将被包含的列表整个遍历出来

# 定义一个列表
L = ["AAA", "B", [1, 2, 3]]

# 遍历这个列表
for i in L:
    print(f"当前元素为:{i}")

        

被包含的列表 [1,2,3] 还能继续遍历

# 定义一个列表
L = ["AAA", "B", [1, 2, 3]]

# 遍历这个列表
for i in L:
    if type(i) == list:
        # 如果这个元素是列表,则遍历这个元素
        for j in i:
            print(f"当前元素为:{j}")
    else:
        print(f"当前元素为:{i}")

        

3.4. 遍历元组

遍历元组的方法与列表是一样的

# 定义一个元组
T = ("AAA", "B", 1, 2)

# 遍历这个元组
for i in T:
    print(f"当前元素为:{i}")

        

3.5. 遍历字典

字典的元素由键和值组成,所以可以单独遍历,也可以全部遍历

【案例一】遍历键

# 定义一个字典
D = {'a': 1, 'b': 2, 'c': 3}

# 遍历这个字典的键
for i in D:
    print(f"当前键为:{i}")

        

 【案例二】遍历值

# 定义一个字典
D = {'a': 1, 'b': 2, 'c': 3}

# 遍历这个字典的值
for i in D.values():
    print(f"当前值为:{i}")

        

 【案例三】遍历键和值

# 定义一个字典
D = {'a': 1, 'b': 2, 'c': 3}

# 遍历这个字典
for k,v in D.items():
    print(f"当前键为:{k}, 当前值为:{v}")

        

3.6. 遍历集合

遍历集合的方法与列表是一样的

# 定义一个集合
S = {"AAA", "B", 1, 2}

# 遍历这个集合
for i in S:
    print(f"当前元素为:{i}")

需要注意的是:集合是无序的,每次遍历的顺序可能不同。如果需要按照特定的顺序遍历集合,可以使用 sorted() 函数对集合进行排序,然后再进行遍历。

        

3.7. 遍历元素索引

python 中通过 enumerate() 函数来获取对象的索引,这些对象可以是字符串、列表、元组、字典、集合等。

【案例一】输出元素的同时,也输出索引

# 定义一个列表
L = ["AAA", "B", 1, 2]

# 遍历这个列表和它的索引
for index,item in enumerate(L):
    print(f"当前索引为:{index}, 当前元素为:{item}")

        

 【案例二】指定索引的开始值

# 定义一个列表
L = ["AAA", "B", 1, 2]

# 遍历这个列表和它的索引(索引指定从10开始)
for index,item in enumerate(L, start=10):
    print(f"当前索引为:{index}, 当前元素为:{item}")

        

【案例三】遍历字典

# 定义一个字典
D = {'a': 1, 'b': 2, 'c': 3}

# 遍历这个字典的索引、键、值
for index, (key, value) in enumerate(D.items()):
    print(f"索引为:{index}, 键为:{key}, 值为:{value}")

        

4. 常见面试题

4.1. 整数求和

【案例一】求 1-100 相加的和

# 定义一个为0的变量
s = 0

# 遍历1~100
for i in range(1,101):
    # 让这个变量每次加i,也就是用0加上1~100
    s += i

# 输出最后的结果
print(s)

        

【案例二】求 1-100 奇数相加的和

# 定义一个为0的变量
s = 0

# 遍历1~100, 设定间隔2。也就是1.3.5.7...
for i in range(1,101,2):
    # 让这个变量每次加i,也就是用0加上1~100的奇数
    s += i

# 输出最后的结果
print(s)

        

 【案例三】求 1-100 偶数相加的和

# 定义一个为0的变量
s = 0

# 遍历0~100, 设定间隔2。也就是0.2.4.6...
for i in range(0,101,2):
    # 让这个变量每次加i,也就是用0加上0~100的偶数
    s += i

# 输出最后的结果
print(s)

        

4.2. 九九乘法表

# 打印1~9行
for i in range(1, 10):
    # 打印每行的列,第1行最大列为1,第2行最大列为2...第9行最大列为9,所以遍历的最大值随上一循环的增加而增加
    for j in range(1, i+1):
        # 乘积的结果
        result = i * j
        # 打印 n * n = n 的字符串,并将这里的循环体换行替换为制表符
        print(f"{i} * {j} = {result}", end="\t")
    print()  # 横向打印完成后再换行

        

4.3. 冒泡排序

冒泡排序就是对一串数字不断对比,将最大的放到最后面,依次类推。

# 定义一个列表
L = [32, 324, 1, 54, 21, 6]

# 通过索引去获取元素,再将这些元素作比较,大的排后面,小的排前面
for i in range(1, len(L)):
    for j in range(0, len(L) - i):
        if L[j] > L[j+1]:
            L[j], L[j+1] = L[j+1],L[j]
print(L)

        

4.4. 求水仙花数

什么是水仙花数?

一个三位数,这个数 = 个位³ + 十位³ + 百位³

方法一 

# 通过索引的方式获取个位数、十位数、百位数,再转换为int相加,做判断
for i in range(100,1000):
    i = str(i)
    unit = i[0]        #个位数
    tens = i[1]        #十位数
    hundredth = i[2]   #百位数
    if (int(unit)**3 + int(tens)**3 + int(hundredth)**3) == int(i):
        print('水仙花数为:', i, end="\t")
        print(f"说明:{i} = {unit}³ + {tens}³ + {hundredth}³ = ", int(unit)**3, '+', int(tens)**3, '+', int(hundredth)**3)

         

方法二

# 通过整除的办法获取个位数、十位数、百位数,所有值的3次幂再相加,做判断
for i in range (100,1000):
    unit = i % 10              #个位数
    tens = (i // 10) % 10      #十位数
    hundredth = i // 100       #百位数
    if (unit**3 + tens**3 + hundredth**3) == i:
        print('水仙花数为:', i)

        

4.5. 佩波纳契数列

佩波纳契数列为:第1个数 + 第2个数 = 第3个数,以此类推...

  • 例如:1、2、3、5、8...
n1 = 1      #设置第1个数
n2 = 10     #设置第2个数
count = 10  #设置输出次数

for i in range(count):
    print(n1, end= ' ')
    n3 = n1
    n1 = n2
    n2 += n3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/339383.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

scipy通过快速傅里叶变换实现滤波

文章目录 fft模块简介fft函数示例滤波 fft模块简介 scipy官网宣称,fftpack模块将不再更新,或许不久之后将被废弃,也就是说fft将是唯一的傅里叶变换模块。 Fourier变换极其逆变换在数学上的定义如下 F ( ω ) ∫ − ∞ ∞ f ( t ) e − i ω…

C++中的static(静态)

2014年1月19日 内容整理自The Cherno:C系列 2014年1月20日 内容整理自《程序设计教程:用C语言编程 第三版》 陈家骏 郑滔 -----------------------------------------------------------------------------------------------------------------------------…

猛玛LARK M1无线麦克风采用 思远半导体 其实就是蓝牙话筒

自上世纪无线电技术开始发展起来,到了几十年后的今天,无线通讯技术已经成熟,开始追求更好的音质以及用户使用体验,优秀的产品也如雨后春笋般的出现,技术革新,极致音质,竞争也越来越激烈。这时候…

LMDeploy 大模型量化部署实践

文章目录 核心功能量化推理引擎推理服务 量化原理补充 部署: 在设备上运行起来,能够接受输入,返回输出。 最重要的就是性能和效率方面的考虑。大模型也是模型的一种,内存开销大,7b 要14G左右的显存。 因为是自回归的方…

Linux:使用for+find查找文件并cp到其他目录,文件名带有空格

一、场景描述 在终端窗口中,用shell命令,批量拷贝文件到指定目录。 我是在Windows系统上,通过git bash终端来执行shell命令的。 二、实现过程 命令1 for filepath in find /d/LearningMaterials/数学/数学/高中/一数/偏基础(基…

MySQL的下载、安装、配置、登录,配置(图+文)(超级详细)

一、 软件的下载 1. 下载地址 官网: https://www.mysql.com 2. 打开官网,点击 DOWNLOADS 然后,点击 MySQL Community(GPL) Downloads 3. 点击 MySQL Community Server 4. 在 General Availability(GA) Releases 中选择适合的版本 …

基于SpringBoot的智慧社区居家养老健康管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

【Unity小技巧】3D人物移动脚步和跳跃下落音效控制

文章目录 单脚步声多脚步声,跳跃落地音效播放不同材质的多脚步声完结 单脚步声 public AudioClip walkingSound; public AudioClip runningSound;//移动音效 public void MoveSound() {// 如果在地面上并且移动长度大于0.9if (isGround && moveDirection.s…

上位机图像处理和嵌入式模块部署(qt图像处理)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 很多人一想到图像处理,本能的第一反应就是opencv,这也没有错。但是呢,这里面还是有一个问题的,不知…

利用Anaconda安装pytorch和paddle深度学习环境+pycharm安装后不能调用pytorch和paddlepaddle框架

问题现象: 之前安装后不能在添加pytorch和paddlepaddle框架 原因(疑似): 在终端中显示pytorch和paddle在C盘但是安装是安装在J盘 解决办法: 卸载、删除文件重新安装后可以看到文件位置在J盘中 但是选择时还是显示C…

JavaEE中什么是Web容器?

Web容器(也称为Servlet引擎)是一个用于执行Java Servlet和JSP的服务器端环境。它负责管理和执行在其上运行的Web应用程序。 Tomcat是Web容器 Apache Tomcat 是一个流行的开源的Web容器,它实现了Java Servlet和JavaServer Pages(…

Linux中的软件包管理器yum

目录 1.什么是软件包 2.关于 rzsz 3.查看软件包 4.如何安装软件 5.如何卸载软件 1.什么是软件包 ● 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. ● 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理…

《WebKit 技术内幕》之五(3): HTML解释器和DOM 模型

3 DOM的事件机制 基于 WebKit 的浏览器事件处理过程:首先检测事件发生处的元素有无监听者,如果网页的相关节点注册了事件的监听者则浏览器会将事件派发给 WebKit 内核来处理。另外浏览器可能也需要处理这样的事件(浏览器对于有些事件必须响应…

【GitHub项目推荐--智能家居项目】【转载】

如果你具备硬件、软件知识,这个项目肯定符合你的胃口。 物美智能是一套软硬件结合的开源项目,该系统可助你快速搭建自己的智能家居系统。你可以学习到设备的集成和软硬件交互。 PC 端或者手机与服务端通信,单片机可以接受遥控设备和服务器的…

【C++干货基地】namespace超越C语言的独特魅力(文末送书)

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 哈喽各位铁汁们好啊,我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的…

【后端】深入浅出Node.js

文章目录 1.Node简介1.1 诞生历程1.2 阻塞IO和异步IO 【后端目录贴】 1.Node简介 1.1 诞生历程 Node特点 事件驱动、非阻塞I/O node和chrome浏览器区别 除了HTML、WebKit和显卡这些UI相关技术没有支持外,Node结构与Chrome十分相似,他们都是基于事件驱动…

echarts dataZoom实现左右滑动与放大缩小 并精确控制显示几条数据

//Xdata是横轴的长度(若x轴80条数据,默认显示最新的20条) var start Xdata.length - 20; var end Xdata.length - 1; dataZoom: [ type: slider, show: true, startValue: dataZoomStart, endValue: dataZoomEnd, dataBackground: { ar…

【UEFI基础】EDK网络框架(UDP4)

UDP4 UDP4协议说明 UDP的全称是User Datagram Protocol,它不提供复杂的控制机制,仅利用IP提供面向无连接的通信服务。它将上层应用程序发来的数据在收到的那一刻,立即按照原样发送到网络。 UDP报文格式: 各个参数说明如下&…

Spring Boot3.2.2整合MyBatis Plus3.5.5

目录 1.前置条件 2.导坐标 3.配置数据源 4.配置mapper扫描路径 5.MyBatis Plus代码生成器整合 1.导坐标 2.编写代码生成逻辑 1.前置条件 已经初始化好一个spring boot项目且版本为3X&#xff0c;项目可正常启动 2.导坐标 <dependency><groupId>com.baomid…

《WebKit 技术内幕》之六(1): CSS解释器和样式布局

《WebKit 技术内幕》之六&#xff08;1&#xff09;&#xff1a;CSS解释器和样式布局 CSS解释器和规则匹配处于DOM树建立之后&#xff0c;RenderObject树之前&#xff0c;CSS解释器解释后的结果会保存起来&#xff0c;然后RenderObject树基于该结果来进行规范匹配和布局计算。当…