• python02篇 字典、元组、切片


    一、字典

    1.1 字典的常用方法

    # 字典  数据类型   {} key-value   
    # list是挨个循环查找,字典是根据key查找value,比list遍历效率高
    d = {
        'username': 'xiaohei',
        'id': 1,
        'grade': 'tmz',
        'addr': '北京',
        'age': 18
    }
    d2 = {} # 定义一个空字典
    # 增加元素
    d['money'] = 500   # 新增并修改
    d.setdefault('car', 'bmw')
    d.setdefault('money', 600) # 如果key已经存在,使用此方法不能修改value
    
    # 修改元素  d[key] = value
    
    #取值
    print(d)
    print(d['money'])
    print(d.get('username'))
    print(d.get('aaa'))  # get方法  如果不存在的key,返回none
    print(d.get('sex', '')) # get方法  如果不存在的key,可以取一个默认值
    # print(d['aaa']) # []方法,如果key不存在,报 KeyError: 'aaa'
    
    # 删除
    d.pop('grade') 
    # d.pop('aaa') # 如果key 不存在,报  KeyError: 'aaa'
    # del d['aaa'] # 如果key 不存在,报  KeyError: 'aaa'
    # 其他方法
    print(d.values())  # 取出所有的value  放在list
    print(d.keys())  # 取出所有的key 放在list中
    d.update(a=1, b=2)  # 往字典中增加新元素
    #d.clear()  # 清空字典
    
    print(d)
    
    users = {
        'xiaohei': '123123',
        'xiaobai': 'abc123'
    }
    username = 'xiaohei'
    print(username in users.keys()) # 这一种不推荐,因为要先把key都取出来放到list中,性能没有下面那一种方法好
    print(username in users)  # 判断这个key是否存在字典中
    # users.has_key(username) # python2中的用法
    
    # 遍历字典  这种方法只能拿到字典中的key
    for i in d:
        print(i)
    print(d.items())  # 此方法把字典转换成二维数组返回
    # dict_items([('username', 'xiaohei'), ('id', 1), ('addr', '北京'), ('age', 18), ('money', 500), ('car', 'bmw'), ('a', 1), ('b', 2)])
    for k, v in d.items():  # 因为items方法返回的是二维数组,所以可以通过拆包 获取key、value
        print(k, v)
    # 下面这种方法,不需要通过items转为数组,通过key遍历字典,通过key获取对应的value。如果数据量大,推荐使用这种方法
    for k in d:
        print(k, d.get(k))

    1.2 字典练习

    '''
        1、注册
             1、输入账号和密码、确认密码
             2、要校验账号是否存在(从字典里面判断),存在的话,不能注册
             3、校验两次输入的密码是否一致,如果一致,加入到字典中,提示注册成功
             4、最多3次
             5、要校验输入是否为空,为空也算一次错误,全是空格也算空
    '''
    users = {
        'xiaohei': '123123',
        'xiaobai': 'abc123'
    }
    
    for i in range(3):
        username = input('username:').strip()
        password = input('password:').strip()
        cpwd = input('pwd:').strip()
        if not username or not password or not cpwd:
            print('账号/密码/确认密码不能为空')
            continue
        elif password != cpwd:
            print('两次输入的密码不一致')
            continue
        elif username in users:
            print('账号已存在')
            continue
        else:
            print('恭喜你注册成功')
            users[username] = password
            break
    else:
        print('错误次数超限!')

    二、元组

    # 定义元组
    t = (1, 2, 3, 4, 5, 2, 4, 2)  # 不可变的列表
    t1 = ()  # 定义空元组
    t2 = ('abc')  # 此时不是定义的元组,而是str
    t3 = ('bc',)  # 只有一个元素时,要加上英文逗号  ,
    # 元组一旦被创建,不能改变里面的值
    # t[0] = 6  # 修改元组的元素的值报错,TypeError: 'tuple' object does not support item assignment
    
    print(t.index(2))  # 获取元素的下标
    print(t.count(2))  # 获取某个元素出现的次数

    三、其他小tips

    3.1 切片

    import string
    
    print(string.ascii_lowercase)  # 把26个小写字母作为一个字符串返回
    print(string.ascii_uppercase)  # 把26个大写字母作为一个字符串返回
    print(string.ascii_letters)  # 把26个小写和26个大写字母作为一个字符串返回
    print(string.punctuation)  # 把所有特殊字符作为一个字符串返回
    print(string.digits)  # 把10个数字(0~9)作为一个字符串返回
    l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] # 切片的时候是顾头不顾尾
    #    -9    -8   -7    -6   -5   -4    -3   -2   -1
    print(l[0:3])  # 从第一个元素取到第3个元素,此时0可以忽略不写,l[:3]
    print(l[2:-1])  # 从第3个元素到倒数第2个元素
    print(l[2:])   # 后面的结尾不写,代表取到最后一个元素
    print(l[0:9:1])  # 从第1个元素到第9个,步长为1,即隔1个取一次。步长不写默认为1
    print(l[0:8:3])  # # 从第1个元素到第8个,步长为1,即隔几个取一次。步长不写默认为1
    print(l[::-1])  # 如果步长是负数的话,那么取值的时候就从右往左开始取,同时下标也要用负数
    print(l[-1:-4:-1])
    
    # 字符串也可使用切片
    str1 = 'abcdefghijklmnopqrstuvwxyz'
    print(str1[2:15:3])
    # 元组也可以使用切片
    t = (1, 2, 3, 4, 5, 2, 4, 2)
    t2 = t[1:5:2]
    print(t2)

    3.2 深拷贝、浅拷贝

    import copy
    # 例子1:
    l = [0, 1, 2,2, 3, 4, 5, 6, 7, 8, 9]
    for i in l:
        if i % 2 == 0:
            l.remove(i)
    print(l)
    # 执行结果:[1, 2, 3, 5, 7, 9],在删除的过程中,下标变化了,有些元素被跳过
    # 要进行删除list中的元素时,使用两个相同的list进行
    # l = [0, 1, 2,2, 3, 4, 5, 6, 7, 8, 9]
    l2 = [0, 1, 2,2, 3, 4, 5, 6, 7, 8, 9]
    # l2 = l   # l和l2 指向同一内存地址。浅拷贝
    for i in l2:
        if i % 2 == 0:
            l.remove(i)
    print(l)
    print(id(l))  # 查看内存地址
    print(id(l2))
    # 深拷贝和浅拷贝
    l3 = copy.deepcopy(l)  # 只有这一种深拷贝  重新开辟了内存空间。如果复制了一个变量,这两个变量其中一个变了之后,不应该影响另一个
    print(id(l3))
    # 列子2,如果有嵌套的话,list本身的copy方法以及切片也是浅拷贝
    l = [1, 2, 3, 4, [5, 6, 7]]
    l2 = l.copy()  # 浅拷贝,有嵌套的会受影响
    l3 = l[:]   # 浅拷贝,有嵌套的会受影响
    l[-1].append('aaf')
    print(l)
    print(l2)
    print(l3)

    3.3 简化代码(非空即真,非0即真)

    # 非空即真 ,非0即真   简化代码
    # None {} [] () ''   为假,False
    s = ''  # False
    l = []  # False 
    l1 = ['']  # True
    d = {'': ''}  # True
    d1 = {}  # False
    t = ('',)  # True
    t1 = ()  # False
    num1 = 0  # False
    num2 = 1  # True
    
    username = input('username:')
    if username.strip():   # 等同于 if username.strip() != '':
        print('你输入的不为空',username)
    else:
        print('username不能为空')
    
    # 如果想要先判断为空的情况
    if not username.strip():   # 等同于 if username.strip() == '':
        print('username不能为空')
    else:
        print('你输入的不为空', username)
    
    #  非0即真
    d = {'a': 1, 'b': 2, 'c': 0}
    if d.get('c'):
        print('取到值')   # 此时会有bug
    else:
        print('其他操作')
  • 相关阅读:
    Android蓝牙通信 .[转]
    通过VS2010性能分析来查找代码中那些地方最损耗资源 [转]
    【百度地图API】如何区分地址解析和智能搜索?
    Windows 程序员必备的知识和工具
    NUnit详细使用方法
    Android 蓝牙开发浅析 [转]
    软件工程的国家标准下载链接
    android布局属性详解
    Android之Service相关
    Android 实现布局动态加载
  • 原文地址:https://www.cnblogs.com/lhy-qingqiu/p/13546017.html
Copyright © 2020-2023  润新知