自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python中級(jí)篇—高級(jí)數(shù)據(jù)類型(集合和命名元組迭代器和生成器)

開(kāi)發(fā) 前端
本篇主要是迭代器和生成器的基本介紹,它們是 Python 中非常重要的概念,可以幫助我們高效地處理大量數(shù)據(jù)。

集合 (Set)

集合是一種無(wú)序、可變、且元素唯一的數(shù)據(jù)結(jié)構(gòu)。在 Python 中,可以通過(guò) set() 函數(shù)或使用大括號(hào) {} 來(lái)創(chuàng)建一個(gè)集合。

創(chuàng)建集合

# 創(chuàng)建一個(gè)空集合
empty_set = set()
print(empty_set)

# 創(chuàng)建帶有初始元素的集合
numbers = {1, 2, 3, 4, 5}
print(numbers)

輸出:

set()
{1, 2, 3, 4, 5}

注意,如果使用大括號(hào)創(chuàng)建一個(gè)空集合,會(huì)得到一個(gè)空字典而不是空集合。所以,創(chuàng)建空集合時(shí)應(yīng)該使用 set() 函數(shù)。

集合的基本操作

添加元素

可以使用 add() 方法向集合中添加元素,如果添加的元素已經(jīng)存在于集合中,則不會(huì)有任何影響。

fruits = {'apple', 'banana', 'orange'}
fruits.add('grape')
fruits.add('apple')  # 不會(huì)有任何影響,因?yàn)?apple'已經(jīng)存在于集合中
print(fruits)

輸出:

{'banana', 'grape', 'apple', 'orange'}

刪除元素

可以使用 remove() 或 discard() 方法從集合中刪除指定元素,如果元素不存在,則 remove() 方法會(huì)拋出 KeyError 異常,而 discard() 方法不會(huì)有任何影響。

fruits = {'apple', 'banana', 'orange'}
fruits.remove('banana')
print(fruits)

fruits.discard('watermelon')  # 不會(huì)有任何影響,因?yàn)?watermelon'不存在于集合中
print(fruits)

輸出:

{'apple', 'orange'}
{'apple', 'orange'}

集合運(yùn)算

可以對(duì)集合執(zhí)行交集、并集、差集、對(duì)稱差等運(yùn)算。

A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

print(A & B)  # 交集
print(A | B)  # 并集
print(A - B)  # 差集
print(A ^ B)  # 對(duì)稱差

輸出:

{4, 5}
{1, 2, 3, 4, 5, 6, 7, 8}
{1, 2, 3}
{1, 2, 3, 6, 7, 8}

代碼演示

# 創(chuàng)建一個(gè)空集合
empty_set = set()
print(empty_set)

# 創(chuàng)建帶有初始元素的集合
numbers = {1, 2, 3, 4, 5}
print(numbers)

# 添加元素
fruits = {'apple', 'banana', 'orange'}
fruits.add('grape')
fruits.add('apple')  # 不會(huì)有任何影響,因?yàn)?apple'已經(jīng)存在于集合中
print(fruits)

# 刪除元素
fruits.remove('banana')
print(fruits)

fruits.discard('watermelon')  # 不會(huì)有任何影響,因?yàn)?watermelon'不存在于集合中
print(fruits)

# 集合運(yùn)算
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

print(A & B)  # 交集
print(A | B)  # 并集
print(A - B)  # 差集
print(A ^ B)  # 對(duì)稱差

輸出:

set()
{1, 2, 3, 4, 5}
{'orange', 'banana', 'grape', 'apple'}
{'orange', 'grape', 'apple'}
{'orange', 'grape', 'apple'}
{4, 5}
{1, 2, 3, 4, 5, 6, 7, 8}
{1, 2, 3}
{1, 2, 3, 6, 7, 8}

命名元組 (NamedTuple)

命名元組是一種具名元素的元組。與普通元組不同,命名元組的每個(gè)元素都有一個(gè)可讀性更高的名稱。在 Python 中,可以通過(guò) collections 模塊中的 namedtuple() 函數(shù)來(lái)創(chuàng)建一個(gè)命名元組。

創(chuàng)建命名元組

創(chuàng)建命名元組時(shí)需要指定元素的名稱和順序,可以使用逗號(hào)分隔的字符串或者是元素名稱組成的列表來(lái)定義。

from collections import namedtuple

# 用逗號(hào)分隔的字符串定義元素
Person = namedtuple('Person', 'name age gender')
p1 = Person('Bob', 25, 'male')
print(p1)

# 使用元素名稱組成的列表定義元素
Point = namedtuple('Point', ['x', 'y'])
p2 = Point(3.14, 2.71)
print(p2)

輸出:

Person(name='Bob', age=25, gender='male')
Point(x=3.14, y=2.71)

訪問(wèn)命名元組

可以使用點(diǎn)號(hào)運(yùn)算符來(lái)訪問(wèn)命名元組中的元素。

print(p1.name)
print(p2.y)

輸出:

Bob
2.71

修改命名元組

命名元組是不可變的,因此不能直接修改其元素。但可以使用 _replace() 方法創(chuàng)建一個(gè)新的命名元組,該方法會(huì)返回一個(gè)新的命名元組,其中指定的元素會(huì)被替換為新的值。注意,_replace() 方法并不會(huì)改變?cè)瓉?lái)的命名元組,而是返回一個(gè)新的命名元組。

p3 = p2._replace(y=42)
print(p2)
print(p3)

輸出:

Point(x=3.14, y=2.71)
Point(x=3.14, y=42)

迭代器和生成器

