CS50P week2 学习笔记

Week 2 Loops

While Loop

示例代码如下:

i = 0
while i < 3:
    print("meow")
    i = i + 1
    # 另一种写法
    # i += 1

代码流程如下:

image-20240207185412574

For Loops

示例代码如下:

for i in [1, 2, 3]:
    print("meow")

这个代码正确,但是有个缺陷:如果需要计数到很大,会十分麻烦。

改进如下:

for i in range(3):
    print("meow")

当循环中不需要使用变量时,可以用如下写法:

for _ in range(3):
    print("meow")

还有一种仅在 Python 中支持的语法:

print("meow\n" * 3, end="")
# 加 \n 是因为每一个单词后面需要换行
# end="" 最后不需要换行

这样的写法是更简洁,但可读性变差。

Improving with User Input

上述代码将次数进行硬编码,修改程序让其可以接受用户的输入,并且必须得是正数:

while True:
    n = int(input("What's n? "))
    if n < 0:
        continue
    else:
        break

for _ in range(n):
    print("meow")

上述代码中出现两个新关键词:

  • continue:转到循环的下一次迭代
  • break:在完成所有迭代之前跳出循环

可以对上述代码进行改进:

while True:
    n = int(input("What's n? "))
    if n > 0:
        break

for _ in range(n):
    print("meow")

将上述的代码通过构建新的函数进行改写:

def main():
    meow(get_number())

def get_number():
    while True:
        n = int(input("What's n? "))
        if n > 0:
            return n

def meow(n):
    for _ in range(n):
        print("meow")

main()

Lists and Length

列表表示:students = ["Hermoine", "Harry", "Ron"]

列表是可迭代的,所以可以直接循环:

students = ["Hermoine", "Harry", "Ron"]

for student in students:
    print(student)
# 这里的 student 是指列表中的每个值

image-20240208165130490

也可以换一种写法:

students = ["Hermoine", "Harry", "Ron"]

for i in range(len(students)):
    print(i + 1, students[i])
  • len():得到列表的长度
  • students[0]:这种写法是取列表 students 里索引为 0 的值

更多关于列表的内容到官网进行查看 list

Dictionaries

数据结构:字典,用 {key: value} 构成包括键和相应的值

students = {
    "Hermoine": "Gryffindor",
    "Harry": "Gryffindor",
    "Ron": "Gryffindor",
    "Draco": "Slytherin",
}
# "Hermoine": "Gryffindor"
#    键     :     值

取值的方法如下:

students["Hermoine"]
# 得到 Gryffindor

字典也和列表一样是可迭代的,故可以修改代码如下:

students = {
    "Hermoine": "Gryffindor",
    "Harry": "Gryffindor",
    "Ron": "Gryffindor",
    "Draco": "Slytherin"
}

for student in students:
    print(student)

image-20240208192605873

结果是仅打印键的值,如果想同时打印键和相应的值呢?

students = {
    "Hermoine": "Gryffindor",
    "Harry": "Gryffindor",
    "Ron": "Gryffindor",
    "Draco": "Slytherin"
}

for student in students:
    print(student, students[student], sep=", ")

image-20240208192733303

students[student] 中 student 是键,所以整体是查找键对应的值

如果有下面表中的信息需要记录:

image-20240208192926479

这里需要使用到字典列表

students = [
    {"name": "Hermoine", "house": "Gryffindor", "patronus": "Otter"},
    {"name": "Haryy", "house": "Gryffindor", "patronus": "Stage"},
    {"name": "Ron", "house": "Gryffindor", "patronus": "Jack Russell terrier"},
    {"name": "Draco", "house": "Slytherin", "patronus": None}
]

同时,还有一个 Python 的关键词 None 需要注意,这里代表没有值的意思

同理,想要打印出需要值,方法如下:

students = [
    {"name": "Hermoine", "house": "Gryffindor", "patronus": "Otter"},
    {"name": "Haryy", "house": "Gryffindor", "patronus": "Stage"},
    {"name": "Ron", "house": "Gryffindor", "patronus": "Jack Russell terrier"},
    {"name": "Draco", "house": "Slytherin", "patronus": None}
]

for student in students:
    print(student["name"], student["house"], student["patronus"], sep=", ")

image-20240208193501633

Mario

如果想用代码实现马里奥这个游戏里的图形:

image-20240209190443409

方式一:

print("#")
print("#")
print("#")

方式二:

for _ in range(3):
    print("#")

方式三:

def main():
    print_column(3)

def print_column(height):
    for _ in range(height):
        print("#")

main()

上面三种方法看似第一种方法是最简单的,但第三种方法可以帮助解决更复杂的问题。

如果想要实现一行:

def main():
    print_row(4)

def print_row(width):
    print("?" * width)

main()

如果想要打印的是一个正方形:

def main():
    print_square(3)

def print_square(size):

    # 打印每一行
    for i in range(size):

        # 打印每一行中的方块
        for j in range(size):
            print("#", end="")

        # 打印完一行后需要换行
        print()

main()

还可以改进:

def main():
    print_square(3)

def print_square(size):
    # 打印每一行
    for i in range(size):
        print_row(size)

# 打印每一行中的内容
def print_row(width):
    print("#" * width)

main()
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值