1、列表

2、元组

3、字符串

4、字典

5、集合

6、文件

7、数字

8、with语句

9、练习

1、列表

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Weiyc

# List(列表)  内容可修改
# (1)特性
# 可以包含任意对象的有序结合
# 通过小标索引(位置偏移)访问元素
# 可变长度,异质,可任意嵌套
# 支持原位改变
# 对象引用数组


# (2)常用操作
x = ["wei","hao","li",50]	#包含任意对象,小数、整数、字符串组合
print(x)

# print(x[0])			#得值50,列表中第一个值

# print(x[-1])			#得值99.3,列表最后一个值

# print(x[0:1])			#得值[50,99.3],切割顾头不顾尾

# x[:]全部     x[1:]到最后    x[:4]从开始

# print(x[::2]) 			#从0开始,隔两位取一个值。

# print(x[-2:])         打印最后两位值

# x.append(5)			#增,x列表后面追加值5
# print(x)

# del x[0]			#删除列表第一个值
# del x[:3]			#删除范围  等同l[:3] = []
# del x[::2]		#删除指定步长
# del x             #删除列表
# print(x)

# x.remove(50)			#删除x列表中左到右第一个值为50的值
# print(x)

# x.pop()			#删,默认弹出并删除最后一个值。
# x.pop(1)          # 根据下标位置删除
# print(x)

# x[0] = 51			#改一个值为51
# print(x)

# x.insert(0,99)    #插,x列表第一个位置插入99值  x[0:0] = 99效果等同
# print(x)

# print(x.index(50))	    #获取50在列表中下标
# print(x[x.index(50)])    #根据位置取值

# print(x.count(50))	   #统计50出现的次数

# x.clear()			       #清空x列表
# print(x)

# x.reverse()			#反转x序列
# print(x)

# x.sort()			            #排序,从小到大,字母排序(ascii码排序的),字母和数字不能一起排序。
# x.sort(reverse=True)		    #排序后反转
# x.sort(key=lambda x:x[-1])	#根据单词最后字母排序,待定
# sorted(x)			            #排序,全局函数,待定
# sorted(x, key=lambda n:n[1])	#第二个字母排序,待定
# print(x)

# x.extend([9,11,12])		#扩展,x列表中添加其它列表到里面
# print(x)

# x = ["a","b","c",["d","e"]]   #可嵌套
# y = x.copy()		#浅复制,y = x[:] 一样的效果
# print(x)
# print(y)
# x[2] = "zhao"       #浅复制,完全复制第一层的值,独立的,不会跟随改变
# x[3][1] = "F"       #第二层的值,只复制内存地址,会跟随改变
# print(x)
# print(y)

# x = y		        #赋值,指向同一内存,改其中一个列表,另一个也更改。

# import copy
# y = copy.deepcopy(x)    #深复制,完成复制一份,不会跟随改变,占用双内存空间,少用

# for i in x:     #列表循环,while,for常用
#     print(i)

# print(x[::2])                 #隔2个打印一个值
# x[0:-1:2] = [99,99,99,99,99]  #同上,0 -1可以省略



#  (3)列表其它操作
#  name = list('weiyongchao')
#  print(name)
# ['w', 'e', 'i', 'y', 'o', 'n', 'g', 'c', 'h', 'a', 'o']

# list(range(6))
# [0, 1, 2, 3, 4, 5]		#常应用于for、while循环

# 50 in x
# True				#判断是否在序列x中,not in相反

# x + name			#两个序列相连,x本身内容不变
# [50, 50, 50]
#  x				#重复序列
# len(x)			#获取序列长度
# min(x)			#获取最小值
# max(x)			#获取最大值
# sum(x)			#求和
# x[:3] = [9,8,7,6,5]		#替换掉列表中前三个值,替换必须是列表。
# x[::2] = [99,99,99,99,99]	#其实到结束,每2个值替换为99;有几个数替换就写几个99.



# (4)range(范围)
# 跟列表类似,序列中的一种
# range(1,21,2)		#取值1-21,步长值为2
# r = range(1,21,2)
#  for i in r:
# 	print(i)

2、元组

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Weiyc

# Tuple(元组)  内容不可修改,又叫只读列表
# (1)特性,可用序列的通用操作
# 可包含任意对象的有序结合(字符,数字,列表,元组。。。)
# 通过下标索引(位置偏移)访问元素
# 固定长度,异质,可任意嵌套
# 对象引用数组
# 内容是列表部分可修改


