从零开始学习人工智能Day3-Python 推导式

​​​​二、Python3基础语法学习

三、Python3 基本数据类型

四、Python3 数据类型转换

五、Python3 运算符

六、python基本数据类型(续)

七、Python3 控制语句

八、Python 推导式

Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体,适用于生成列表、字典、集合和生成器

Python 支持各种数据结构的推导式

  • 列表(list)推导式
  • 字典(dict)推导式
  • 集合(set)推导式
  • 元组(tuple)推导式

1.列表推导式

列表推导式格式为:

[表达式 for 变量 in 列表] 
[out_exp_res    for    out_exp     in   input_list]

或者 

[表达式 for 变量 in 列表 if 条件]
[out_exp_res    for   out_exp      in   input_list     if     condition]

  • out_exp_res:列表生成元素表达式,可以是有返回值的函数。
  • for out_exp in input_list:迭代 input_list 将 out_exp 传入到 out_exp_res 表达式中。
  • if condition:条件语句,可以过滤列表中不符合条件的值。
names = ['Alice', 'Bob', 'Charlie']
upper_names = [name.upper() for name in names]
#从列表names中取出每个名字(name),将这个名字转换为大写形式name.upper()
#然后将转换后的名字放入upper_names
print(upper_names)
# Output: ['ALICE', 'BOB', 'CHARLIE']

upper_names=[name.upper() for name in names if len(name) > 3]
#从列表names中取出每个名字(name),将这个名字转换为大写形式name.upper()
#然后将转换后的名字放入upper_names,但只保留长度大于3的名字
print(upper_names)
# Output: ['ALICE', 'CHARLIE']

2.字典推导式

字典推导基本格式:

{ key_expr: value_expr for value in collection }

{ key_expr: value_expr for value in collection if condition }

names = ['Alice', 'Bob', 'Charlie']
len_names={name:len(name) for name in names}
#从列表names中取出每个名字(name),将这个名字作为键,名字的长度作为值,放入字典len_names
print(len_names)
# Output:  {'Alice': 5, 'Bob': 3, 'Charlie': 7}


len_names={name:len(name) for name in names if len(name) > 3}
#从列表names中取出每个名字(name),将这个名字作为键,名字的长度作为值,放入字典len_names
#但只保留长度大于3的名字
print(len_names)
# Output: {'Alice': 5, 'Charlie': 7}

3.集合推导式

集合推导式基本格式:

{ expression for item in Sequence }

{ expression for item in Sequence if conditional }

setnews = {i**2 for i in range(2,7,2)}  #range(2,7,2)生成的序列为[2,4,6]
#从范围2到6(步长为2)中取出偶数i,计算i的平方,并放入集合setnews
print(setnews)
# Output: {4, 16,36}

setnews = {i**2 for i in range(2,7,2) if i%3==0}  #range(2,7,2)生成的序列为[2,4,6]
#从范围2到6(步长为2)中取出偶数i,计算i的平方,并放入集合setnews,但只保留i能被3整除的数
print(setnews)
# Output: {36}

4.元组推导式(生成器表达式)

元组推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的元组。

元组推导式基本格式:

(expression for item in Sequence )

(expression for item in Sequence if conditional )

元组推导式和列表推导式的用法也完全相同,只是元组推导式是用 () 圆括号将各部分括起来,而列表推导式用的是中括号 [],另外元组推导式返回的结果是一个生成器对象。 

tuple_news = (i**2 for i in range(2,7,2))  #range(2,7,2)生成的序列为[2,4,6]
#从范围2到6(步长为2)中取出偶数i,计算i的平方,并放入元组tuple_news

print(tuple_news)
# Output:  at 0x0000019460720A50>

print(tuple(tuple_news))
# Output: (4, 16, 36)

tuple_news = (i**2 for i in range(2,7,2) if i%3==0)  #range(2,7,2)生成的序列为[2,4,6]
#从范围2到6(步长为2)中取出偶数i,计算i的平方,并放入元组tuple_news,但只保留i能被3整除的数

print(tuple_news)
# Output:  at 0x0000019460722490>

print(tuple(tuple_news))
# Output: (36,)

5.Python3 迭代器与生成器

5.1迭代器

  • 迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。
  • 迭代器是一个可以记住遍历的位置对象
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退
  • 迭代器有两个基本的方法:iter() 和 next()
  • 字符串,列表或元组对象都可用于创建迭代器:
list1=[1,2,3,4,5]
iter1=iter(list1)

print(iter1)  #输出 

print(next(iter1))  #输出 1

print(next(iter1))  #输出 2


#迭代器可用for语句遍历
list2=[6,7,8,9,10]
iter2=iter(list2)

for i in iter2:
    print(i,end=" ")

# Output: 6 7 8 9 10
5.1.1  创建一个迭代器
  • 把一个作为一个迭代器使用需要在类中实现两个方法 __iter__() __next__()
  • __iter__() 方法:返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
  • __next__() 方法:(Python 2 里是 next())会返回下一个迭代器对象

创建一个返回数字的迭代器,初始值为 1,逐步递增 1:

StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。

#创建迭代器
class MyIterator:
    def __init__(self,n):    #初始化迭代器,传入参数n
        self.n=n       #保存参数n
        self.i=0       #初始化变量i为0

    def __iter__(self):
        return self       #返回迭代器对象

    def __next__(self):     #定义迭代器的下一个元素
        if self.i

5.2生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)

yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。

跟普通函数不同的是,生成器是一个返回迭代器的函数只能用于迭代操作,更简单点理解生成器就是一个迭代器

当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式作为当前迭代的值返回。

然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果。

调用一个生成器函数,返回的是一个迭代器对象。

def mygenerator(n):
    i=0
    while i

print(next(mygen))  #输出 0

print(next(mygen))  #输出 1

print(next(mygen))  #输出 2

for i in mygen:      #使用for语句遍历生成器
    print(i,end=" ")

# Output: 3 4

它使用 yield 语句逐步产生从 n 到 1 的倒数数字。在每次调用 yield 语句时,函数会返回当前的倒数值,并在下一次调用时从上次暂停的地方继续执行

 

生成器函数的优势是它们可以按需生成值,避免一次性生成大量数据并占用大量内存。此外,生成器还可以与其他迭代工具(如for循环)无缝配合使用,提供简洁和高效的迭代方式。

你可能感兴趣的:(python,开发语言)