跟着查老四学Python Day 4:列表推导式 生成器 迭代器

忽略掉例行寒暄,让查老四直接讲课了

  1. 列表推导式(List Comprehension)

列表推导式是一种简洁的构建列表的方法。它可以将一个循环和条件表达式结合起来,从而生成一个新的列表。

示例:

# 普通循环创建一个列表
squares = []
for x in range(1, 6):
    squares.append(x ** 2)
print(squares)  # 输出: [1, 4, 9, 16, 25]

# 使用列表推导式创建同样的列表
squares_lc = [x ** 2 for x in range(1, 6)]
print(squares_lc)  # 输出: [1, 4, 9, 16, 25]

练习题:使用列表推导式创建一个包含1到20之间所有奇数的列表。

  1. 生成器(Generator)

生成器是一种特殊的迭代器,可以使用简单的语法创建,用于按需生成数据,而不是一次性生成所有数据。生成器可以节省内存,特别适合处理大量数据。要创建一个生成器,只需将列表推导式中的方括号[]替换为圆括号()

示例:

# 创建一个生成器,生成1到5之间的平方数
squares_gen = (x ** 2 for x in range(1, 6))

# 使用for循环遍历生成器
for square in squares_gen:
    print(square, end=" ")  # 输出: 1 4 9 16 25

练习题:创建一个生成器,生成1到20之间的奇数。

  1. 迭代器(iterator)

迭代器是一个可以遍历容器(如列表、元组、字典等)中所有元素的对象。在Python中,迭代器实现了两个关键的方法:__iter__()__next__()

__iter__() 方法返回迭代器对象本身。__next__() 方法返回容器中的下一个值。当没有更多的元素时,__next__() 方法会抛出 StopIteration 异常。

我们可以通过调用内置函数 iter() 从可迭代对象(如列表、元组、字典等)中创建迭代器。接着使用内置函数 next() 从迭代器中获取下一个元素。

下面是一个关于迭代器的简单示例:

# 示例:创建一个迭代器
my_list = [1, 2, 3, 4]
iterator = iter(my_list)

# 使用 next() 函数获取迭代器中的下一个元素
print(next(iterator))  # 输出: 1
print(next(iterator))  # 输出: 2

接下来,我给出一个关于自定义迭代器的示例,以便您更好地理解迭代器的工作原理。

# 示例:自定义迭代器
class MyNumbers:
    def __init__(self):
        self.current_num = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.current_num <= 5:
            current = self.current_num
            self.current_num += 1
            return current
        else:
            raise StopIteration

# 创建 MyNumbers 类的实例
my_numbers = MyNumbers()

# 创建迭代器
iterator = iter(my_numbers)

# 使用 for 循环遍历迭代器中的元素
for num in iterator:
    print(num)  # 输出:0 1 2 3 4 5

练习题:实现一个自定义迭代器,使其生成前 10 个斐波那契数列的数。

在实现过程中,如果有任何问题,请随时提问。


老猫:列表推导式 生成器 迭代器各自的适用场景是什么

查老四:列表推导式、生成器和迭代器都有各自的适用场景。以下是它们的适用场景概述:

  1. 列表推导式(List Comprehensions): 列表推导式适用于根据简单的逻辑创建新的列表。它可以使代码更加简洁易读。但是,列表推导式会直接创建整个列表,因此当需要处理大量数据时,可能会消耗较多的内存。

    适用场景:

    • 快速创建列表
    • 基于已有列表进行简单转换和过滤
  2. 生成器(Generators): 生成器适用于创建一个元素在迭代过程中按需生成的序列。生成器可以帮助您节省内存,因为它并不会一次性创建整个序列。在处理大量数据或者计算复杂的序列时,使用生成器是非常高效的。

    适用场景:

    • 处理大量数据
    • 创建按需生成元素的序列
    • 生成无法预先确定长度的序列
  3. 迭代器(Iterators): 迭代器适用于需要逐个访问容器(如列表、元组、字典等)元素的场景。迭代器允许您按顺序遍历容器中的元素,而不需要关心容器的内部实现。此外,自定义迭代器还可以根据特定逻辑生成元素。

    适用场景:

    • 遍历容器中的元素(如列表、元组、字典等)
    • 自定义迭代顺序或生成特定逻辑的元素
    • 实现“惰性求值”(按需计算的特性)