# (2)元组用圆括号或不用符号,不能是单个值。
t = (1,2,'Tom',1,[99,100])
# print(t.count(1)) #统计
# print(t.index(2)) #下标位置,这有这两个方法
# t1 = 1,			#必须要有逗号,不然就无法构成元组。
# t = 1,2,'Tom'
# t =[:3]			
# t + t1 			#两个元组相连,各元组值不变
# a,b = 5 ,10			#a元组值5,b元组值10
# a,b = b ,a			#与上相反

3、字符串





# (3)转移符 \
# \n 换行转义符号
# \t tab键转义符号
# # 转义转义符号  r"c:\abc\xyz\tag.txt" r开头忽略转移符,b开头以字节声明,只能是ASCII码
# \a 响铃
# \b 退格
# \r 回车
# \'  \"  \?
# \0 空字符
# \ooo o开头以八进制数声明字符
# \xhh x开头以十六进制数声明字符


# (4)字符串序列通用操作
#max(url)			#字符串按照ASCII码判断大小。


# (5)字符串内置操作
#'38'+ str(5)
# 385				# str全局函数,转换为str型

# s = 'www.baidu.com'
# 'x' + s[1:]
# 'xww.baidu.com'			#替换字符,变通法


# format() 格式化输出
# name = "weiyc"
# age = 20
# job = "IT"
# print("姓名:"+name+",年龄:"+str(age)+",工作:"+job)
# print("姓名:{0},年龄:{1},工作:{2}".format(name, age, job))  # 效果同上
# print("姓名:{0},工作:{2},部门:{department}".format(name, job, department='tech'))     # 后面须指定变量值,待定


name = "my \tis {name} {age}"
# print(name.capitalize())            # 首字母大写
# print(name.count("i"))              # 统计a次数
# print(name.center(50, "-"))         # 字符放中间,两边用-补齐
# print(name.endswith("yc"))          # 搬到字符是否以什么结尾,是返回True,否返回False
# print(name.startswith("yc"))        # 同上,开头
# print(name.expandtabs(tabsize=5))   #tab键\t 转为指定数量空格,不常用
# print(name.find("m"))               # 返回下标位置,左边数匹配第一个
# print("weiyongchao".rfind("o"))     # 返回下标位置,左边数匹配最后一个
# print(name.format(name="weiyc", age="18"))  # 占位,格式化输出,常用。
# print(name.format_map({'name': 'wieyc', 'age': 18}))    #不常用
# print('-1'.isnumeric())		# 判断是否纯数字(不含小数,负数),是返回True,否返回False,不持支byte数字(单字节)
# print(name.isalpha())		# 判断是否纯字母,是返回True,否返回False
# print('-1A'.isalnum())       # 判断是否纯字母数字(不含小数,负数),是返回True,否返回False,不持支byte数字
# print("1".isdecimal())    # 判断是否十进制数,是返回True,否返回False,不持支byte数字
# print("-1".isdigit())       # 判断是否纯整数(不含小数,负数),是返回True,否返回False;支持各种编码的数字,常用
# print("1dsf".isidentifier())    # 判断是否合法标识符(变量名),
# print("-11a".islower())         # 判断是否小写,不包含大写就True
# print("A-1.1".isupper())            #判读是否大写,不包含小写就True
# print("My Name1 Is-11.2".istitle())     # 判断首字符大写
# print("1.1".isspace())          # 判断是否空格
# print("fdasf".isprintable())    # 判读是否可打印文件,linux下不存在,tty文件,驱动程序等
# print("+".join(["1","2","3"]))  # 用指定间隔符包列表内容链接为字符串,不指定间隔符为空,常用。
# print(name.ljust(50,"*"))       # 长度不够50,后边用指定符合补充
# print(name.rjust(50,"*"))       # 长度不够50,前边用指定符合补充
# print("weiyc".upper())			# 转换大写
# print(name.lower())			    # 转换小写
# print("\nnihao\n".lstrip())    # 去左边回城空格
# print("\nnihao\n".rstrip())    # 去右边回城空格
# print("\nnihao\n".strip())     # 去两边边回城空格,常用
#
# p = str.maketrans("abcdef",'123456')    # 创建对应关系,两边数量一致
# print("hello".translate(p))             # 把输入的字符中含abcdef的替换为123456,创建随机密码
#
# print(name.replace('w','x'))            # 替换字符串中的w为x,实际name变量值不变,可以用重新赋值,常用
# print("weiyece".replace('e','x',2))     # 替换前两个e为x,替换的可以字符串
# print("1+2+3".split('+'))			    # 使用指定分割符分割字符串,并形成列表,常用
# print("1+2+3\n4+5".splitlines())        # 使用换行符分割,自动识别linux和windows换行符
# print("Weiyc".swapcase())               # 大小写互转
# print("weiyc".zfill(50))                # 不够指定数量字符,左边用0填充,十六进制用到