迭代器和生成器是 Python 中非常重要的概念,它們可以幫助我們有效地處理大量數(shù)據(jù),避免內(nèi)存溢出的問(wèn)題。

迭代器 (Iterator)

迭代器是一種可以逐個(gè)訪問(wèn)集合元素的對(duì)象,而不必將集合完全加載到內(nèi)存中。迭代器對(duì)象從第一個(gè)元素開(kāi)始訪問(wèn),直到所有元素都被訪問(wèn)完為止。在 Python 中,可以使用 iter() 和 next() 函數(shù)來(lái)創(chuàng)建和訪問(wèn)迭代器。

numbers = [1, 2, 3, 4, 5]
it = iter(numbers)

print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))

輸出:

1
2
3
4
5

生成器 (Generator)

生成器是一種特殊的迭代器,可以使用函數(shù)來(lái)創(chuàng)建。與普通函數(shù)不同,生成器函數(shù)返回的是一個(gè)迭代器對(duì)象,可以使用 yield 關(guān)鍵字來(lái)逐個(gè)返回值,而不是一次性返回所有值。

def square_numbers(n):
    for i in range(n):
        yield i ** 2

# 創(chuàng)建生成器對(duì)象
my_generator = square_numbers(5)

# 訪問(wèn)生成器中的元素
print(next(my_generator))
print(next(my_generator))
print(next(my_generator))
print(next(my_generator))
print(next(my_generator))

輸出:

0
1
4
9
16

生成器的一個(gè)重要特點(diǎn)是可以節(jié)省內(nèi)存,因?yàn)樗恍枰獙⑺性乇4嬖趦?nèi)存中,而是逐個(gè)生成元素。此外,生成器還可以實(shí)現(xiàn)無(wú)限序列的生成,比如生成所有的斐波那契數(shù)列元素。以下是一個(gè)生成斐波那契數(shù)列的生成器函數(shù)示例:

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

# 創(chuàng)建生成器對(duì)象
my_generator = fibonacci()

# 訪問(wèn)生成器中的元素
print(next(my_generator))
print(next(my_generator))
print(next(my_generator))
print(next(my_generator))
print(next(my_generator))
print(next(my_generator))

輸出:

0
1
1
2
3
5

除了使用 next() 函數(shù)來(lái)訪問(wèn)生成器中的元素之外,我們還可以使用 for 循環(huán)來(lái)遍歷生成器中的所有元素,因?yàn)樯善饕彩且环N可迭代對(duì)象。

# 創(chuàng)建生成器對(duì)象
my_generator = square_numbers(5)

# 遍歷生成器中的元素
for num in my_generator:
    print(num)

輸出:

0
1
4
9
16

另外一個(gè)有用的函數(shù)是 send(),它可以在調(diào)用生成器函數(shù)時(shí)向生成器中傳遞一個(gè)值,并從當(dāng)前位置繼續(xù)執(zhí)行生成器函數(shù)。具體來(lái)說(shuō),send() 函數(shù)會(huì)將傳遞的值作為 yield 表達(dá)式的返回值,并將生成器函數(shù)的執(zhí)行從 yield 表達(dá)式后的下一條語(yǔ)句開(kāi)始執(zhí)行。以下是一個(gè)示例:

def square_numbers():
    num = 0
    while True:
        # 從外部接收一個(gè)值
        x = yield num ** 2
        if x is not None:
            num = x
        else:
            num += 1

# 創(chuàng)建生成器對(duì)象
my_generator = square_numbers()

# 訪問(wèn)生成器中的元素,并向生成器中傳遞一個(gè)值
print(next(my_generator))
print(next(my_generator))
print(my_generator.send(5))
print(next(my_generator))

輸出:

0
1
25
36

在上面的示例中,我們定義了一個(gè)生成器函數(shù) square_numbers(),它會(huì)不斷地生成平方數(shù)。在函數(shù)中,我們使用 yield 表達(dá)式來(lái)逐個(gè)返回平方數(shù),并將 num 的初始值設(shè)置為 0。當(dāng)從外部通過(guò) send() 函數(shù)向生成器中傳遞一個(gè)值時(shí),我們可以在函數(shù)中將 num 的值修改為傳遞的值,并從 yield 表達(dá)式后的下一條語(yǔ)句開(kāi)始執(zhí)行。

以上就是迭代器和生成器的基本介紹,它們是 Python 中非常重要的概念,可以幫助我們高效地處理大量數(shù)據(jù)。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2023-03-01 00:07:32

JavaScript迭代器生成器

2023-11-15 13:35:00

迭代器生成器Python

2017-06-26 16:26:15

Python迭代對(duì)象迭代器

2021-01-13 05:18:50

數(shù)據(jù)類型性能

2023-09-02 20:15:48

迭代器前端生成器

2024-05-10 11:31:59

Python迭代器生成器

2010-07-20 13:56:26

Python迭代器生成器

2024-11-11 06:10:00

Python生成器迭代器

2016-03-28 10:39:05

Python迭代迭代器

2024-11-01 15:51:06

2020-10-10 09:19:58

JavaScript開(kāi)發(fā)技術(shù)

2023-03-27 10:04:27

數(shù)據(jù)類型浮點(diǎn)型布爾型

2017-09-06 09:26:03

Python生成器協(xié)程

2021-12-04 22:07:44

Python

2021-01-31 21:28:21

Python生成器列表

2020-10-26 13:46:07

Java基礎(chǔ)入門篇

2016-08-18 14:13:55

JavaScript基本數(shù)據(jù)引用數(shù)據(jù)

2011-05-26 13:54:04

Json

2023-12-22 15:32:20

2010-07-22 17:57:40

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)