代码改变世界

Python元组数据类型详解

2021-11-12 16:52  何小六soso  阅读(462)  评论(0编辑  收藏  举报

Python元组数据类型详解

元组和列表相同,都是一组有序的数据的组合

元组中的元素一旦定义不可修改

元组定义

  • 定义空元组 变量=(),或者 变量=tuple()
  • 定义带元素元组 变量=(1,2,3)
  • 简化定义 变量=1,2,3
  • 注意:如果元组中只有一个元素时,元素后必须加, 变量=(1,)

元组的相关操作

由于元组是不可变类型,只能使用索引进行访问,不可以进行增删改

但元组也可以和列表相同,使用切片形式获取元素

# 元组的基本定义与操作

varint=1,
vart=(1,)
print(type(varint),type(vart))

# 元组的切片操作
vart=(1,2,3,4,5,6,5,6,7,4,3,2,)
res=vart[:]
print(res)
res=vart[1:]
print(res)
print(vart[0:-1])
print(vart[0:])
print(vart[::-1]) #倒着输出

# 获取数组长度
print(len(vart))

# 统计元素出现的个数
print(vart.count(5))

# 获取元素在元组中的索引值
vart=['python','java','php','c','c++','vb','shell','php']
print(vart.index('php')) # 2

# 从指定位置开始查找
print(vart.index('php',3)) # 7

# 从指定位置查找到指定位置结束
print(vart.index('php',0,3)) # 2

#元组的拼接
var1=1,2,3
var2='a','b','c'
print(var1+var2) # (1, 2, 3, 'a', 'b', 'c')

#元组的复制
print(vart*2) # ['python', 'java', 'php', 'c', 'c++', 'vb', 'shell', 'php', 'python', 'java', 'php', 'c', 'c++', 'vb', 'shell', 'php']

元组推导式(生成器)

列表推导式返回了一个列表,元组推导式返回了一个生成器

生成器:

  • 生成器是一个特殊的迭代器,生成器可以自定义,也可以用元组推导式定义

  • 生成器是按照某种算法推算下一个数据或结果,只需要网内存中存储一个生成器,节约内存消耗,提升性能

语法:

  • 里面是推导式,外面是()的结果是一个生成器

  • 自定义生成器,还有yield关键字的函数就是生成器

#元组推导式(生成器)
# 列表推导式
varlist=[1,2,3,4,5,56,7]
newlist=[i*2 for i in varlist]
print(newlist) # [2, 4, 6, 8, 10, 112, 14]

# 元组推导式 返回生成器:genexpr
vart=(1,2,3,4,5,6)
newvart=(i*2 for i in vart)
print(newvart) #  <generator object <genexpr> at 0x0000022C6A3BE580>
# 操作生成器
# 生成器是迭代器的一种,可以使用迭代器操作
# 使用next()函数操作 
print(next(newvart)) # 2
print(next(newvart)) # 4
print(next(newvart)) # 6
# 使用list()函数操作
newvart=(i*2 for i in vart)
print(list(newvart))
# 使用tuple()函数操作
newvart=(i*2 for i in vart) # [2, 4, 6, 8, 10, 12]
print(tuple(newvart)) # (2, 4, 6, 8, 10, 12)

# 使用for循环进行遍历
newvart=(i*2 for i in vart)
for i in newvart:
    print(i)

yield关键字

yield类似于return
共同点:关键字执行后把结果返回

不同点:

  • return 会直接返回结果,并且结束当前函数的调用
  • yield 会返回结果并记录当前代码执行的位置,再次调用时从记录的位置继续向下执行
# 定义普通函数
def func():
    print('hello world')
    return 1
    print('hello python')
    return 2
func() # 普通定义方法只会执行到return 1 无法再次向下运行代码

# 使用 yield定义生成器函数
def fun():
    print('hello world')
    yield 1
    print('hello python')
    yield 2
# 调用生成器函数,返回一个迭代器
res= fun()
r1=next(res) # hello world
print(r1) # 1
r2=next(res) # hello python
print(r2) # 2
# 使用list函数调用生成器时,返回迭代器
res=(fun())
print(list(fun())) # [1, 2]

# 练习斐波那契序列
# 普通方法
def feibo(num):
    a,b,i=0,1,0
    while i < num:
        print(b, end=',')
        a,b=b,a+b
        i+=1

feibo(7)
print('')
# 使用生成器改写
def feibo(num):
    a,b,i=0,1,0
    while i < num:
        yield b
        a,b=b,a+b
        i+=1

res=feibo(7)
print(next(res))