4、字典

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Weiyc

# dictionary(字典)--映射分类  内容可修改
# (1)特性,访问效率优于列表,元组;无序,key必须是唯一的,so天生去重
# 通过键(key),而非位置偏移(下标索引)访问数据
# 可包含任意对象的无序集合
# 可变长度,异质,可任意嵌套
# 属“可变映射”分类,可变数据类型
# 对象引用表(Hash Table)
# key-value



# 声明,{}显示结果
# >>>d = {}					// 空字典表
# >>>emp = {'name':'tom','age':20}		// {key:value,}
# >>>emp = dict(name='tom',age=20)		// dict(key=value)结果同上
# >>>keys = ['name','age','job']
# >>>emp = dict.fromkeys(keys)			//导入键值到字典
#
# 访问字典:
#
# 获取所有key值:dict.keys()
# 获取所有value值:dict.values()
# 通过key值过去value: dict.[key],类似索引和切片,实际范文字典value值,不要混淆。
# 迭代获取其中key值:for key in dict:key->为字典key值dict[key]->为key对应的value值
#
#
# 判断是否存在字典:
#
# 获取所有value值:dict.values()
# dict.[key]判断方法(没有key值,返回keyError,太粗暴)
# 使用in和not in 判断,访问bool值:key in dict  key not in dict
#
# (1)key区分大小写
# >>>book = {'x':1,'y':2,'z':'nihao'}
# >>>book['x']					//访问单个键值
# >>>book.get('x')				//结果同上,键值不存在不返回结果,不报错
# >>>book.get('X','未找到')			//找不到键值,返回结果未找到
# >>>book.keys()					//查询所有字典表的键
# >>>keys = list(x)				//转换为列表
# >>>for key in book.keys()
# 	print(key)				//查询所有字典表键,并打印,返回结果类型是视图
# >>>book.values()				//查询所有字典表值
# >>>book.items()					//查询所有字典表键和值
# >>>c = book.copy				//复制
# >>>c.clear()					//清除
# >>>book['x'] = 3				//修改键值
# >>>book.update(c)				//合并,c不变
# >>>del book['x']				//删除键
# >>>c1 = book.pop('x')				//删除并返回删除的键值
# >>>book.pop('X',None)				//弹出不存在键,不返回报错信息,结果空
# >>>book = {'name':'weiyc','hello':hanshu}
# >>>def hanshu():
# 	print('hello.wei')			//定义函数
# >>>book['hello']()				//获取hello键的函数值
# >>>book.get('hello')()				//结果同上




info = {
    'stu1101':"TengLan Wu",
        'stu1102':"LongZe Luola",
        'stu1103':"XiaoZe Maliya",
}

info2 = {
    'stu1101':"CangJingKong",
    1:2,
    3:4,
}

print(info)
# print(info['stu1101'])
# info['stu1101'] = "武藤兰"         # 查,key不存在报错,尽量不用
# print(info.get("stu1101"))          # 常用查,不存在返回None
# print('stu1101' in info)            # 查,key存在字典中,返回True,否则返回False
# info["stu1104"] = "CangJingKong"    # 改增
# info.setdefault("stu1101","aaa")   # 查增,key不在返回None,并添加要查询的值,存在返回初始值
# info.update(info2)                   # 交叉增,info2字典合并到info字典,存在交叉的部分覆盖
# del info["stu1101"]                 # 通用删,不加key删除整个字典
# info.pop("stu1101")                  # 标准删,删除指定key,必须指定不然报错
# info.popitem()                      # 随机删,不能添加key,尽量不用
# print(info.values())              # 获取所有values值
# print(info.keys())                # 获取所有key值
# print(info.items())                 # 报字典生产新的列表,列表中是按key-value生成各自元组
# print(info.fromkeys([6,7,8],'test'))    # 少用,初始化新得字典,并给每个key初始化一个相同的value值;
# 跟info字没每关系,可改为dict.fromkeys;如果初始value值为列表,则共享内存地址,修改value值,其它key的value也修改



