2024 Python3.10 系统入门+进阶(六):random模块常用方法以及元组常用操作详解

news2024/9/20 17:47:24

目录

  • 一、random模块
    • 1.1 random模块快用导航
    • 1.2 choice()方法---从非空序列中返回一个随机元素
    • 1.3 choices()方法---返回序列的随机元素
    • 1.4 randint()方法---获取指定范围的随机整数
    • 1.5 random()方法---获取0.0~1.0范围内随机浮点数
    • 1.6 randrange()方法---获取指定范围的随机整数
    • 1.7 sample()方法
    • 1.8 shuffle()方法---将指定序列中的元素顺序随机排列
    • 1.9 uniform()方法---获取指定范围之间的随机浮点数
    • 1.10 seed()方法---初始化随机数生成器
  • 二、元组
    • 2.1 定义元组
    • 2.2 元组常见操作
    • 2.3 元组与列表比较

一、random模块

random 模块用于实现各种分布的伪随机数生成器,可以根据不同的实数分布来随机生成值,如随机生成指定范围的整数、浮点数、序列等。该模块中的多数函数都取决于 random()函数 ,该函数通过 Mersenne Twister 作为核心生成器在 [0.0, 1.0) 区间范围内均匀生成随机浮点数。https://github.com/python/cpython/blob/3.10/Lib/random.py

1.1 random模块快用导航

在这里插入图片描述

1.2 choice()方法—从非空序列中返回一个随机元素

choice() 方法用于从非空序列中返回一个随机元素。语法格式如下:

In [4]: random.choice?
Signature: random.choice(seq)
Docstring: Choose a random element from a non-empty sequence.
File:      f:\dev_tools\python\python310\lib\random.py
Type:      method
# 参数说明: seq: 表示需要随机抽取的序列。
# 返回值: 从非空序列中返回一个随机元素。

# 文档
random.choice(seq)
Return a random element from the non-empty sequence seq. If seq is empty, raises IndexError.

使用 choice() 方法在指定的序列中随机获取元素,代码如下:

import random  # 导入随机数模块

number_list = [6, 7, 8, 9, 10]  # 数值列表
str_tuple = ('5', '2', '0')  # 字符元组
print(f'列表随机元素为: {random.choice(number_list)}')
print(f'元组随机元素为: {random.choice(str_tuple)}')

如果传递的参数是一个空序列,则会抛出 IndexError 异常,如下图所示:
在这里插入图片描述

1.3 choices()方法—返回序列的随机元素

choices() 方法是 Python3.6 版本中新增的方法,是 choice() 方法的升级版。语法格式如下:

In [7]: random.choices?
Signature: random.choices(population, weights=None, *, cum_weights=None, k=1)
Docstring:
Return a k sized list of population elements chosen with replacement.

If the relative weights or cumulative weights are not specified,
the selections are made with equal probability.
File:      f:\dev_tools\python\python310\lib\random.py
Type:      method

population: 要从中选择元素的集群,一般多是列表
weights: 一个可选的参数,用于指定集群中每个元素的权重。如果未提供,所有元素被认为具有相同的权重
cum_weights: 累积权重的可选参数。如果提供,则weights参数将被忽略,不能与weights同时存在
k: 需要选择的元素数量。默认是1。
返回值: 返回一个列表,包含从population中随机选择的k个元素

文档:
在这里插入图片描述
使用 choices() 方法获取指定序列中的随机元素,代码如下:

import random

# 从列表 ['Amo', 'Jerry', 'Ben'] 中随机选择1个元素
print(random.choices(['Amo', 'Jerry', 'Ben']))
# 从列表 ['apple', 'banana', 'cherry'] 中随机选择5个元素(结果可能包含重复元素)
print(random.choices(['apple', 'banana', 'cherry'], k=5))

# 使用权重进行选择
# 使用权重从列表 ['apple', 'banana', 'cherry'] 中随机选择5个元素
choices_with_weights = random.choices(['apple', 'banana', 'cherry'], weights=[1, 2, 3], k=5)
print(choices_with_weights)  # 'cherry' 的概率是 3。所以 'cherry' 更有可能被选中。
"""
解释累计权重
假设你有一个列表中的元素 A, B, 和 C,以及它们对应的权重分别为 1, 2, 和 3。这些权重表示每个元素被选中的相对可能性。
为了理解累计权重,先计算普通权重的累积和:
元素 A 的权重:1(A 被选中的概率为 1)
元素 B 的权重:2(B 被选中的概率为 2)
元素 C 的权重:3(C 被选中的概率为 3)

累计权重的计算: 累计权重表示为从第一个元素到当前元素的所有权重的总和:
元素 A 的累计权重:1
元素 B 的累计权重:1 + 2 = 3
元素 C 的累计权重:1 + 2 + 3 = 6
因此,A, B, 和 C 对应的累计权重为 [1, 3, 6]。

累计权重的意义: 累计权重的意义在于,它将每个元素的选择概率表示为在一个区间上的概率。例如:
如果生成的随机数在 [0, 1) 范围内,那么选择 A。
如果生成的随机数在 [1, 3) 范围内,那么选择 B。
如果生成的随机数在 [3, 6) 范围内,那么选择 C。
这个机制可以通过 random.choices 函数中的 cum_weights 参数实现。这样,随机选择的概率就与累积权重所代表的区间相对应。
"""
# 使用累积权重从列表 ['apple', 'banana', 'cherry'] 中随机选择5个元素
choices_with_cum_weights = random.choices(['apple', 'banana', 'cherry'], cum_weights=[1, 3, 6], k=5)
print(choices_with_cum_weights)
# apple  的累计权重是 1,占总权重 6 的 1/6,因此有 1/6 的概率被选中。
# banana 的累计权重是 3,占总权重 6 的 3/6,因此有 2/6 的概率被选中。
# cherry 的累计权重是 6,占总权重 6 的 6/6,因此有 3/6 的概率被选中。