总的来说,列表推导式适用于创建简单的列表,生成器适用于处理大量数据并节省内存,迭代器则适用于遍历容器中的元素以及自定义迭代逻辑。在实际应用中,您可以根据不同的场景和需求选择合适的方式。


练习 1:

下面是使用列表推导式创建包含1到20之间所有奇数的列表的Python程序,代码中包含注释和格式化字符串(f-string):

# 使用列表推导式创建包含1到20之间所有奇数的列表
odd_nums = [num for num in range(1, 21) if num % 2 == 1]

# 输出结果
print(f"The odd numbers between 1 and 20 are: {odd_nums}")

输出结果为:

The odd numbers between 1 and 20 are: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

下面是使用生成器创建1到20之间的奇数的Python程序,代码中包含注释和格式化字符串(f-string):

# 使用生成器生成1到20之间的奇数
def odd_nums():
    for num in range(1, 21):
        if num % 2 == 1:
            yield num

# 输出结果
print("The odd numbers between 1 and 20 are:")
for num in odd_nums():
    print(num, end=" ")

输出结果为:

The odd numbers between 1 and 20 are:
1 3 5 7 9 11 13 15 17 19 

练习3

下面是一个自定义迭代器,用于生成前 10 个斐波那契数列的数的Python程序,代码中包含注释和格式化字符串(f-string):

# 自定义迭代器,用于生成前 10 个斐波那契数列的数
class Fibonacci:
    def __init__(self):
        self.num1 = 0
        self.num2 = 1
        self.counter = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.counter >= 10:
            raise StopIteration
        elif self.counter == 0:
            self.counter += 1
            return self.num1
        elif self.counter == 1:
            self.counter += 1
            return self.num2
        else:
            fib_num = self.num1 + self.num2
            self.num1 = self.num2
            self.num2 = fib_num
            self.counter += 1
            return fib_num

# 使用自定义迭代器生成前 10 个斐波那契数列的数
fibonacci = Fibonacci()

print("The first 10 numbers in the Fibonacci sequence are:")
for num in fibonacci:
    print(num, end=" ")

输出结果为:

The first 10 numbers in the Fibonacci sequence are:
0 1 1 2 3 5 8 13 21 34 

对了答案,基本一致

周总结和练习

老猫:这一节内容我掌握了,我们继续下一节

查老四:很好!接下来我们将对之前几天学到的知识点进行复习。

第四天:实践与复习

  1. 复习前三天所学的知识点

    我们已经学习了Python的基本数据类型、变量、运算符、输入输出操作、条件判断、循环结构、列表、元组、字典、集合、函数及其参数传递、局部变量和全局变量的概念、列表推导式、生成器和迭代器等知识点。

  2. 选择一些适合初学者的编程题目,例如LeetCode或其他在线编程平台上的简单题目,进行实战练习。

    以下是一些适合练习的题目:

    • 统计一个字符串中每个字符出现的次数。
    • 计算一个列表中的最大值、最小值和平均值。
    • 对一个列表进行排序,可以尝试冒泡排序、插入排序等算法。
    • 编写一个函数,实现两个数的加减乘除运算。

    请尝试编写代码解决这些问题,如果遇到困难或需要帮助,请尝试编写代码解决这些问题,如果遇到困难或需要帮助,请随时向我提问,我会尽力提供帮助。

  3. 总结一下本周的学习收获,为接下来的学习做好准备。

回顾这一周的学习内容,思考哪些知识点掌握得较好,哪些知识点还需要进一步巩固。对于不太熟悉的内容,可以多加练习,尝试编写更多相关的代码来巩固理解。如果有需要,可以在接下来的学习过程中多花些时间来复习这些知识点。同时,也可以查阅Python官方文档或相关教程,了解更多细节。

接下来的学习阶段,我们将进入Python的高级部分,包括模块、文件操作、异常处理、面向对象编程、类和对象、继承和多态等概念。这些知识点将使您的Python编程能力更上一层楼,并为日后的项目开发和学习其他编程语言打下坚实的基础。