# dict 循环

# 方法1,只用这个
# for i in info:
#     print(i,info[i])    #只有i的话,循环key值
#
# #方法2,需要转换为列表,资源消耗严重,不要用
# for k,v in info.items():
#     print(k,v)




# 多级字典嵌套及操作

# av_catalog = {
#     "欧美":{
#         "www.youporn.com": ["很多免费的,世界最大的","质量一般"],
#         "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"],
#         "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"],
#         "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"]
#     },
#     "日韩":{
#         "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]
#     },
#     "大陆":{
#         "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
#     }
# }

# print(av_catalog)
# av_catalog["大陆"]["1024"][1] = "可以在国内做镜像"    # 多件嵌套下修改



# av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来"
# print(av_catalog["大陆"]["1024"])
#ouput
# ['全部免费,真好,好人一生平安', '服务器在国外,慢,可以用爬虫爬下来']

5、集合

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Weiyc

# Sets(集合)
# (1)特性
# 集合的概念:是一个无序的,不重复的数据组合
# 去重:把一个列表变成集合,就自动去重
# 关系测试:测试两组数据的交集、并集、差集等关系
# 集合:把不同的组合在一起形成一个数据集合
# 集合分两种,可变集合(set),不可变集合(frozenset)
# 集合内部结构和字典类似,但是不存储value,其中的元素也会进行hash运算,可以称得上是没有value的字典。
# 集合聚重



# 创建集合:
# 大括号包裹创建:b = {1,2,3,4,5} 这样创建的是可变集合
# 工厂方式创建:b = set([1,2,3,,4,5]), b = frozenset([1,2,3,4,5]) 不可变集合
#
#
# 访问集合:
# 	迭代访问集合
# 		for var in set:
# 			print(var)
#
#
# 更新集合:
# set.add():更新可hash数据类型到集合,并维持原样。
# set.update():如果传入的是一个序列,将被拆分为单个元素,并且去掉重复
# 由于集合中的数据元素需要进行hash运算,可变数据类型是不可以进行hash运算的,也就不能传递进来被更新
# 可变集合支持更新操作,不可变集合不支持该操作




# (2)常用操作

list_1 = [1,2,3,4,5,5,6,6,7]
set_1 = set(list_1)                    # 变为集合后自动去重
# print(set_1,type(set_1))
#
set_2 = set([11,2,33,44,2,55,66,55])
print(set_1,set_2)
#
# print(set_1.intersection(set_2))            # 交集,结果为set_1和set_2中相同的值
# print(set_1 & set_2)                        # 交集,符号法
#
# print(set_1.union(set_2))                   # 并集,结果为set_1和set_2并为一个集合并去重
# print(set_1 | set_2)                        # 并集,符号法
#
# print(set_1.difference(set_2))              # 差集,结果为set_1有的值,但是在set_2中没有的值
# print(set_1 - set_2)                        # 差集,符号法
#
# set_3 = set([1,2,3,4,5])
# print(set_3.issubset(set_1))                # 子集,判断set_3是否为set_1的子集,返回bool值
# print(set_3 < set_1)                        # 子集,符号法

# print(set_1.issuperset(set_3))              # 父集,判断set_1是否为set_3的父集,返回bool值
# print(set_1 > set_3)                        # 父集,符号法

# print(set_1.symmetric_difference(set_2))    # 对称差集,两个集合在对方都没有的值,实际就是去掉重复的
# print(set_1 ^ set_2)                        #对称差集,符号法
#
# set_4 = set([6,7,8])
# print(set_3.isdisjoint(set_4))              # 互斥集,判断set_3和set_4的值都不同,返回bool值
#
# set_1.add(999)                              # 添加一项,更新可hash数据类型到集合,并维持原样
# set_1.update([888,333])                     # 添加多项,如果传入的是一个序列,将被拆分为单个元素,并且去掉重复
# print(set_1)

# del set_1                                   # 删除集合,通用法
# set_1.remove(2)                             # 删除集合指定值,不指定值报错,删除后不返回删除值(返回None)
# print(set_1)

