美文网首页
D07:字符串、列表、元组、集合、字典

D07:字符串、列表、元组、集合、字典

作者: _咚咚咚东 | 来源:发表于2020-01-04 15:37 被阅读0次

    列表

    生成式和生成器

    • 生成式
    # 用这种语法创建列表之后元素已经准备就绪所以需要耗费较多的内存空间
    f = [x for x in range(1, 10)]
    print(sys.getsizeof(f))  # 查看对象占用内存的字节数
    

    -生成器

    # 每次需要数据的时候就通过内部的运算得到数据(需要花费额外的时间)
    f = (x ** 2 for x in range(1, 1000))
    print(sys.getsizeof(f))  # 相比生成式生成器不占用存储数据的空间
    

    使用yield定义斐波拉契数列:

    def fib(n):
        a, b = 0, 1
        for _ in range(n):
            a, b = b, a + b
    #         b,a=a+b,b
            yield a
    
    
    def main():
        for val in fib(20):
            print(val)
    
    if __name__ == '__main__':
        main()
    

    yield详解:待补充.

    元组

    # 定义元组
    t = ('骆昊', 38, True, '四川成都')
    print(t)
    # 获取元组中的元素
    print(t[0])
    print(t[3])
    # 遍历元组中的值
    for member in t:
        print(member)
    # 重新给元组赋值
    # t[0] = '王大锤'  # TypeError
    # 变量t重新引用了新的元组原来的元组将被垃圾回收
    t = ('王大锤', 20, True, '云南昆明')
    print(t)
    # 将元组转换成列表
    person = list(t)
    print(person)
    # 列表是可以修改它的元素的
    person[0] = '李小龙'
    person[1] = 25
    print(person)
    # 将列表转换成元组
    fruits_list = ['apple', 'banana', 'orange']
    fruits_tuple = tuple(fruits_list)
    print(fruits_tuple)
    

    元组和集合的区别:

    1. 元组中的元素是无法修改的,事实上我们在项目中尤其是[多线程]环境(后面会讲到)中可能更喜欢使用的是那些不变对象(一方面因为对象状态不能修改,所以可以避免由此引起的不必要的程序错误,简单的说就是一个不变的对象要比可变的对象更加容易维护;另一方面因为没有任何一个线程能够修改不变对象的内部状态,一个不变对象自动就是线程安全的,这样就可以省掉处理同步化的开销。一个不变对象可以方便的被共享访问)。所以结论就是:如果不需要对元素进行添加、删除、修改的时候,可以考虑使用元组,当然如果一个方法要返回多个值,使用元组也是不错的选择。
    2. 元组在创建时间和占用的空间上面都优于列表。我们可以使用sys模块的getsizeof函数来检查存储同样的元素的元组和列表各自占用了多少内存空间,这个很容易做到。我们也可以在ipython中使用魔法指令%timeit来分析创建同样内容的元组和列表所花费的时间。

    集合

    # 创建集合的字面量语法
    set1 = {1, 2, 3, 3, 3, 2}
    print(set1)
    print('Length =', len(set1))
    # 创建集合的构造器语法(面向对象部分会进行详细讲解)
    set2 = set(range(1, 10))
    set3 = set((1, 2, 3, 3, 2, 1))
    print(set2, set3)
    # 创建集合的推导式语法(推导式也可以用于推导集合)
    set4 = {num for num in range(1, 100) if num % 3 == 0 or num % 5 == 0}
    print(set4)
    

    向集合添加元素和从集合删除元素。↓

    set1.add(4)
    set1.add(5)
    set2.update([11, 12])
    set2.discard(5)
    if 4 in set2:
        set2.remove(4)
    print(set1, set2)
    print(set3.pop())
    print(set3)
    

    集合的交集、并集、差集、对称差运算↓

    print(set1 & set2)
    # print(set1.intersection(set2))
    print(set1 | set2)
    # print(set1.union(set2))
    print(set1 - set2)
    # print(set1.difference(set2))
    print(set1 ^ set2)
    # print(set1.symmetric_difference(set2))
    # 判断子集和超集
    print(set2 <= set1)
    # print(set2.issubset(set1))
    print(set3 <= set1)
    # print(set3.issubset(set1))
    print(set1 >= set2)
    # print(set1.issuperset(set2))
    print(set1 >= set3)
    # print(set1.issuperset(set3))
    

    字典

    # 创建字典的字面量语法
    scores = {'骆昊': 95, '白元芳': 78, '狄仁杰': 82}
    print(scores)
    # 创建字典的构造器语法
    items1 = dict(one=1, two=2, three=3, four=4)
    # 通过zip函数将两个序列压成字典
    items2 = dict(zip(['a', 'b', 'c'], '123'))
    # 创建字典的推导式语法
    items3 = {num: num ** 2 for num in range(1, 10)}
    print(items1, items2, items3)
    # 通过键可以获取字典中对应的值
    print(scores['骆昊'])
    print(scores['狄仁杰'])
    # 对字典中所有键值对进行遍历
    for key in scores:
        print(f'{key}: {scores[key]}')
    # 更新字典中的元素
    scores['白元芳'] = 65
    scores['诸葛王朗'] = 71
    scores.update(冷面=67, 方启鹤=85)
    print(scores)
    if '武则天' in scores:
        print(scores['武则天'])
    print(scores.get('武则天'))
    # get方法也是通过键获取对应的值但是可以设置默认值
    print(scores.get('武则天', 60))
    # 删除字典中的元素
    print(scores.popitem())
    print(scores.popitem())
    print(scores.pop('骆昊', 100))
    # 清空字典
    scores.clear()
    print(scores)
    

    设计一个函数产生指定长度的验证码,验证码由大小写字母和数字构成。

    import random
    
    def generate_code(code_len=4):
        """
        生成指定长度的验证码
        param code_len:验证码长度
        return:大小写英文字母和数字组成的随机验证码
        """
        #0-9数字生成器
        nums_temp=(x for x in range(10))
        characters=''
        for _ in nums_temp:
            characters+=''.join(str(_))
        #生成小写字母
        a_asc=ord('a')
        for i in range(26):
            str_asc=a_asc+i
            str_char=chr(str_asc)
            characters+=str_char
        #生成大写字母
        for i in range(26):
            str_asc=ord('A')+i
            str_char=chr(str_asc)
            characters+=str_char
        #取指定长度的结果验证码
        lenth=len(characters)-1
        result=''
        for i in range(code_len):
            index=random.randint(0,lenth)
            result+=''.join(characters[index])
        print(result)
        return result
        
    if __name__=='__main__':
        generate_code()
    

    获取文件名的后缀名

    def get_suffix(filename,has_dot=False):
        """
        获取文件名的后缀名
    
        :param filename: 文件名
        :param has_dot: 返回的后缀名是否需要带点
        :return: 文件的后缀名
        """
        suffix=filename.split('.')[-1] if filename.split('.')[-1] else None
        if has_dot:
            suffix='.'+suffix
            return suffix
        else:
            return suffix
    if __name__=='__main__':
        get_suffix('a.avi')
        print(get_suffix('a.avi',True))
    

    设计一个函数返回传入的列表中最大和第二大的元素的值.

    def max2(x):
        m1, m2 = (x[0], x[1]) if x[0] > x[1] else (x[1], x[0])
        for index in range(2, len(x)):
            if x[index] > m1:
                m2 = m1
                m1 = x[index]
            elif x[index] > m2:
                m2 = x[index]
        return m1, m2
    

    def main():
    """
    有15个基督徒和15个非基督徒在海上遇险,为了能让一部分人活下来不得不将其中15个人扔到海里面去,有个人想了个办法就是大家围成一个圈,由某个人开始从1报数,报到9的人就扔到海里面,他后面的人接着从1开始报数,报到9的人继续扔到海里面,直到扔掉15个人。由于上帝的保佑,15个基督徒都幸免于难,问这些人最开始是怎么站的,哪些位置是基督徒哪些位置是非基督徒。
    """
    nums=[x for x in range(1,31)]
    count=0
    a=0
    while count<15:
    for i in range(len(nums)):
    if isinstance( nums[i],int):
    a+=1
    if a==9:
    nums[i]='-1'
    a=0
    count+=1
    continue
    print (nums)
    return nums

    if __name__ == '__main__':
        def main():
        """
        有15个基督徒和15个非基督徒在海上遇险,为了能让一部分人活下来不得不将其中15个人扔到海里面去,有个人想了个办法就是大家围成一个圈,由某个人开始从1报数,报到9的人就扔到海里面,他后面的人接着从1开始报数,报到9的人继续扔到海里面,直到扔掉15个人。由于上帝的保佑,15个基督徒都幸免于难,问这些人最开始是怎么站的,哪些位置是基督徒哪些位置是非基督徒。
        """
        nums=[x for x in range(1,31)]
        count=0
        a=0
        while count<15:
            for i in range(len(nums)):                
                if isinstance( nums[i],int):
                    a+=1
                    if a==9:
                        nums[i]='-1'
                        a=0
                        count+=1
                    continue
        print (nums)
        return nums
    
    if __name__ == '__main__':
        main()
    
    

    相关文章

      网友评论

          本文标题:D07:字符串、列表、元组、集合、字典

          本文链接:https://www.haomeiwen.com/subject/qugtactx.html