首页 > 编程语言 >跟着查老四学Python Day 4:列表推导式 生成器 迭代器

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

时间:2023-03-31 17:31:57浏览次数:45  
标签:__ 迭代 Python self 生成器 列表 lst num Day


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

  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): 列表推导式适用于根据简单的逻辑创建新的列表。它可以使代码更加简洁易读。但是,列表推导式会直接创建整个列表,因此当需要处理大量数据时,可能会消耗较多的内存。
    适用场景:
  • 快速创建列表
  • 基于已有列表进行简单转换和过滤
  1. 生成器(Generators): 生成器适用于创建一个元素在迭代过程中按需生成的序列。生成器可以帮助您节省内存,因为它并不会一次性创建整个序列。在处理大量数据或者计算复杂的序列时,使用生成器是非常高效的。
    适用场景:
  • 处理大量数据
  • 创建按需生成元素的序列
  • 生成无法预先确定长度的序列
  1. 迭代器(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或其他在线编程平台上的简单题目,进行实战练习。
    以下是一些适合练习的题目:
  • 统计一个字符串中每个字符出现的次数。
  • 计算一个列表中的最大值、最小值和平均值。
  • 对一个列表进行排序,可以尝试冒泡排序、插入排序等算法。
  • 编写一个函数,实现两个数的加减乘除运算。

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

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

回顾这一周的学习内容,思考哪些知识点掌握得较好,哪些知识点还需要进一步巩固。对于不太熟悉的内容,可以多加练习,尝试编写更多相关的代码来巩固理解。如果有需要,可以在接下来的学习过程中多花些时间来复习这些知识点。同时,也可以查阅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

标签:__,迭代,Python,self,生成器,列表,lst,num,Day
From: https://blog.51cto.com/cloudzun/6162098

相关文章

  • Python 数字类型之 int float
    数字常量int:一般的整数,long:长整型,2.x版本需在数字后加“L”或“l”,表示长整型如100000000L;python3.x版本后不分长整型,统一为int,不可加“L”或“l”float:浮点数,1.0也为浮点数,float可强制转换为int,取整;print(type(1234))print(type(-24))print......
  • 关于python 的if __name__ == "__main__"的模块测试
    if__name__=="__main__"也就是说执行当前文件,不调用模块的时候__name__=__main__调用模块的时候,测试如下:1、新建test01.py文件测试代码如下print("这条消息来自test01")deffunc():print('hello,world!***')print("这条消息来自func")if__name__=="__......
  • python isinstance()函数
    pythonisinstance()函数描述isinstance()函数来判断一个对象是否是一个已知的类型,类似type()isinstance()与type()的区别type()不会认为子类是一种父类类型,不考虑继承关系isinstance()会认为子类是一种父类类型,考虑继承关系如果要判断两个类型是否相同推荐使用isinstanc......
  • Python3内置函数之C系列
    1、callable()callable()是一个内置函数,用于检查给定对象是否是可调用的。如果对象是可调用的,则返回True,否则返回False。可调用对象包括函数、方法、类和某些类的实例。如果一个对象定义了__call__()方法,则也被认为是可调用的。 2、chr()chr()是Python内置函数之一,用于......
  • 【python基础】python字典根据值查询键
    前言 测试>>>tfl_label={'circle_green':0,'circle_red':1,'circle_yellow':2,'left_green':3,'left_red':4,'left_yellow':5,'nomotor_green':6,'nomotor_red':7,......
  • ubuntu16.04升级python3.7.1教程
    ubuntu16.04升级python3.7.1教程准备sudoapt-getinstall--reinstallzlibczlib1gzlib1g-devsudoapt-getinstalllibffi-devlibssl-devlibreadline-dev-y安装使用python官方站点的以下命令下载Python。您也可以下载最新版本代替下面指定的版本#下载python3......
  • python win32gui 无法控制 最小化后的桌面
    当远程桌面被最小化时,发现使用win32gui控制某软件置于最前台显示时失效,并报错:File"C:\Users\Administrator\Desktop\py-auto-login\robot\ktt_auth_code.py",line156,inwx_loginwin32gui.SetForegroundWindow(self._main_wnd)pywintypes.error:(0,'SetForegroun......
  • day8| 344.反转字符串;541.反转字符串II;剑指offer 05.替换空格;151.翻转字符串里的单词
    344.反转字符串 题目简述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组,使用O(1)的额外空间解决这一问题。 解题思路:没什么好说的,直接双指针 代码如下:classSolution:de......
  • python selenium 判断元素是否存在,实现:找到元素,执行对应的代码;找不到元素,继续执行其他
    selenium因为找不到元素会抛出异常,导致执行结束可以考虑使用driver.find_elements(),找不到元素时就会返回空列表,使用if-else语句,判断列表是否为空,非空,则正常找到元素,进行后续代码执行;空,则直接跳过,执行其他代码iflen(driver.find_elements())!=0#判断列表的长度是否为0......
  • Python Django投稿系统代码
    PythonDjango投稿系统代码Python是一种高级编程语言,而Django则是一个基于Python的Web框架。使用Python和Django可以轻松地创建现代化、高效的Web应用程序,其中包括投稿系统。投稿系统是一个允许用户发布内容或文章的Web应用程序。Python和Django的结合使得创建投稿系统变得简单......