# print(set_1.pop())                          # 随机删除值并返回改值,指定值报错

# set_1.clear()                               # 删除集合中所有数据元素,使其成为一个空集合
# print(set_1)
# print(set_1.discard(999) )                  # 如果999是集合中的元素,从集合中删除对象,否则返回None
# print(1 in set_1)                           # in和not in可以判断某个元素是否在集合中,返回bool值,通用操作

6、文件

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Weiyc

# data = open("yestterday",encoding="utf-8").read()   # 打开文件,非正常操作
# f = open("yesterday2",'a',encoding="utf-8") # 变量赋值,文件句柄,指定读写模式、编码(windows默认gbk)
# 文件模式:
# f = open("yesterday2",'r',encoding="utf-8")         # r 只读;
# f = open("yesterday2",'w',encoding="utf-8")         # w 创建覆盖文件写,不能读
# f = open("yesterday2",'a',encoding="utf-8")         # a 追加文件写不覆盖,不能读
# f = open("yesterday2",'r+',encoding="utf-8")         # r+ 读写,追加的方式打开,在最后写
# f = open("yesterday2",'w+',encoding="utf-8")        # w+ 写读,创建覆盖方式打开,在最后写,不常用
# f = open("yesterday2",'a+',encoding="utf-8")         # a+追加读写
# f = open("yesterday2",'rb')                         # rb 二进制编码读,不能加编码,网络传输任务文件必须二进制,跨平台;开头有b标识
# f = open("yesterday2",'wb')                         # wb 二进制编码写
# f.write("hello\n".encode())                       # 转换编码格式后写入,encode告诉现在用的是什么编码(默认utf-8),然后转为二进制



# data = f.read(5)                                # 读,默认读所有,可以指定字符长度,读完指针不归零
# print(data)

# f.write("himmmmm3\n")                          # 写,创建覆盖,慎用
# f.flush()                                       # 强制刷新缓存到硬盘,用于实时文件写
# f.write("nihao\n")

# for i in range(5):
#     print(f.readline())                       # readlinde按行读

# print(f.readlines())                          # readlines读全部行到一个列表,文件全部读到内存,只适合小文件

# low loop,尽量不用这种循环读文件
# for index,line in enumerate(f.readlines()):
#     if index == 9:
#         print('-------分割线--------')
#         continue                               # 读到十行停止
#     print(line.strip())                         # 按行循环读,strip去掉换行符

# high big 尽量用这种循环读文件
# count = 0
# for line in f:                                  # 按行循环读,读一行删一行,不占内存,使用的是迭代器
#     if count == 9:
#         print('-----分割线----')
#         count += 1
#     print(line)
#     count += 1

# print(f.tell())                               # 查看指针位置
# f.seek(0)                                     # 指针归零
# print(f.seekable())                          # 判断指针是否可移动,返回bool值,tty等文件不行,字符串、二进制等可以
# print(f.readable())                          # 判断文件是否可读,返回bool值
# print(f.writable())                          # 判断文件是否可写,返回bool值
# print(f.encoding)                            # 打印字符编码
# print(f.fileno())                           # 打印在内存中的编号,基本不用
# print(f.errors)                             # 处理异常错误,底层使用,基本不用
# f.truncate(10)                              # 截断,默认从0开始截断,可指定位置开始截断,后面清空



# f.close()                         # 关闭保存,默认不关闭也保存
# print(f.closed)                   # 判断文件是否关闭,返回bool值

# 文件修改

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Weiyc

# f = open("yesterday", 'r', encoding="utf-8")
# f_new = open("yesterday2", 'w', encoding="utf-8")
#
#
# for line in f:
#     if "昨日当我年少轻狂" in line:
#         line = line.replace("昨日当我年少轻狂", "昨天当我年少轻狂")
#     f_new.write(line)
# f.close()
# f_new.close()


# def shell_sed(old_files,new_files,old,new):
#     f = open(old_files,'r',encoding="utf-8")
#     f_new = open(new_files,'w',encoding="utf-8")
#     for  line in f:
#         if old in line:
#             line = line.replace(old,new)
#         f_new.write(line)
#     f.close()
#     f_new.close()
#
#
# shell_sed("yesterday","yesterday2","昨日当我年少轻狂", "昨天当我年少轻狂")