为了更好地准备接下来的学习,建议您定期回顾本周学到的知识点,多做练习题以及实际应用。当您遇到问题时,请不要犹豫,随时向我提问,我会尽力提供帮助

练习 1

可以使用字典来统计字符串中每个字符出现的次数,遍历字符串中的每个字符,将其作为字典中的键,并将其出现的次数作为对应键的值进行累加。例如:

string = "hello, world!"
char_count = {}
for char in string:
    if char in char_count:
        char_count[char] += 1
    else:
        char_count[char] = 1

print(char_count)

输出结果为:

{'h': 1, 'e': 1, 'l': 3, 'o': 2, ',': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1, '!': 1}

其中,字典char_count记录了字符串中每个字符出现的次数。

练习 2

可以使用 Python 内置函数来计算列表中的最大值、最小值和平均值。例如:

numbers = [1, 5, 3, 7, 2, 8]
max_num = max(numbers)
min_num = min(numbers)
avg_num = sum(numbers) / len(numbers)

print("最大值:", max_num)
print("最小值:", min_num)
print("平均值:", avg_num)

输出结果为:

最大值: 8
最小值: 1
平均值: 4.333333333333333

其中,max()函数返回列表numbers中的最大值,min()函数返回列表numbers中的最小值,sum()函数返回列表numbers中所有元素的和,而len()函数返回列表numbers的长度(即其中元素的个数)。将这些函数的结果进行相应的运算,即可得到列表numbers的最大值、最小值和平均值。

练习 3

好的,以下是使用冒泡排序和插入排序算法对列表进行排序的 Python 代码:

冒泡排序

def bubble_sort(lst):
    """
    使用冒泡排序算法对列表进行排序
    
    :param lst: 待排序的列表
    :return: 排序后的列表
    """
    n = len(lst)
    for i in range(n):
        # 每轮冒泡将最大值冒泡到末尾
        for j in range(n-i-1):
            if lst[j] > lst[j+1]:
                lst[j], lst[j+1] = lst[j+1], lst[j]
    return lst

使用示例

>>> lst = [3, 2, 1, 5, 4]
>>> bubble_sort(lst)
[1, 2, 3, 4, 5]

插入排序

def insertion_sort(lst):
    """
    使用插入排序算法对列表进行排序
    
    :param lst: 待排序的列表
    :return: 排序后的列表
    """
    n = len(lst)
    for i in range(1, n):
        key = lst[i]
        j = i - 1
        while j >= 0 and lst[j] > key:
            lst[j+1] = lst[j]
            j -= 1
        lst[j+1] = key
    return lst

使用示例

>>> lst = [3, 2, 1, 5, 4]
>>> insertion_sort(lst)
[1, 2, 3, 4, 5]

以上代码中,我们使用了两种常见的排序算法,分别是冒泡排序和插入排序。在这里,我们定义了两个函数 bubble_sortinsertion_sort,它们分别使用了冒泡排序和插入排序算法来对列表进行排序。在函数定义中,我们使用了 Docstring 来对函数进行注释,这是 Python 中常用的注释方式之一。另外,在函数中我们也使用了 f-string 来方便地输出排序结果。

练习4

以下是一个 Python 函数,可以执行两个数的加减乘除运算:

def calculate(num1, num2, operator):
    if operator == '+':
        return num1 + num2
    elif operator == '-':
        return num1 - num2
    elif operator == '*':
        return num1 * num2
    elif operator == '/':
        return num1 / num2
    else:
        return "Invalid operator"

该函数接受三个参数:num1num2 表示要进行操作的两个数字,operator 是一个字符串,表示要执行的操作符。如果 operator 不是四种支持的运算符之一,则返回一个错误消息。例如,可以使用以下方式调用该函数:

result = calculate(3, 4, '+')
print(result) # 输出 7

result = calculate(10, 5, '-')
print(result) # 输出 5

result = calculate(2, 8, '*')
print(result) # 输出 16

result = calculate(9, 3, '/')
print(result) # 输出 3.0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值