Week2
1 知识补充
1.1 三元运算
a = 1 b = 2 c = 3 d = a if a>b else c # d的值等于 如果a大于b则将a赋值给d,否则c赋值给d
1.2 bytes类型(字节数据类型)
Python3对文本和二进制数据作了区分。文本总是Unicode,由str类型表示,二进制数据(视频等)则由bytes类型表示。
>>> '€20'.encode('utf-8') # 之前的字符编码方式 b'\xe2\x82\xac20' >>> b'\xe2\x82\xac20'.decode('utf-8') '€20'
>>>print(变量名.encode(encoding="utf-8")) #python3默认使用utf-8,可以直接用encode()
2 列表
定义:[ ] 内以逗号分隔,按照索引,存放各种数据类型,每个位置代表一个元素。
特性:
> 可存放多个值
> 可修改指定索引位置对应的值,可变
> 按照从左到右的顺序定义列表元素,下标从0开始顺序访问
2.1 列表创建
list 表示列表类型 list1=[ ] #空列表 list2=[1,2,3,4] list3=['a','b','c'] #有元素列表
names = ["zhouxy","panjq","lijm","caiyq"] print(names[0])
输出:zhouxy
2.2 切片
names = ["zhouxy","panjq","lijm","caiyq"] print(names[0]) print(names[1:3]) # 左闭右开 print(names[:3]) # 如果是从头开始取,0可以忽略 print(names[-1]) # 取最后一个值,倒数第二为-2 以次类推 print(names[-3:-1]) # 切片从左往右数,但不包括-1最后一个值 print(names[-3:]) # 包括最后一个值 print(names[0::2]) # 后面的2是代表,每隔一个元素,就取一个 print(names[::2]) # 上句效果一样
2.3 追加&插入
names = ["zhouxy","panjq","lijm","caiyq"] names.append("linjm") # 新增在最后 print(names) names.insert(0,"liangjs") # 新增在指定下标位 print(names)
2.4 修改
names = ["zhouxy","panjq","lijm","caiyq"] names[3] = "cyq" print(names)
2.5 删除
names = ["zhouxy","panjq","lijm","caiyq"] names.remove("caiyq") # 删除指定元素 names.pop() # 删除列表最后一个值 del names[0] # 相当于names.pop(0) print(names)
2.6 获取下标
names = ["zhouxy","zhouxy","panjq","lijm","caiyq",1,2,3] print(names.index("zhouxy")) # 只返回找到的第一个下标
2.7 清空列表
names.clear() # 清空 print(names)
2.8 反转
names.reverse() # 反转 print(names)
2.9 排序
names = ["zhouxy","zhouxy","panjq","lijm","caiyq",'1','2','3'] names.sort() # 排序,特殊字符、数字、大写、小写,python3里不同数据类型不能放在一起排序 print(names)
2.10 扩展
names = ["zhouxy","zhouxy","panjq","lijm","caiyq",'1','2','3'] b = ['a','b','c'] names.extend(b) # 合并列表 print(names)
2.11 拷贝
names = ["zhouxy","panjq","lijm","caiyq",["linjm","liangjs"]]
names2 = names.copy()
print(names,names2)
names[0] = "周小律"
print(names,names2)
names[-1][1] = "梁胖"
print(names,names2) # 浅copy只拷贝内存地址,只拷贝第一层数据,相当于names2 = copy.copy(names)或 names2 = names[:] 或 names2 = list(names)
names2 = names # 两层都没有拷贝
print(names,names2)
import copy names = ["zhouxy","panjq","lijm","caiyq",["linjm","liangjs"]] names2 = copy.deepcopy(names) # 深拷贝 names[0] = "周小律" names[-1][1] = "梁胖" print(names,names2)
2.12 长度
names = ["zhouxy","panjq","lijm","caiyq",["linjm","liangjs"]] print(len(names)) # 统计列表的长度以及列表元素的长度
输出:5
2.13 循环
names = ["zhouxy","panjq","lijm","caiyq",["linjm","liangjs"]] for i in names: # 循环打印列表 print(i)
names = ["zhouxy","panjq","lijm","caiyq",["linjm","liangjs"]] index = 0 while index < len(names): print(names[index], end=' ') # end='' 不换行打印, <br>#' ' 有一个空格,不换行隔一个空格打印 index += 1
3 元组
元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表。
3.2 创建元组
# 只有一个元素的话,元素后面要加逗号 ,不然不是元组类型。 x = (1) print(type(x)) y = (1,) print(type(y))
它只有2个方法,一个是count,一个是index。
4 字符串操作
name = "ZZzzhouxy" print(name.capitalize()) # 首字母大写 print(name.count('z')) # 统计字符串z出现次数 print(name.casefold()) # 大写全部变小写 print(name.center(20,'-')) print(name.encode()) # 将字符串编码成bytes格式 print(name.endswith('xy')) # 判读字符串是否以xy结尾 print(name.expandtabs(2)) # 将\t转换成2个空格 print(name.find('Z')) # 查找A,找到返回其索引, 找不到返回-1 print(name[name.find("Z"):3]) # 字符串切片 print(name.rfind('z')) # 找最右的值下标 name = "my name is {name}" print(name.format(name="zhouxy"))
print('1'.isdigit()) # 是否为整型 print('a1'.isalnum()) # 是否为字母加数字 print('a1'.isalpha()) # 是否为纯英文字符 print('10'.isdecimal()) # 是否为十进制 print('1_a'.isidentifier()) # 是否为合法的标识符 print('1.0'.isnumeric()) # 是否为纯数字 print('Zhouxy'.isupper()) # 是否都为大写 print('My name is zhouxy'.istitle()) # 是否每个字符首字母大写 print('My name is zhouxy'.title()) # 每个字符首字母转为大写 print('Zhouxy'.lower()) # 大写转为小写 print('Zhouxy'.upper()) # 小写转为大写 print('Zhouxy'.swapcase()) # 大写转小写,小写转大写
print('1+2+3'.split('+')) # 字符转按分隔符分成列表 print('a\nb'.splitlines()) # 按换行符分隔 print(' zhouxy '.strip()) # 去空格和去回车 print(' zhouxy '.lstrip()) # 左边去空格和去回车 print(' zhouxy '.rstrip()) # 右边去空格和去回车 print('zhouxyzxy'.replace('z','Z',1)) # 指定替换个数 print('zhouxy'.ljust(20,'*')) print('zhouxy'.rjust(20,'*')) print('zhouxy'.zfill(20)) # 补零 print('+'.join(['1','2'])) # 列表转为字符串 n = str.maketrans('xyzabc','123456') # 加密 print(‘zhouxy’.translate(n))
5 字典操作
字典定义的基本形式:key:value,字典需要注意key必须是不可变类型且唯一,或者说是可hash类型,且字典dict是无序的。
5.1 增删改查
info = { 'zhouxy':'A', 'panjq':'B', 'lijm':'C', 'caiyq':'D' } print(info) print(info['zhouxy']) # 取值 info['zhouxy'] = "周小律" # 修改 info['linjm'] = '新增' # 不存在key值则新增 del info['caiyq'] # 删除 info.pop('panjq') # 删除 print(info) info.popitem() # 随机删除 print(info) print(info.get('liangjs')) # 推荐不存在key值查找 print('liangjs' in info) # 是否存在,info.has_key("liangjs") in py2f.x
5.2 其他操作
info = { 'zhouxy':'A', 'panjq':'B', 'lijm':'C', 'caiyq':'D' } print(info.values()) # 取全部value值 print(info.keys()) # 取全部key值 print(info.items()) # 字典转列表 print(info.setdefault('xyzhou','a')) # 不存在key则新增 print(info.setdefault('zhouxy','a')) # 相同key值不修改 name2 = { 'zhouxy':'zxy', 'liangjs':'梁胖' } print(info.update(name2)) # 不存在key则新增,相同key则更新 new = dict.fromkeys([1,2,3],['1',{'name':'level'},'a']) # 初始化新字典 print(new) new [1][1]['name'] = 'Name' print(new) # 多层修改,改则全改
5.3 循环
info = { 'zhouxy':'A', 'panjq':'B', 'lijm':'C', 'caiyq':'D' } for i in info: print(i,info[i]) for k,v in info.items(): #会先把dict转成list,不推荐 print(k,v)
5.4 多级嵌套及操作
#三级菜单
#以次选择进入子菜单
#各级可返回和退出
# 建立一个多层字典 chinese_catelog = { '广东省':{ '广州市':{ '越秀区', '荔湾区', '天河区', '番禺区', '白云区', }, '深圳市':{ '南山区':['长亮科技','深圳湾科技生态园'], '福田区':['平安银行','平安银行大厦'], '罗湖区':[], '宝安区':[], }, '珠海市':{}, '东莞市':{}, '汕头市':{}, }, '江苏省':{ '南京市', '苏州市', '扬州市', '南通市', }, } exit_flag = False while exit_flag is not True: for i1 in chinese_catelog: # 循环打印省列表 print(i1) choice1 = input('请输入所在省:') if choice1 in chinese_catelog: # 如果输入存在省 while exit_flag is not True: for i2 in chinese_catelog[choice1]: # 循环打印市列表 print(i2) choice2 = input('请输入所在市:') if choice2 in chinese_catelog[choice1]: # 如果输入存在市 while exit_flag is not True: for i3 in chinese_catelog[choice1][choice2]: # 循环打印区列表 print(i3) choice3 = input('请输入所在区:') if choice3 in chinese_catelog[choice1][choice2]: # 如果输入存在区 while exit_flag is not True: for i4 in chinese_catelog[choice1][choice2][choice3]: print(i4) choice4 = input('已选择完成,请按b返回') if choice4 == 'b': break elif choice4 == 'q': exit_flag = True if choice3 == 'b': break elif choice3 =='q': exit_flag = True if choice2 == 'b': break if choice2 == 'q': exit_flag = True
6 homework
#启动程序后,让用户输入工资,然后打印商品列表 #允许用户根据商品编号购买商品 #用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 #可随时退出,退出时,打印已购买商品和余额 shopping_list = [ ('Iphone',5000), ('Macbook Pro',128000), ('iWatch',2400), ('Ipad',7000) ] _shopping_list = [] salary = input('请输入余额:') if salary.isdigit(): salary = int(salary) new_salary = salary for index,item in enumerate(shopping_list): print(index,item) while True: product_code = input('请输入购买的商品编号:') if product_code.isdigit(): product_code= int(product_code) if product_code < len(shopping_list) and product_code >= 0: if new_salary > shopping_list[product_code][1]: _shopping_list.append(shopping_list[product_code]) new_salary = new_salary-shopping_list[product_code][1] print('\033[32;1m%s\033[0m已加入购物车,还剩下余额\033[31;1m%s\033[0m' %(shopping_list[product_code], new_salary)) else: print('余额已不足,还剩余额%s' %new_salary) else: print('商品编号不存在') elif product_code =='q': print('已购买以下商品'.center(50,'-')) print(_shopping_list) exit()