# 从元组中随机选择3个元素
choices_from_tuples = random.choices([(1, 'apple'), (2, 'banana'), (3, 'cherry')], k=3)
print(choices_from_tuples)
# 从字符串中随机选择5个字符
choices_from_string = random.choices('abcdef', k=5)
print(choices_from_string)

如果传递一个空的 population,会抛出 IndexError,如下图所示:

如果 weights 列表的长度与 population 的长度不匹配,会抛出 ValueError,如下图所示:
在这里插入图片描述
与 weights 类似,如果 cum_weights 列表的长度与 population 列表的长度不匹配,也会抛出 ValueError,这里不再进行演示。如果同时提供了 weights 和 cum_weights 参数,会抛出 TypeError,如下图所示:
在这里插入图片描述

1.4 randint()方法—获取指定范围的随机整数

randint() 方法用于获取指定范围的随机整数。语法格式如下:

In [17]: random.randint?
Signature: random.randint(a, b)
Docstring:
Return random integer in range [a, b], including both end points.

File:      f:\dev_tools\python\python310\lib\random.py
Type:      method

a: 表示随机整数范围的起始值。
b: 表示随机整数范围的结束值,随机出现的整数包含b参数。
返回值: 返回指定范围的随机整数。

使用 randint() 方法获取指定范围的随机整数,代码如下:

import random

num = random.randint(1, 10)
print(num)  # 生成一个 1 到 10 之间的随机整数
num = random.randint(-10, -1)
print(num)  # 生成一个负数范围内的随机整数
random_numbers = [random.randint(1, 100) for _ in range(5)]
print(random_numbers)  # 生成多个随机整数并存储在列表中

a 和 b 可以是正数、负数或零,但 a 必须小于或等于 b。如果 a 大于 b,会抛出 ValueError 异常,如下图所示:

1.5 random()方法—获取0.0~1.0范围内随机浮点数

random() 方法用于获取 0.0~1.0 范围内随机浮点数。语法格式如下:

In [19]: num = random.random?
Signature: random.random()
Docstring: random() -> x in the interval [0, 1).
Type:      builtin_function_or_method