7、数字

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Weiyc

# Number(数字)
# Python 支持int(整数)、float(浮点数)、bool(布尔值)、complex(复数)。long已取消。
# 2 是一个整数的例子。
# 长整数 不过是大一些的整数。
# 3.23和52.3E-4是浮点数的例子。E标记表示10的幂。在这里,52.3E-4表示52.3 * 10-4。
# (-5+4j)和(2.3-4.6j)是复数的例子,其中-5,4为实数,j为虚数,数学中表示复数是什么?。



# (1)int(整数),var = 1  var = 10
# 在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647
# 在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807
# long(长整型) 3.x版本取消,统一为整数
# 跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。
# 注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。



# math 数学模块
# >>>import math		//导入模块
# >>>math.floor()		//取最小整数,左移
# >>>math.ceil()		//取最大整数,右移
# >>>math.trunc()		//取整数
# >>>round(3.14)		//四舍五入
#
# (2)float(浮点数), var = 1.0 ,浮点数类似小数,包含小数。
# 十进制直接显示,8进制0o,十六进制0x,二进制0b.例,0o10
# 十进制转换其它,hex(number)转16进制,oct(number)转8进制,bin(number)转二进制。
# 10 + "10",不对;10 + int("10")强制转换整数,int("10",2)转换2进制;float强制转换浮点类型。


# decimal 浮点数模块
# >>>0.1 + 0.1 + 0.1 得5.55...不对
# >>>import decimal
# >>>decimal.Decimal('0.1') + decimal.Decimal('0.1') +decimal.Decimal('0.1') - decimal.Decimal('0.3') >>>Decimal('0.0')	//正确
# >>>from decimal import Decimal
# >>>Decimal('0.1') + Decimal('0.1')	//可以这样写,必须'0.1',不加引号得值不对


# (3) bool(布尔值) ,布尔值和布尔代数表示完全一致,一个布尔值只有True、False两种值。要么True,要么False。>>>type(5>3)		//得值True.
# True对应值1,False对应值0.
# bool函数转换其它为bool值
# 非空非0为真
# o空(None)为假
# >>>bool(3)
# >>>bool(-3)
# >>>bool('sdfa')			//得值True,真值为True
# >>>bool(0)  () []		//0、0.0或空值,得值为Flase,None

8、with语句

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Weiyc

f = open("yesterday", 'r', encoding="utf-8")
f2 = open("yesterday2", 'r', encoding="utf-8")


with open("yesterday",'r',encoding="utf-8") as f , \
        open("yesterday", 'r', encoding="utf-8") as f2:    # with语句有自动关闭文件功能 可以打开多个文件
    print(f.readline())

9、练习

(1)进度条

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Weiyc

import sys,time

for i in range(20):
    sys.stdout.write("#")           # stdout标准输出(屏幕输出),stdin标准输入(屏幕输入)
    sys.stdout.flush()              # 不刷新,会读到缓存后一次刷出
    time.sleep(0.1)                 # 每隔0.1秒刷一个

# 该方法在linux中才能用

(2)购物车

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Weiyc

phone = [
    ('ifhone',5000),
    ('mac',10000),
    ('watch',2000)
]
# print(phone)

shop_list = []

salary = input("请输入你的工资:")
if salary.isdigit():    # isdigit判断是否是数字,是返回True,否返回False
    salary = int(salary)
# print(salary)
    while True:
        print("商品清单如下")
        for index,item in enumerate(phone): # enumerate,将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
            # print(product_list.index(item),item)
            print(index,item)
        user_choice = input("选择商品:")
        if user_choice.isdigit():
            user_choice = int(user_choice)
            if user_choice < len(phone) and user_choice >= 0:
                p_item = phone[user_choice]
                if p_item[1] <= salary:
                    shop_list.append(p_item)
                    salary -= p_item[1]
                    print("add %s into shopping car,you current balnce is \033[31;1m %s \033[0m" % (p_item,salary))
                    print("已购商品清单",shop_list)
                else:
                    print("\033[41;1m你的余额只剩%s\033[0m" % salary)
            else:
                print("product cdoe [%s] is not exist!" % user_choice)
        elif user_choice == "q":
            print("-----shopping list------")
            for i in shop_list:
                print(i)
            print("your current is \033[31;1m %s \033[0m" % salary)
            exit()
        else:
            print("invalid option")

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