zoukankan      html  css  js  c++  java
  • Python元组数据类型详解

    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))
    
  • 相关阅读:
    BZOJ 1391: [Ceoi2008]order
    BZOJ 4504: K个串
    2019 年百度之星·程序设计大赛
    POJ 2398 Toy Storage (二分 叉积)
    POJ 2318 TOYS (二分 叉积)
    HDU 6697 Closest Pair of Segments (计算几何 暴力)
    HDU 6695 Welcome Party (贪心)
    HDU 6693 Valentine's Day (概率)
    HDU 6590 Code (判断凸包相交)
    POJ 3805 Separate Points (判断凸包相交)
  • 原文地址:https://www.cnblogs.com/hekaiqiao/p/15545433.html
Copyright © 2011-2022 走看看