字典
# # 字典 # # dict # 用途 dic =dict(name = 'alex',age = 18,sex = 'male') print(dic) """语法""" 1 # len() 返回长度 字典key的个数 # print(len(dic))w 2 # 身份运算 in not in 返回真假 # print('name' in dic) 3 # 删除 .pop(key) print(dic.pop('name','bu')) string = '购物车处练习' # 简单购物车,要求如下: # 实现打印商品详细信息,用户输入商品名和购买个数,则将商品名,价格,购买个数加入购物列表,如果输入为空或其他非法输入则要求用户重新输入 # msg_dic = { # 'apple': 10, # 'tesla': 100000, # 'mac': 3000, # 'lenovo': 30000, # 'chicken': 10, # } # tag = True # list = [] # while tag : # for item in msg_dic: # print(item,msg_dic[item]) # good = input('商品') # if good in msg_dic: # print(good) # while tag: # number = input('数量') # if number.isdigit(): # print(int(number)*msg_dic[good]) # break # list.append((good,msg_dic[good],number)) # print(list) # cmd = input('q 退出 其他继续') # if cmd =='q': # break print('练习结束') 4 # get() 从字典中取值 找不到key 返回none 可以修改没有key时的返回值 print(dic.get('name')) dic =dict(name = 'alex',age = 18,sex = 'male') # li =[1] # n = li.pop(1) # print(n) print(dic.get('hobby','不')) print(dic.pop('llk','bu')) # l1 = [1,2,3,4,5] # l1.pop(10,'no') """在字典中的.pop()函数也能修改找不到key值时的返回值 但是在列表中的.pop没有更改默认值的选项""" # ps : 这边的返回值再看一下 有点没弄清楚 5 '''重点''' # setdefault() # 设置(key,value1) 当 dict中对应的key 不存在时 添加(key,value1) 并返回 value1 # 当 dict 中存在对应的item(key,value0)时 不添加新的值 ,返回初始的值value0 # 例子 # 2 统计s='hello alex alex say hello sb sb'中每个单词的个数 # 结果如:{'hello': 2, 'alex': 2, 'say': 1, 'sb': 2} s = 'hello alex alex say hello sb sb' li = s.split(' ') dic_1 = {} for i in li: """for i in [] i 是列表中的元素而不是索引 搞明白 错好几次了""" dic_1.setdefault(i,li.count(i)) print(dic_1) # ps 因为setdefault 存在返回值 所以可以直接操作 """setdefault() 传入两个参数 一个是key一个是value_1 记住了当key存在时 函数返回之前的(value_0) 并且 现在字典中对应的关系是 key : value_0""" """如果 setdefault 对应的value 是可变数据类型 可以在外面更改 字典中对应的value会相应地改变 但是如果 setdefault 对应的value 是不可变数据类型那么只能重新赋值才能更改""" 6 # update() 更新 dic_1 = {'name':'lee'} dic_2 = {"age" :18,'sex':'male'} dic_1.update(dic_2) print(dic_1) """还可以传入一个变量 ????""" 7 # 循环 (默认循环的值是字典中的keys 可以自己定义) # for # while print(dic.keys()) print(dic.values()) print(dic.items()) 8 # copy dic_1 = dic.copy() print(dic,id(dic)) print(dic_1,id(dic_1)) 9 # clear dic_1.clear() print(dic_1) 10 # fromkeys dic =dict.fromkeys(['lee','zhl','ww'],'屌丝') # 一般用于建立新列表 dic = dict.fromkeys([1,2,3,4,5,6,7,],"") """第一个参数传入可迭代类型""" print(dic) # 1 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中 # 即: {'k1': 大于66的所有值, 'k2': 小于66的所有值} # li = [11,22,33,44,55,66,77,88,99,90] # dic = {} # for i in li: # if i >66: # dic.setdefault('k1',[]).append(i) # elif i<66: # dic.setdefault('k2',[]).append(i) # print(dic) # """分清楚什么时候用setdefault """ # """如果 setdefault 对应的value是不可变或者 我们知道setdefault的key的个数时 可以考虑不使用setfault""" # li = [11,22,33,44,55,66,77,88,99,90] # dic_2 = {'k1':[],'k2':[]} # for i in li: # if i>66: # dic_2['k1'].append(i) # elif i<66: # dic_2['k2'].append(i) # print(dic_2) # # """重点 不熟练 写五遍""" # 2 统计s='hello alex alex say hello sb sb'中每个单词的个数 # # 结果如:{'hello': 2, 'alex': 2, 'say': 1, 'sb': 2} # s='hello alex alex say hello sb sb' # li = s.split(' ') # dic = {} # for i in li : # key_num =dic.setdefault(i,0) # dic[i] = key_num+1 # print(dic) # # 第二遍 # for i in li: # dic_1.setdefault(i) # print(dic_1) # print(dic) # # """重点 不熟练 写三遍""" # """ 当value是列表 时 setdefault用法 # 当value是字符串是 setdefault的用法"""
集合
# set 集合 # 像列表一样可以存放多个数据: # 作用 : 常用来去重关系运算 # 定义:在{}用,分割多个元素 """ 每个元素必须是不可变类型 集合内没有重复元素 集合内元素无序 """ # 可迭代类型都可以被set()转化成集合. ps强调:每个元素必须是不可变类型 # 集合去重的局限性 """ 1 每个元素必须是不可变类型 2 集合去重后不保留顺序""" set_1 = {1, 2, 3, 4} set_0 = {2, 3, 4, 5} # & 交集 # | 并集 # ^ 对称补集 # - 差集 # > >= < <= 父集子集 print(set_1 & set_0) print(set_1 | set_0) print(set_0 ^ set_1) print(set_0 - set_1) print(set_1 >= set_0) # 一.关系运算 # 有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合 # pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'} # linuxs={'wupeiqi','oldboy','gangdan'} # 1. 求出即报名python又报名linux课程的学员名字集合 # 2. 求出所有报名的学生名字集合 # 3. 求出只报名python课程的学员名字 # 4. 求出没有同时这两门课程的学员名字集合 pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'} linuxs={'wupeiqi','oldboy','gangdan'} print(pythons &linuxs) print(pythons |linuxs) print(pythons-linuxs) print(pythons^linuxs) # 二.去重 # # 1. 有列表l=['a','b',1,'a','a'],列表元素均为可hash类型,去重,得到新列表,且新列表无需保持列表原来的顺序 l=['a','b',1,'a','a'] # s=set(l) # l=list(s) # print(l) # 2.在上题的基础上,保存列表原来的顺序 li =[] for i in l: if i not in li: li.append(i) print(li) # 3.去除文件中重复的行,肯定要保持文件内容的顺序不变 # 4.有如下列表,列表元素为不可hash类型,去重,得到新列表,且新列表一定要保持列表原来的顺序 l=[ {'name':'egon','age':18,'sex':'male'}, {'name':'alex','age':73,'sex':'male'}, {'name':'egon','age':20,'sex':'female'}, {'name':'egon','age':18,'sex':'male'}, {'name':'egon','age':18,'sex':'male'}, ] set.clear() set.copy() set.update() set.pop() set.remove() set.add() set.difference() set.difference_update() set.discard()
元组
# 元祖 # tuple # 元组与列表类似用于记录多个任意类型的值,但不同之处是元组相当于不允许更改的列表,用于记录多个固定不允许修改的值,单纯用于取 """注意.容器类型的数据类型内存取的值都是内存地址,元组同样如此 因此可能造成元组内存放的地址不变,但是内存地址中的值变了[只发生于存放可变类型时,不可变类型id不变值不变] 但这是可变类型本身的性质与元组无关""" tup = (1,'abc','233') print(tup[0]) # print(tup.count(1)) # 查询 print(tup.index(1,0,1)) """可以设定起始位置和结束位置""" # 成员运算 print(1 in tup) # 循环
可变不可变
# 可变不可变数据类型 """变量在内存中的存储方式""" # 堆区 : 存放 变量名与内存地址的对应关系 # 栈区 : 在内存地址存放变量内容 # 个人理解 # 当我们能够在栈区的内存地址(我们暂时称为根本内存地址)中修改内容时.数据类型是可变数据类型,反之是不可变数据类型 # 数字类型(int float) # 不能在其对应的根本内存地址中修改内容 只能更换内存地址 == 不可变数据类型 # 字符串类型 # 不能在其对应的根本内存地址中修改内容 只能更换内存地址 == 不可变数据类型 # 列表类型 # 可以在其对应的根本内存地址中修改内容 == 可变数据类型 # 字典 # 可以在其对应的根本内存地址中修改内容 == 可变数据类型 # 集合(set) # 可以在其对应的根本内存地址中修改内容 == 可变数据类型 # 元组(tuple) # 比较特殊 不可以在其对应的内存地址中修改内容,但是元组是容器类型的数据类型 # 其内存地址中的内容存放的是一系列内存地址(我们暂时称为映射内存地址)映射内存地址中可以存放任意数据类型 # 所以虽然元组是不可变数据类型,即根本内存地址中的值(映射内存地址)不可变 ,但是其映射地址对应的如果是可变数据类型(列表字典集合) # 那其映射地址中的值可以改变.print输出的值可以改变,但本质上元组没有改变.因此元组是不可变数据类型
作业
# 作业(必做题): # # 使用while循环输出1 2 3 4 5 6 8 9 10 # # 求1-100的所有数的和 # # 输出 1-100 内的所有奇数 # # 输出 1-100 内的所有偶数 # # 求1-2+3-4+5 ... 99的所有数的和 # # 用户登陆(三次机会重试) # # 7:猜年龄游戏 要求: 允许用户最多尝试3次,3次都没猜对的话,就直接退出,如果猜对了,打印恭喜信息并退出 # # 8:猜年龄游戏升级版(选做题) 要求: 允许用户最多尝试3次 # # 每尝试3次后,如果还没猜对,就问用户是否还想继续玩,如果回答Y或y, 就继续让其猜3次,以此往复,如果回答N或n,就退出程序 # # 如何猜对了,就直接退出 # 1 # count = 0 # while count < 10: # count += 1 # print(count) # 2 # amout = 0 # for i in range(1, 101): # amout += i # print(amout) # 3 # for i in range(1, 101): # if i % 2 == 0: # print(i) # 4 # for i in range(1, 101): # if i % 2 == 1: # print(i) # 5 # amout = 0 # for i in range(1, 101): # if i % 2 == 1: # amout += i # if i % 2 == 0: # amout -= i # print(amout) # count = 0 # while count<3: # count +=1 # user_name = input('name') # password = input('password') # if user_name == 'lee' and password == '123456': # print('login successful') # break # else: # print("your username and password con't match") # # count = 0 # while count<3: # count +=1 # number = int(input('place guess my age ')) # if number == 18: # print('good you are right') # break # else: # print("False") # 8:猜年龄游戏升级版(选做题) 要求: 允许用户最多尝试3次 # 每尝试3次后,如果还没猜对,就问用户是否还想继续玩,如果回答Y或y, 就继续让其猜3次,以此往复,如果回答N或n,就退出程序 # 如何猜对了,就直接退出 count = 0 tag = True while tag: count +=1 number = int(input('place guess my age ')) if number == 18: print('good you are right') break else: print("False") print(count) while count == 3: cmd = input('''c 继续玩 q 退出''') if cmd == 'q': tag = False break elif cmd == 'c': count = o break else: print('请输入正确的指令')
# 1 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中 # # 即: {'k1': 大于66的所有值, 'k2': 小于66的所有值} li = [11,22,33,44,55,66,77,88,99,90] dic = {} for i in li: if i >66: dic.setdefault('k1',[]).append(i) elif i<66: dic.setdefault('k2',[]).append(i) print(dic) li = [11,22,33,44,55,66,77,88,99,90] dic_2 = {'k1':[],'k2':[]} for i in li: if i>66: dic_2['k1'].append(i) elif i<66: dic_2['k2'].append(i) print(dic_2) # 2 统计s='hello alex alex say hello sb sb'中每个单词的个数 # # 结果如:{'hello': 2, 'alex': 2, 'say': 1, 'sb': 2} li = s.split(' ') dic_1 = {} for i in li: dic_1.setdefault(i,li.count(i)) print(dic_1)