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

本文主要是介绍2024 Python3.10 系统入门+进阶(六):random模块常用方法以及元组常用操作详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 一、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:      methodpopulation: 要从中选择元素的集群,一般多是列表
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:      methoda: 表示随机整数范围的起始值。
b: 表示随机整数范围的结束值,随机出现的整数包含b参数。
返回值: 返回指定范围的随机整数。

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

import randomnum = 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:      methodstop: 在没有指定 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 randomitems = ['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 randomtuple1 = 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() 函数可以将一个元组转换为列表。

这篇关于2024 Python3.10 系统入门+进阶(六):random模块常用方法以及元组常用操作详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094586

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于