返回值: 返回一个浮点数,范围在 [0.0, 1.0) 之间(包含 0.0,但不包含 1.0

使用 random() 方法获取随机浮点数,代码如下:

import random

# 生成一个随机浮点数
num = random.random()
print(num)
# 生成一个范围内的随机浮点数
num = 5.0 + (10.0 - 5.0) * random.random()
print(num)  # 这个表达式生成的随机数会在 [5.0, 10.0) 范围内。
# 生成多个随机浮点数并存储在列表中
random_numbers = [random.random() for _ in range(5)]
print(random_numbers)
"""
使用场景:
①: 模拟随机事件:如模拟硬币投掷,0.5 以下为正面,0.5 以上为反面。
②: 生成随机颜色值:通常颜色的 RGB 值可以在 0 到 1 之间生成。
③: 随机抽样:在某些算法中需要在 [0, 1) 范围内生成随机数进行概率判断。
"""

1.6 randrange()方法—获取指定范围的随机整数

randrange() 方法用于获取指定范围的随机整数。语法格式如下:

In [21]: random.randrange?
Signature: random.randrange(start, stop=None, step=1)
Docstring:
Choose a random item from range(start, stop[, step]).

This fixes the problem with randint() which includes the
endpoint; in Python this is usually not what you want.
File:      f:\dev_tools\python\python310\lib\random.py
Type:      method

stop: 在没有指定 start 参数时表示 0 至 stop 之间的一个随机整数,其中不包含 stop 指定的值。
start: 表示随机范围的起始值。指定该参数后,stop 参数将作为随机范围的结束值。
step: 表示步长,默认为1。
返回值: 返回指定范围的随机整数。

使用 randrange() 方法获取指定范围的随机整数,代码如下:

import random

# 生成一个 0 到 9 之间的随机整数
num1 = random.randrange(10)  # 等价于: random.randrange(0,10)
print(num1)
num2 = random.randrange(0, 10)
print(num2)
# 生成一个 1 到 9 之间的随机整数
num = random.randrange(1, 10)
print(num)
# 生成一个 0 到 11 之间的偶数
num = random.randrange(0, 11, 2)
print(num)
# 生成一个负数范围内的随机整数
num = random.randrange(-10, 0)
print(num)

step 不能为 0,否则会抛出 ValueError,如下图所示:
在这里插入图片描述
如果 start 大于或等于 stop,会抛出 ValueError,因为没有有效的整数可以生成,如下图所示:
在这里插入图片描述

1.7 sample()方法

语法格式如下:

In [24]: random.sample?
Signature: random.sample(population, k, *, counts=None)
Docstring:
Chooses k unique random elements from a population sequence or set.

Returns a new list containing elements from the population while
leaving the original population unchanged.  The resulting list is
in selection order so that all sub-slices will also be valid random
samples.  This allows raffle winners (the sample) to be partitioned
into grand prize and second place winners (the subslices).

Members of the population need not be hashable or unique.  If the
population contains repeats, then each occurrence is a possible
selection in the sample.

Repeated elements can be specified one at a time or with the optional
counts parameter.  For example:

    sample(['red', 'blue'], counts=[4, 2], k=5)

is equivalent to:

    sample(['red', 'red', 'red', 'red', 'blue', 'blue'], k=5)

To choose a sample from a range of integers, use range() for the
population argument.  This is especially fast and space efficient
for sampling from a large population:

    sample(range(10000000), 60)
File:      f:\dev_tools\python\python310\lib\random.py
Type:      method

参数说明:
population: 一个序列或集合,要从中抽取元素的集合
k: 表示抽取元素的个数。
counts: 一个与 population 同长度的可选参数,用于指定 population 中每个元素的计数(即每个元素的"权重""频率")。
返回值: 返回一个列表,包含从 population 中随机抽取的 k 个元素。元素可以根据 counts 的权重重复抽取。

示例代码:

import random

items = ['apple', 'banana', 'cherry']
counts = [2, 3, 5]  # 'apple' 出现2次, 'banana'出现3次, 'cherry'出现5次
sample = random.sample(items, 5, counts=counts)
print(sample)
# 多个相同元素的抽取
items = ['A', 'B', 'C']
counts = [10, 1, 1]  # 'A' 出现10次,'B' 和 'C' 各出现1次
sample = random.sample(items, 5, counts=counts)
print(sample)
# 模拟骰子投掷
sides = [1, 2, 3, 4, 5, 6]
counts = [1, 1, 1, 1, 1, 1]  # 每个面出现1次,表示公平骰子

rolls = random.sample(sides, 3, counts=counts)
print(rolls)

# 在不使用 counts 参数的情况下,random.sample 的基本用法是从一个序列中随机抽取指定数量的唯一元素。以下是一些常见的示例
# 从列表中抽取元素
items = ['apple', 'banana', 'cherry', 'date', 'elderberry']
# 从 items 中随机抽取 3 个元素
sample = random.sample(items, 3)
print(sample)
# 从字符串中抽取字符
chars = 'abcdefg'
# 从 chars 中随机抽取 4 个字符
sample = random.sample(chars, 4)
print(sample)
# 从元组中抽取元素
items = ('apple', 'banana', 'cherry', 'date', 'elderberry')
# 从 items 中随机抽取 2 个元素
sample = random.sample(items, 2)
print(sample)
# 从集合中抽取元素
items = {'apple', 'banana', 'cherry', 'date', 'elderberry'}
# 从 items 中随机抽取 3 个元素
# ps:DeprecationWarning: Sampling from a set deprecated since Python 3.9 
# and will be removed in a subsequent version.
sample = random.sample(items, 3)
print(sample)
# 从范围对象中抽取元素
# 从 0 到 19 的范围中随机抽取 5 个元素
sample = random.sample(range(20), 5)
print(sample)
# 抽取整个序列的元素(即随机排列)
items = ['apple', 'banana', 'cherry', 'date', 'elderberry']
# 随机排列 items 列表
sample = random.sample(items, len(items))
print(sample)

1.8 shuffle()方法—将指定序列中的元素顺序随机排列

shuffle() 方法用于将指定序列中的元素顺序随机排列,只针对可变序列。语法格式如下:

In [28]: random.shuffle?
Signature: random.shuffle(x, random=None)
Docstring:
Shuffle list x in place, and return None.

Optional argument random is a 0-argument function returning a
random float in [0.0, 1.0); if it is the default None, the
standard random.random will be used.
File:      f:\dev_tools\python\python310\lib\random.py
Type:      method

参数说明:
x: 表示需要随机排列元素的序列。通常是一个列表,但也可以是任何可变序列类型。
random: 可选参数,返回 [0.0,1.0)中的随机浮点数,默认情况下,该参数为 random()方法。
如果提供,则应为一个生成随机数的函数或方法(通常很少用到)
random.shuffle() 没有返回值。它会在原地修改传入的列表,使其元素顺序随机化。

使用 shuffle() 方法将指定序列中的元素顺序随机排列,代码如下:

import random

# 将列表中的元素随机打乱
items = [1, 2, 3, 4, 5]
random.shuffle(items)
print(items)
# 打乱字符串列表
items = ['apple', 'banana', 'cherry', 'date']
random.shuffle(items)
print(items)
# 模拟牌的洗牌过程
deck = list(range(1, 53))  # 创建一个1到52的牌的列表
random.shuffle(deck)
print(deck)
"""
使用场景:
① 打乱数据集:在机器学习中,通常需要随机打乱数据集,以确保训练和测试数据的随机性。
② 随机排列:需要将元素按随机顺序排列时,shuffle 是最简单的方法。
③ 游戏开发:模拟卡牌游戏的洗牌等操作。
"""
s1 = 'hello world'
# random.shuffle(s1)  # TypeError: 'str' object does not support item assignment
# 不能对不可变序列(如字符串或元组)直接使用 shuffle(),因为它会尝试修改序列,而这是不允许的。

1.9 uniform()方法—获取指定范围之间的随机浮点数

uniform() 方法用于获取指定范围之间的随机浮点数。语法格式如下:

In [29]: random.uniform?
Signature: random.uniform(a, b)
Docstring: Get a random number in the range [a, b) or [a, b] depending on rounding.
File:      f:\dev_tools\python\python310\lib\random.py
Type:      method

参数说明:
a: 表示指定随机范围的起始值,该值可能会出现在结果中。可以是浮点数或整数
b: 表示指定随机范围的结束值,该值可能会出现在结果中。可以是浮点数或整数
返回值: 返回一个浮点数,该浮点数在 [a, b] 区间内,包括 a 和 b。
a 和 b 可以是任意顺序,如果 a > b,函数会自动调整顺序,使得结果仍然在 [a, b] 范围内。
生成的浮点数是均匀分布的,即在 [a, b] 区间内的每个值出现的概率是相等的。

使用 uniform() 方法获取指定范围之间的随机浮点数,代码如下:

import random

# 生成 0 到 1 之间的随机浮点数
num = random.uniform(0, 1)
print(num)

# 生成负数范围内的随机浮点数
num = random.uniform(-10, -1)
print(num)

# 生成一个正负范围内的随机浮点数
num = random.uniform(-5, 5)
print(num)

# 生成大范围的随机浮点数
num = random.uniform(100, 1000)
print(num)
print(random.uniform(1.0, 5.0))  # 指定参数为浮点数
print(random.uniform(5.0, 1.0))  # 参数a大于参数b

1.10 seed()方法—初始化随机数生成器

seed() 方法用于初始化随机数生成器,可以在调用其他方法之前使用,以实现随机相同的数值。语法格式如下:

In [30]: random.seed?
Signature: random.seed(a=None, version=2)
Docstring:
Initialize internal state from a seed.

The only supported seed types are None, int, float,
str, bytes, and bytearray.

None or no argument seeds from current time or from an operating
system specific randomness source if available.

If *a* is an int, all bits are used.

For version 2 (the default), all of the bits are used if *a* is a str,
bytes, or bytearray.  For version 1 (provided for reproducing random
sequences from older versions of Python), the algorithm for str and
bytes generates a narrower range of seeds.
File:      f:\dev_tools\python\python310\lib\random.py
Type:      method
参数说明:
a: (可选)用于初始化随机数生成器的种子值。可以是任何可哈希的对象(如整数、浮点数、字符串等)。
如果未提供,或为 None,则使用系统时间或其他来源的随机数据来生成种子。
version: 默认值为2,如果参数a为整数将不计较参数version对应的值是否相同,
如果参数a为字符类型,此时需要参数version对应的值相同。
表示使用的种子生成算法版本。对于大多数应用场景,你可以忽略这个参数。
random.seed() 没有返回值。它仅用于初始化随机数生成器。

使用 seed() 方法,通过设置相同的种子数随机生成相同数值,代码如下:

import random

"""
使用场景:
① 可复现的随机数序列:
通过设置相同的种子值,你可以确保每次运行程序时生成的随机数序列是相同的。这在调试、测试和需要可重复的实验时非常有用。

② 控制随机性:
在某些情况下,你可能希望对生成的随机数序列进行更多控制,例如在教学示例中演示相同的随机数序列。
"""

# 1.生成相同的随机数序列
random.seed(42)  # 设置种子值为42
print(random.random())  # 生成一个随机浮点数
print(random.randint(1, 10))  # 生成一个1到10之间的随机整数
print(random.choice(['apple', 'banana', 'cherry']))  # 从列表中随机选择一个元素
# 由于设置了相同的种子值,每次运行此代码时,生成的随机数序列都是相同的。

# 2.在不同的种子值下生成不同的随机数序列
random.seed(10)
print(random.random())  # 生成一个随机浮点数
random.seed(20)
print(random.random())  # 生成另一个随机浮点数

# 3.不设置种子值(使用默认的随机种子)
random.seed()
print(random.random())  # 生成一个随机浮点数
print(random.randint(1, 10))  # 生成一个1到10之间的随机整数
"""
ps: ① 可重复性:设置相同的种子值后,任何使用 random 模块生成的随机数序列都是可重复的。
② 影响范围:random.seed() 会影响同一随机数生成器的所有后续随机操作,因此在设置种子值后,
后续所有调用 random 模块中的函数生成的随机数都将受到影响。
"""
random.seed(a='1', version=1)  # 字符种子
print(f"字符种子1: {random.random()}")
random.seed(a='1', version=1)  # 字符种子2
print(f"字符种子2: {random.random()}")

二、元组

元组(tuple)是 Python 中另一个重要的序列结构,与列表类似,也是由一系列按特定顺序排列的元素组成(线性数据结构—顺序表实现), 但是它是不可变序列。因此,元组也可以称为不可变的列表。在形式上,元组的所有元素都放在一对 "()" 中,两个相邻元素间使用 "," 分隔。在内容上,可以将整数、实数、字符串、列表、元组等任何类型的内容放入到元组中,并且在同一个元组中,元素的类型可以不同,因为它们之间没有任何关系。通常情况下,元组用于保存程序中不可修改的内容。

说明:从元组和列表的定义上看,这两种结构比较相似,二者之间的主要区别为:元组是不可变序列,列表是可变序列。即元组中的元素不可以单独修改,而列表则可以任意修改。

在 Python 中提供了多种创建元组的方法,下面分别进行介绍。

2.1 定义元组

在 Python 中,定义元组有两种方法,简单说明如下。

1. 小括号语法。 在 Python 中,可以直接通过小括号 () 创建元组。创建元组时,小括号内的元素用逗号分隔。其语法如下:

tuple_name = (element1, element2, element3,, elementn)

其中,tuple_name 表示元组的名称,可以是任何符合 Python 命名规则的标识符;element1、element2、element3、elementn 表示元组中的元素,个数没有限制,并且只要是 Python 支持的数据类型就可以。

【示例1】 通过“()”符号定义元组。

empty = ()  # 创建空元组
num = (7, 14, 21, 28, 35, 42, 49, 56, 63)  # 创建数值元组
team = ('马刺', '火箭', '勇士', '湖人')  # 创建字符串类型元组
# 混合类型元组
untitle = ('Python', 28, ('人生苦短', '我用Python'), ['爬虫', '自动化运维', '云计算', 'Web开发'])
print('数值元组:', num)
print('字符串元组:', team)
print('混合类型元组:', untitle)
print('空元组:', empty)

【示例2】 不用括号定义元组。在Python中,元组使用一对小括号将所有的元素括起来,但是小括号并不是必须的,只要将一组值用逗号分隔开来,Python就可以视其为元组。

tuple1 = "a", "b", "c"  # 定义字符串元组
tuple2 = 1, 2, 3  # 定义数字元组
tuple3 = "渔舟唱晚", "高山流水", "出水莲", "汉宫秋月"
un_title = "Python", 28, ("人生苦短", "我用Python"), ["爬虫", "自动化运维", "云计算", "Web开发"]

print('不是使用括号来定义元组:', tuple1)

【示例3】 定义单个元素的元组。如果要创建的元组只包括一个元素,则需要在定义元组时,在元素的后面加一个逗号 ,

t1 = ('apple',)
t2 = 'apple',
t3 = ('apple')
t4 = 'apple'
print(type(t1), type(t2))  # <class 'tuple'> <class 'tuple'>
print(type(t3), type(t4))  # <class 'str'> <class 'str'>
print(t2)  # ('apple',)

【示例4】 通过元组推导式生成元组。

import random

tuple1 = tuple((i for i in range(10)))  # 创建0~10之间(不包括10)的数字元组
print(tuple1)
tuple2 = tuple((i for i in range(10, 100, 10)))  # 创建10~100之间(不包括100)的整十数元组
print(tuple2)
# 创建10个4位数的随机数元组
tuple3 = tuple((random.randint(1000, 10000) for i in range(10)))
print(tuple3)
tuple4 = tuple((i for i in '壹贰叁肆伍'))  # 将字符串转换为元组
print(tuple4)
# 生成所有单词首字母元组
tuple5 = tuple((i[0] for i in ('Early', 'bird', 'gets', 'the', 'worm')))
print(tuple5)
# 将原元组中的数字折半后生成新的元组
tuple6 = tuple((int(i * 0.5) for i in (1200, 5608, 4314, 6060, 5210)))
print(tuple6)
tuple7 = tuple((i for i in ['Early', 'bird', 'gets', 'the', 'worm']))  # 通过列表生成新的元组
print(tuple7)
# 将字典的Key生成新的元组
tuple8 = tuple((key for key in {'qq': '84978981', 'mr': '84978982', 'wgh': '84978980'}))
print(tuple8)
tuple9 = tuple((key for key in {1, 3, 5, 7, 9}))  # 通过集合生成有序元组
print(tuple9)

与列表一样,Python 对元组元素的类型没有严格的限制,每个元素可以是不同的数据类型,但是从代码的可读性和程序的执行效率考虑,建议统一元组元素的数据类型。

2. 使用 tuple() 函数。 通过 tuple() 函数可以将一个序列作为参数,并将这个序列转换为元组。其语法格式如下:

In [31]: tuple?
Init signature: tuple(iterable=(), /)
Docstring:
Built-in immutable sequence.

If no argument is given, the constructor returns an empty tuple.
If iterable is specified the tuple is initialized from iterable's items.

If the argument is a tuple, the return value is the same object.

参数说明:

  1. iterable:表示可以转换为元组的数据,其类型可以是 range 对象、字符串、列表、字典、元组或者其他可迭代类型的数据;如果参数是元组,参数则会被原样返回。
  2. 返回值:元组。如果不传入任何参数,将返回一个空元组。

【示例1】将序列转换为元组。

print(tuple(range(15, 30, 3)))  # 将range对象转换为元组
print(tuple())  # 不传入参数,创建一个空元组
print(tuple('①②③④'))  # 将字符串转换为元组
print(tuple(['㈠', '㈡', '㈢', '㈣']))  # 将列表转换为元组
print(tuple(('壹', '贰', '叁', '肆')))  # 参数为元组则原样输出
print(tuple('Python'))  # 参数为字符串
print(tuple(range(10, 20, 2)))  # 创建一个10~20之间(不包括20)所有偶数的元组
print(tuple((89, 63, 100)))  # 原样返回

【示例2】将列表转换为元组。

list1 = ['Forever', 'I Need You', 'Alone', 'Hello']  # 英文歌曲列表
print('列表:', list1)  # 输出英文歌曲列表
tuple1 = tuple(list1)  # 转换为元组
print('元组:', tuple1)  # 输出元组
print('将列表中指定元素转换为元组:', tuple(list1[3]))
print('将列元素范围转换为元组:', tuple(list1[1:]))

【示例3】将字典转换为元组。

# 定义的字典数据
dictionary = {'小英子': '5月5日', '阳光': '12月8日', '茜茜': '7月6日', }
print(dictionary)  # 输出字典
print(tuple(dictionary))  # 转换为元组输出

提示:tuple() 函数的参数为字典时,会返回字典的 key 组成的元组。如果需要将字典中的 values() 转换为元组时可以使用如下代码:

print(tuple(dictionary.values()))  # 将字典中values转换为元组

【示例4】将generator对象转换为元组。

import random  # 导入random标准库

# 创建一个包含10个随机数的生成器对象
random_number = (random.randint(10, 100) for i in range(10))
random_number = tuple(random_number)  # 转换为元组
print('转换后:', random_number)  # 输出转换后的元组

2.2 元组常见操作

关于元组的删除、访问、计算元组的长度、统计元素个数、获取元素下标、转换为索引序列的操作和列表类似,故笔者这里就不再进行赘述,简单进行一下演示,如下:

'''
1.删除元组 del tuple_name
del 语句在实际开发时,并不常用。因为 Python 自带的垃圾回收机制会自动销毁不用的元组,
所以即使不手动将其删除,Python也会自动将其回收。
'''
verse = ('春眠不觉晓', 'Python不得了', '夜来爬数据', '好评知多少')
del verse
'''
2.元组长度:len()函数
'''
tuple1 = ('a', 'b', 'c')  # 定义字符串元组
print(len(tuple1))  # 3
'''
3.访问元组:tuple_name[index]
'''
tuple2 = ('a', 'b', 'c')  # 定义字符串元组
print(tuple1[0], tuple1[-1])  # a c
'''
4.count()方法:统计指定元素出现在元组对象中的次数
'''
tuple3 = (1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 4)
print(tuple3.count(3), tuple3.count(0))  # 2 0
'''
5.index()方法:获取指定元素的下标索引值,元组对象中不存在指定的元素,将会抛出异常。
'''
tuple4 = (1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 4)
print(tuple3.index(4))  # 3

'''
enumerate()函数
'''
t1 = ('a', 'b', 'c', 'd')  # 定义元组
enum = enumerate(t1)
t2 = tuple(enum)
print(t2)  # ((0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'))

'''
+与*操作
'''
t1 = ('1',) * 3
t2 = (2, 3) + t1
print(t1, t2)  # ('1', '1', '1') (2, 3, '1', '1', '1')
'''
遍历
'''
coffee_list = ('蓝山', '卡布奇诺', '曼特宁', '摩卡', '麝香猫', '哥伦比亚')  # 定义元组
print('您好,欢迎光临 ~ 伊米咖啡馆 ~我店有:')
for coffee in coffee_list:  # 遍历元组
    print(coffee + '咖啡', end=' ')

'''
判断元素是否在元组中
'''
print()
print(1 in (1, 2, 3, 4))  # True
print(5 not in (1, 2, 3, 4))  # True

注意:元组是不可变序列,所以我们不能对它的单个元素值进行修改。
在这里插入图片描述
但是要注意下面这个例子,原理我这里就不赘述了,和列表一样:

t1 = ([1]) * 3
t1[1] = 100  # ?
print(t1)  # 注意此时的t1不是元组,是列表 [1,100,1]
# 注意下面的例子
t2 = ([1],) * 3
print(t2)  # ([1], [1], [1])
# t2[1] = 100 # 报错 TypeError: 'tuple' object does not support item assignment
t2[0][0] = 100
print(t2)  # ([100], [100], [100])

2.3 元组与列表比较

元组是不可变的序列,而列表是可变的序列。具体比较说明如下:

1. 相同点

  1. 定义元组与定义列表的方式相似,但是语法表示不同,元组使用小括号表示,而列表使用中括号表示。
  2. 元组的元素与列表的元素一样按定义的次序进行排序。元组的索引与列表一样从0开始,所以一个非空元组的第一个元素总是t[0]。
  3. 负数索引与列表一样从元组的尾部开始计数,倒数第1个元素为-1。
  4. 与列表一样也可以使用切片。当分隔一个元组时,也会得到一个新的元组。
  5. 可以使用 in 或 not in 运算符查看一个元素是否存在于元组或列表中。

2. 不同点

  1. 元组是只读序列,与列表相比,没有写操作的相关方法。不能增加元素,因此元组没有 append() 和 extend() 方法。不能删除元素,因此元组没有 remove() 和 pop() 方法。
  2. 列表不能够作为字典的键使用,而元组可以作为字典的键使用。

3. 元组的优点

元组比列表操作速度快。

  1. 如果定义一个常量集,并且仅用于读取操作,建议优先选用元组结构。
  2. 如果对一组数据进行 写保护,建议使用元组,而不是列表。如果必须要改变这些值,则需要执行从元组到列表的转换。

4. 相互转换

从效果上看,元组可以冻结一个列表,而列表可以解冻一个元组。

  1. 使用内置的 tuple() 函数可以将一个列表转换为元组。
  2. 使用内置的 list() 函数可以将一个元组转换为列表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2064193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ArcGIS Pro基础:如何将数据和引用地图样式一起打包分享

如上所示&#xff0c;有2个矢量图斑&#xff0c;一个是耕地地块&#xff0c;另一个是范围图斑&#xff0c;如果我们需要把此工程的所有数据以及引用地图一起分享给别人&#xff0c;就可以使用【打包工程】这个工具。 如上所示&#xff0c;在【地理处理】下输入【打包工程】&am…

Excel的使用总结1

目录 1、汇总公式&#xff1a;TEXTJOIN 2、excel中选择某个区域的方法 3、excel中如何在复制的时候&#xff0c;不将公式一起复制过去 4、想要自动填充某个区域的值的方法 1、汇总公式&#xff1a;TEXTJOIN TEXTJOIN 函数 - Microsoft 支持 例&#xff1a;TEXTJOIN("…

Java数组07:稀疏数组

本节内容视频链接&#xff1a; https://www.bilibili.com/video/BV12J41137hu?p59&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p59&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 稀疏数组&#xff08;‌sparse …

[SWPUCTF 2023 秋季新生赛]UnS3rialize

[SWPUCTF 2023 秋季新生赛]UnS3rialize 点开之后得到一串php代码&#xff1a; <?php highlight_file(__FILE__); error_reporting(0); class NSS {public $cmd;function __invoke(){echo "Congratulations!!!You have learned to construct a POP chain<br/>&q…

CDGA|数据治理为企业赋能价值的几种形式

在当今这个数据驱动的时代&#xff0c;数据已成为企业最宝贵的资产之一&#xff0c;而数据治理作为确保数据质量、安全性、合规性和可访问性的关键过程&#xff0c;正逐步成为企业转型升级、提升竞争力的核心驱动力。数据治理不仅关乎技术层面的优化&#xff0c;更是企业战略实…

【C++ Primer Plus习题】2.5

问题: 解答: #include <iostream> using namespace std;#define CEL_TO_FAH(c) 1.8*c32.0float celToFah(float value) {float fahrenheit CEL_TO_FAH(value);return fahrenheit; }int main() {float celsius 0;cout << "请输入一个摄氏温度的值:";ci…

ARM——驱动——内核编译

一、内核的介绍 Linux内核是Linux操作系统的核心内容&#xff0c;它负责管理系统的硬件资源&#xff0c;并为上层的应用程序提供接口。&#xff08;在上文都有所介绍&#xff09; 功能&#xff1a; 进程管理&#xff1a;内核负责创建、调度、同步和终止进程。它还管理进程间的…

linux应用编程--网络编程(socket编程基础)

介绍&#xff1a;套接字&#xff08;socket&#xff09;是 Linux 下的一种进程间通信机制&#xff08;socket IPC&#xff09;&#xff0c;在前面的内容中已经给大家提到过&#xff0c; 使用 socket IPC 可以使得在不同主机上的应用程序之间进行通信&#xff08;网络通信&#…

Python(PyTorch)多语言图像感知质量指标算法

&#x1f3af;要点 &#x1f3af;算法实现&#xff1a;&#x1f58a;PyTorch单尺度和多尺度质量指标算法 | &#x1f58a;C单尺度质量指标算法 | &#x1f58a;Rust多尺度质量指标算法 | &#x1f58a;LabVIEW单尺度质量指标算法 | &#x1f58a;MATLAB单尺度质量指标算法 | &…

TCP+UDP通信

一、UDP协议 1.1、recvfrom() 参数说明 int sockfd, //socket 的fd void *buf, // 保存数据的一块空间的地址 size_t len, //这块空间的大小 int flags,// 0 默认的接收方式 -----阻塞方式 默认行为是阻塞 MSG_DONTWAIT 不阻塞方式&#xff0c;用他的话代表读的时候是非…

宠物掉毛、有异味怎么办?怎么选择宠物空气净化器?

每当我和朋友提起我家养猫养狗之后&#xff0c;不少朋友总会带着好奇与担忧的表情&#xff0c;半开玩笑地说&#xff1a;“你家里岂不是充满了‘特别’的味道&#xff1f;”这也不怪她们会有这种印象&#xff0c;因为大部分养宠家庭可能都会遇到浮毛满天飞的情况&#xff0c;但…

深入探讨SD NAND的SD模式与SPI模式初始化

在嵌入式系统和存储解决方案中&#xff0c;SD NAND的广泛应用是显而易见的。CS创世推出的SD NAND支持SD模式和SPI模式&#xff0c;这两种模式在功能和实现上各有优劣。在本文中&#xff0c;我们将深入探讨这两种模式的初始化过程&#xff0c;并比较它们在不同应用场景下的优劣&…

什么是上网行为管理呢?【上网行为管理系统功能介绍 】

小编想跟大家介绍上网行为管理系统的功能&#xff0c;可以提高工作效率和安全性。如果你也和部分管理者一样&#xff0c;经常为网络管理头疼&#xff0c;不妨看看小编解析的上网行为管理功能&#xff0c;会让眼前一亮哦&#xff01;上网行管控 应用场景&#xff1a;过滤非法网站…

Tomcat类加载机制详解

1.Tomcat类加载机制详解 1.1 JVM类加载器 Java中有 3 个类加载器&#xff0c;另外你也可以自定义类加载器 引导&#xff08;启动&#xff09;类加载器&#xff1a;负责加载支撑JVM运行的位于JRE的lib目录下的核心类库&#xff0c;比如rt.jar、charsets.jar等扩展类加载器&am…

流量掘金付费进群源码,最新无人直播变现玩法

外面1800流量掘金付费进群搭建 最新无人直播变现玩法 流量掘金付费进群网站源码 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89662670 更多资源下载&#xff1a;关注我。

消化学科的领军人物陈烨教授在会议上作了《幽门螺杆菌的规范检测与质控》的专题报告

由广东省药学会主办的“第十九届消化疾病诊疗会暨胃肠疾病药物临床研究交流会”于2024年8月8日-9日在广东省深圳市召开。陈烨教授&#xff0c;作为消化学科的领军人物、中华医学会消化病学分会的常务委员&#xff0c;以及全国幽门螺杆菌学组的组长&#xff0c;在会议上作了《幽…

用爬虫玩转石墨文档细解

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 石墨文档是一款受欢迎的在线协作工具&#xff0c;它允许多人实时编辑和共享文档。通过爬虫技术&#xff0c;我们可以自动化地获取石墨文档中的内容&#xff0c;进行数据分析或备份。不过&#xff0c;在使用爬虫技术时&a…

Nmap扫描六种端口状态介绍

传统意义上的端口状态只有 open 或 close 两种。网络发现扫描最常用的工具是Nmap&#xff0c;可以提供更细分的端口状态&#xff0c;共计六种&#xff0c;分别为open, closed, filtered, unfiltered, open|filtered, or closed|filtered。 1. 端口状态介绍 开放的&#xff08;o…

艾多美携手三星SDS,共筑物流优化与数字化转型新篇章!

8月20日下午&#xff0c;艾多美公司董事长朴炳宽受邀出席了由山东省人民政府、韩国产业通商资源部联合主办的“山东省—韩国经贸合作交流会”。在此次盛会上&#xff0c;艾多美中国与全球领先的IT解决方案提供商三星SDS达成了具有重要里程碑意义的战略合作&#xff0c;双方将共…

安防监控EasyCVR视频监控汇聚管理平台登录1分钟之后自动退出是什么原因?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。该平台不仅具备视频资源管理、设备管理、用户管理、网络管理和安全管理等功能&#xff0c;还支持多种主流标准协议&#xff0c;如GB28181、RTSP/Onvif、RTMP、部标JT808、GA/T 1400协…