Task 06 & Task 07 & 拓展02
Task 06
6.1 while循环
- while 循环⽤于在满⾜某个条件的情况下重复执⾏⼀个代码块。 while 循环⾸先检查条件表达式的值。如果条件为 True,则执⾏代码块。执⾏完代码块后,重新检查条件表达式。如果条件仍为True,再次执⾏代码块。这⼀过程会⼀直重复,直到条件为 False,语法如下:
x = 0
while x < 5:
print(x)
x += 1
- while的条件语句需要是布尔类型
- 使用while循环务必检查,避免无限循环,除非真的需要
- while循环可以嵌套使用
x = 0
while x < 3:
y = 0
while y < 2:
print(f"x={x}, y={y}")
y += 1
x += 1
6.2 for循环
- for 循环⽤于遍历序列(如列表、元组、字符串等)或任何可迭代对象。 for 循环从可迭代对象中获取第⼀个元素,将其赋值给循环变量,执⾏ for 循环体中的代码,然后获取下⼀个元素,直到遍历完可迭代对象中的所有元素。
- range(start, stop, step)
- start :序列的起始值,默认值为 0
- stop :序列的终⽌值(不包括该值)
- step :序列中数字之间的差值,默认值为 1
for i in [1, 2, 3, 4, 5]:
print(i)
range(start, stop, step)
for i in range(5): # ⽣成 0 到 4 的序列
print(i)
for i in range(1, 10, 2): # ⽣成 1 到 9 的序列,步⻓为 2
print(i)
#嵌套使用
for i in range(3):
for j in range(2):
print(f"i={i}, j={j}")
- for中的临时变量
for number in range(3):
print(number)
print(number) # 虽然可以访问到,但不推荐这样做
# 如果接下来你没有重新赋值number变量,⽽是粗⼼直接使⽤,代码结果会出错,并且难以检查出来
if number < 5:
print(number)
- break 和 continue
- break :⽤于提前退出循环(已达到⽬的 / 有错误)。
- continue :⽤于跳过某次循环,进⾏下⼀次。
- 示例:
# while 使⽤ break 提前退出循环
while i < 5:
print("hello")
break
# 上⾯代码只会输出⼀次hello
# while 使⽤ continue 跳过某次循环
while i < 5:
if i < 4:
continue
print("hello")
# 上⾯代码只会输出⼀次hello
# for 使⽤ break 提前退出循环
for i in range(10):
if i == 5:
break
print(i) # 输出 0 到 4
# for 使⽤ continue 跳过某次循环
for i in range(10):
if i % 2 == 0:
continue
print(i) # 输出奇数 1, 3, 5, 7, 9
- 注意作⽤域: break 和 continue 仅作⽤在所在的循环上
- 作用域示例
# 下⾯的例⼦中,break 语句仅作⽤在内层循环上,只退出内层循环,不影响外层循环的执⾏
for i in range(3): # 外层循环
for j in range(5): # 内层循环
if j == 3:
break # 仅退出内层循环
print(f"i={i}, j={j}")
'''
输出如下
i=0, j=0
i=0, j=1
i=0, j=2
i=1, j=0
i=1, j=1
i=1, j=2
i=2, j=0
i=2, j=1
i=2, j=2
'''
Task 07 字符串
- 字符串本质上就是字符的数据容器,和列表、元组⼀同属于序列类型
- 字符串同样有下标索引,但字符串与元组⼀样是不可修改的,这意味着如果要修改字符串,必须创建⼀个新的字符串
- 字符串三个特点:有序、元素不可变、元素可重复
操作 | 方法/属性 | 示例代码 |
---|---|---|
查找某元素下标 | .index(字符) | my_string.index('a') |
统计某元素数量 | .count(字符) | my_string.count('a') |
查看字符串⻓度 | len(字符串) | len(my_string) |
字符串中字符的替换 | .replace(旧字符, 新字符) | my_string.replace('a','b') |
字符串的分割 | .split(分隔符) | my_string.split(',') |
字符串的规整 | .strip() | my_string.strip() |
示例代码:
my_string = " hello, world! "
# 查找某元素下标
print(my_string.index('o')) # 输出: 5
# 统计某元素数量
print(my_string.count('l')) # 输出: 3
# 查看字符串⻓度
print(len(my_string)) # 输出: 14
# 字符串中字符的替换
new_string = my_string.replace('world', 'Python')
print(new_string) # 输出: " hello, Python! "
# 字符串的分割
split_string = my_string.split(',')
print(split_string) # 输出: [' hello', ' world! ']
# 字符串的规整
trimmed_string = my_string.strip()
print(trimmed_string) # 输出: "hello, world!"
拓展 02 调试debug
1. bug的捕获处理
- 异常(Exception),是我们常说的 bug,可能会出现在:
- 语法错误(Syntax Error):例如,忘记关闭括号或使⽤不正确的语法。
- 运⾏时错误(Runtime Error):例如,除以零、访问不存在的变量、⽂件未找到等。
- 出现异常后,我们可以提前写好异常捕获,出现后对 bug 进⾏提醒,并继续执⾏程序。
1.1. 异常捕获的定义语法
定义异常捕获的基本语法如下:
try:
可能发⽣异常的代码
except:
发⽣异常时执⾏的代码
1.2. 捕获制定异常
- except 后可以指定异常关键字,⽤来捕获特定的异常(即如果发⽣我们指定的异常,才捕获)
常⻅的异常类型如下表所示:
| 异常类型 | 描述 |
| ---- | ---- |
| EOFError | 当 input() 函数在没有读到数据时引发 |
| ImportError | 当导⼊模块失败时引发 |
| IndexError | 当序列索引超出范围时引发 |
| KeyError | 试图访问不存在的字典键时引发 |
| KeyboardInterrupt| ⽤户中断执⾏时(通常是按Ctrl+C)引发 |
| NameError | 尝试访问未声明的变量时引发 |
| SyntaxError | Python 语法错误时引发 |
| ValueError | 操作或函数收到具有正确类型但不适当值的参数时引发 |
try:
value = int(input("请输⼊⼀个整数: "))
except ValueError:
print("输⼊的不是⼀个有效的整数")
except EOFError:
print("没有读到任何数据")
except Exception: # 这⾥的Exception代指所有异常
print("其他错误")
1.3.捕获所有异常
try:
可能发⽣异常的代码
except Exception as e: # e只是个变量名字,也可以是error,⾃⼰取名字,⽤来打印具体的异常
print(f"发⽣异常:{e}")
1.4. 捕获异常完整语法
try:
可能发⽣异常的代码
except Exception as e:
出现异常时执⾏的代码
else:
没有出现异常时执⾏的代码(⼀般不⽤,没慎⽤)
finally:
⽆论是否出现异常都执⾏的代码
try:
value = int(input("请输⼊⼀个整数: "))
except ValueError as e:
print(f"输⼊错误: {e}")
else:
print("输⼊的是⼀个有效的整数")
finally:
print("异常捕获示例结束")
1.5. 异常具有传递性
异常具有传递性,即如果在函数内部抛出异常且未处理,则异常会传递到调⽤该函数的代码中进⾏处理。
def func1():
return 1 / 0 # 这⾥会引发 ZeroDivisionError
def func2():
try:
func1()
except ZeroDivisionError as e:
print(f"在 func2 中捕获到异常: {e}")
func2() # 输出: 在 func2 中捕获到异常: division by zero