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('其他操作')
原文地址:https://www.cnblogs.com/lhy-qingqiu/p/13546017.html