1.语言分为编译型语言和解释型语言:
编译型是将每一条语句都编译为机器语言,并保存为二进制语言,这样运行的时候省去了编译的过程,运行速度会很快,但是不可移植
解释型是在执行语句的时候才逐条的解释成机器语言来给计算机执行,所以运行速度相对很很慢,但平台兼容性不错
其中C,C++,Go,Swift,Object-C,Pascal等为编译型语言;
python,Ruby,Javascript,PHP,Perl,Erlang等为解释型语言;
Java,C#为混合型语言;
其实Python和Java同样是先编译后解释的语言,执行之后会产生一个(__pycache__)文件,python的运行过程如下:
第一次执行程序的时候会在硬盘中找pyc(预编译之后的字节码文件,不同于机器码)文件,如果找到了,就直接载入,
否则进行编译,将结果保存在位于内存中的PyCodeObject中,当程序结束后,Python解释器则将PyCodeObject写回到pyc文件中;
这里需要考虑的一个问题是,如果源代码改变了怎么办???
Python的方法是将源代码的更新时间和pyc的更新时间进行对比,如果pyc更新时间最新则直接载入执行,否则重新进行编译。
2.bytes类型:
bytes和string之间的关系:
string----------->bytes (通过encode,字符串编码为二进制)
bytes----------->string (通过decode,二进制解码为字符串)
3.列表的增删改查等,copy(浅copy,深copy)
names = ["ZhangYang","GuYun","XiangPeng","XuLiangChen","ChenRongHua"]
(1)增:
names.append("LeiHaiDong") #插入数据到列表末尾
names.insert(1,"ChenRongHua") #随意插入数据位置
names2 = [1,2,3,4]
names.extend(names2) #扩展
(2)删:
names.remove("ChenRongHua")
del names[1]
names.pop() #默认删除最后一个值,也可指定位置
(3)改:
names[1] = "XieDi" #替换数据
(4)查:
print(names)
print(names[0],names[2])
print(names[1:3]) #切片
print(names[-1]) #取列表最后一个值
print(names[-2:]) #取列表最后两个值
print(names[:2]) #取列表前面两个值
(5)其他:
print(names.index("XieDi")) #需找元素在列表中的位置
print(names.count("ChenRongHua")) #对元素进行计数
names.clear() #清空列表
names.reverse() #反转列表
names.sort() #排序
(6)copy (浅copy,深copy)
names = ['ZhangYang', 'ChenRongHua', 'XieDi', 'XiangPeng', ['alex','jack']]
names2 = names.copy()
print(names)
print(names2)
输出:
['ZhangYang', 'ChenRongHua', 'XieDi', 'XiangPeng', ['alex','jack']]
['ZhangYang', 'ChenRongHua', 'XieDi', 'XiangPeng', ['alex','jack']]
names[2] = "谢帝"
print(names)
print(names2)
输出:
['ZhangYang', 'ChenRongHua', '谢帝', 'XiangPeng', ['alex','jack']]
['ZhangYang', 'ChenRongHua', 'XieDi', 'XiangPeng', ['alex','jack']]
names[4][0] = "ALEX"
print(names)
print(names2)
输出:
['ZhangYang', 'ChenRongHua', 'XieDi', 'XiangPeng', ['ALEX','jack']]
['ZhangYang', 'ChenRongHua', 'XieDi', 'XiangPeng', ['ALEX','jack']]
这里输出的结果就是浅拷贝,仅copy第一层;
解决方法:
import copy
names2 = copy.deepcopy(names)
print(names)
print(names2)
输出结果:
['ZhangYang', 'ChenRongHua', 'XieDi', 'XiangPeng', ['ALEX','jack']]
['ZhangYang', 'ChenRongHua', 'XieDi', 'XiangPeng', ['alex','jack']]
4.元组:两个方法,count,index。
5.小程序:
程序:购物车程序
需求:
- 启动程序后,让用户输入工资,然后打印商品列表
- 允许用户根据商品编号购买商品
- 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
- 可随时退出,退出时,打印已购买商品和余额
代码:
1 import sys 2 3 product_list = [ #商品清单 4 ("Iphone",6800), 5 ("Mac pro",12800), 6 ("Watch",9800), 7 ("Bike",800), 8 ("Coffce",30), 9 ("Python Book",120), 10 ] 11 shopping_list = [] #购物清单 12 salary = input("Input your salary:") 13 14 if salary.isdigit(): #判断字符串是否只由数字构成 15 salary = int(salary) 16 while True: 17 for index,item in enumerate(product_list): #输出清单编号,清单 18 #print(product_list.index(item),item) 19 print(index,item) 20 21 user_choice = input("Input your choice >>>:") 22 if user_choice.isdigit(): 23 user_choice = int(user_choice) 24 if len(product_list) > user_choice and user_choice >= 0: #判断输入选项是否在购物清单选项中 25 p_item = product_list[user_choice] 26 if salary >= p_item[1]: #判断余额和产品价格比较 27 salary -= p_item[1] 28 shopping_list.append(p_item) #新购买的产品加入购物清单中 29 print("Adding %s into your shopping cart,your current balance:%s" % (p_item,salary)) 30 else: 31 print("没钱就不要买东西,您的余额为:%s" % salary) 32 else: 33 print("product code [%s] is not exist!" % user_choice) 34 elif user_choice == 'q': 35 print("-----------------shopping list---------------------") 36 for i in shopping_list: 37 print(i) 38 print("your current balance:%s" % salary) 39 sys.exit() 40 else: 41 print("invalid option")
注意以及学习到的知识点:
(1)在打印清单编号的时候使用enumerate内置函数(即能遍历index,又能遍历元素),也可以使用index方法得到清单编号(product_list.index(item))
(2)判断一个字符串是否为数字:isdigit()方法
(3)在Spyder中使用exit()无法退出程序!后面导入sys,使用sys.exit()退出(SystemExit)
6.字符串常用操作:
1 name = "my wife name is MM" 2 name1 = "my wife name is {name} and age is {age} old" 3 4 print(name.capitalize()) #首字母大写 5 print(name.count("a")) #对字符串计数 6 print(name.center(50,"-")) #打印50个字符,不够的使用-补充,name居中 7 print(name.endswith("M")) #判断是否以一个字符串结尾,输出bool类型 8 print(name.expandtabs()) #name中加一个 ,在expandtabs中使用tabsize=x,打印的时候会在name中 位置打印x个空格 9 print(name.find("name")) #找到字符串的位置 10 print(name1.format(name="MM",age=18)) #格式化输出 11 print(name1.format_map({"name":"MM","age":18})) 12 print("ab123".isalnum()) #判断是否为阿拉伯字符,数字 13 print("ab".isalpha()) #判断是否为纯英文字符 14 print("17".isdecimal()) #判断是否为一个十进制 15 print("ab".isalpha()) #判断字符串是否只由字母组成 16 print("13".isdigit()) #判断字符串是否由数字构成 17 print("_a".isidentifier()) #判断是不是一个合法的标识符 18 print("13".islower()) #判断所有字符是不是小写 19 print("13".isupper()) #判断所有字符是不是大写 20 print("13".isnumeric()) #检测字符串是否只由数字组成。这种方法是只针对unicode对象 21 print(" ".isspace()) #判断是不是空格 22 print("My Name Is".istitle()) #判断是不是标题,首字母大写 23 print("13".isprintable()) #判断是否为可打印的,tty file,drive file都是不可打印的 24 print("+".join(['1','2','3','4'])) #将序列中的元素以指定的字符连接生成一个新的字符串 25 print(name.ljust(50,'*')) #打印50个字符,不够的用*在后面补上 26 print(name.rjust(50,'*')) #打印50个字符,不够的用*再前面补上 27 print("MM".lower()) #将大写转成小写 28 print("mm".upper()) #将小写转成大写 29 print(" mm".lstrip()) #去掉左边回车和空格 30 print("mm ".rstrip()) #去掉右边回车和空格 31 print(" mm ".strip()) #去掉全部回车和空格 32 33 p = str.maketrans("abcdef","123456") #把字符串转成对应的数值 34 print("xiaomeng hu".translate(p)) 35 #可以用作随机密码组合 36 37 print("xiaomeng hu".replace("x","X")) #替换字符串 38 print("xiaomeng xhu".rfind("x")) #找到最右边的值的位置 39 print("xiaomeng hu".split()) #将字符串按照特定符号分割 40 print("xiao meng hu".splitlines()) #按换行来分割 41 print("xiaomeng hu".swapcase()) #转换字母大小写 42 print("xiaomeng hu".zfill(50)) #不够50用0填充
7.字典:
(1)字典是无序的
(2)key是唯一的,自动去重
1 info = { 2 "stu0001":"xiaomeng hu", 3 "stu0002":"tao zhang", 4 "stu0003":"jay chou", 5 } 6 7 print(info["stu0001"]) #查,这种如果不存在的会抛出异常 8 print(info.get("stu0001")) #查,这种不存在的返回空,建议这种 9 print("stu0001" in info) #判断数据是否存在 10 11 info["stu0001"] = "胡晓梦" #改 12 info["stu0004"] = "kobe" #增 13 del info["stu0004"] #删 14 info.pop("stu0003") #删 15 info.popitem() #随机返回并删除字典中的一对键和值 16 print(info)
方法:
(1)setdefault():在字典中找这个key,如果找得到就返回,找不到就创建一个新的
1 info = { 2 "stu0001":"xiaomeng hu", 3 "stu0002":"tao zhang", 4 "stu0003":"jay chou", 5 } 6 7 b = { 8 "stu0003":"xueyou zhang", 9 1:3, 10 2:5 11 } 12 13 info.update(b) #两个字典合并,其中重叠的部分用b的内容去更新 14 print(info) 15 c = dict.fromkeys([6,7,8],"test") #初始化一个新的字典 16 print(c) 17 print(info.items()) #把一个字典转成一个列表 18 19 20 21 for i in info: 22 print(i,info[i]) 23 24 for k,v in info.items(): 25 print(k,v) 26 27 #上面一个循环更高效一点,因为下面这个循环还有一个转化为列表的过程
8.多级菜单程序:
要求:
- 三级菜单
- 可依次选择进入各子菜单
- 所需新知识点:列表、字典
1 # -*- coding: utf-8 -*- 2 3 data = { 4 "北京":{ 5 1:2 6 }, 7 "安徽省":{ 8 "合肥市":{ 9 1:2 10 }, 11 "芜湖市":{ 12 1:2 13 }, 14 "宣城市":{ 15 "广德县":["化肥厂","卡地亚"], 16 "郎溪县":2, 17 "宁国市":3 18 } 19 }, 20 "浙江省":{ 21 1:2 22 } 23 } 24 25 exit_falg = False #退出占位符,若想退出,修改exit_falg的值即可 26 27 while not exit_falg: 28 for i in data: 29 print(i) 30 31 choice = input("请输入选择1>>>") 32 if choice in data: 33 while not exit_falg: 34 for i2 in data[choice]: 35 print(" ",i2) 36 choice2 = input("请输入选择2,按b返回,按q退出>>>") 37 if choice2 in data[choice]: 38 while not exit_falg: 39 for i3 in data[choice][choice2]: 40 print(" ",i3) 41 choice3 = input("请输入选择3,按b返回,按q退出>>>") 42 if choice3 in data[choice][choice2]: 43 for i4 in data[choice][choice2][choice3]: 44 print(" ",i4) 45 choice4 = input("到达最后一层,返回请按b,退出按q>>>") 46 if choice4 == "b": 47 pass #不直接退出循环,直接回到起点 48 elif choice4 == "q": 49 exit_falg = True 50 if choice3 == "b": 51 break 52 elif choice3 == "q": 53 exit_falg = True 54 if choice2 == "b": 55 break 56 elif choice2 == "q": 57 exit_falg = True
-------------------------------------------补充---------------------------------------------------
一.解释器:
二.编写一个HelloWorld:
a.在Notepad++中编写代码,保存到桌面命名为HelloWorld.py
b.进入Cmd终端:cd进入桌面目录
c.运行保存于桌面上的python文件:
d.可以进入python的交互界面直接编写代码:
在交互界面中编写代码相当于保存于内存中,关闭之后无法保存。交互器是主要用来对代码进行调试的。
三.变量命名规范:
1 变量定义的规则: 2 3 变量名只能是 字母、数字或下划线的任意组合 4 变量名的第一个字符不能是数字 5 以下关键字不能声明为变量名 6 ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 7 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
a.驼峰体:
AgeOfOldboy = 56
NumberOfStudents = 80
b.下划线:
age_of_oldboy = 56
Number_of_students = 80
建议下划线
不规范的命名示例:
*补充拓展:
为什么name2不会随着name1的变化而变化呢???
如图所示:
四.常量:
五.格式化输出:
1 #提示输入姓名,年龄,工作,家乡,并按一定的格式输出: 2 3 name = input("Name:") 4 age = int(input("Age:") ) #%d类型是数字类型,需要将字符串类型强制转换为数字类型 5 job = input("Job:") 6 hometown = input("Hometown:") 7 8 # print("----------info of " + name +"---------") 9 # print("Name: " + name) 10 # print("Age " + age) 11 # print("Job: " + job) 12 # print("Hometown: " + hometown) 13 # print("-----------end------------") 14 15 info = ''' 16 -----------info of %s--------- 17 Name: %s 18 Age: %d 19 Job: %s 20 Hometown: %s 21 ------------- end ----------- 22 ''' % (name,name,age,job,hometown) 23 #s:string 24 #d:digit 25 #f:float 26 print(info) 27 28 结果为: 29 Name:mm 30 Age:18 31 Job:it 32 Hometown:GD 33 34 -----------info of mm--------- 35 Name: mm 36 Age: 18 37 Job: it 38 Hometown: GD 39 ------------- end -----------
六.if判断语句:
1.实例:用if语句判断用户登录。
1 #-------------验证用户登录---------------- 2 #提示用户输入用户名密码 3 #验证用户名密码 4 # 如果用户名密码正确则登录成功 5 # 如果用户名密码错误则提示重新输入 6 7 _username = "MM" 8 _password = "abc123" 9 10 username = input("username:") 11 password = input("password:") 12 13 if (username == _username) and (password == _password): 14 print("恭喜你,%s,登录成功!" % username) 15 else: 16 print("请重新输入用户名或密码!!!")
2.实例:输入姓名,性别,判断如果是女生,打印我喜欢女生,否则,打印 一起来搞基!
1 #---------------判断男女生---------------- 2 #提示输入姓名,性别 3 #判断性别是否为女生 4 # 如果是女生,则输出我喜欢女生 5 # 如果不是,则输出一起来搞基 6 7 8 name = input("name:") 9 sex = input("sex:") 10 11 if sex == "F" or sex == "f": 12 print("我喜欢女生") 13 else: 14 print("一起来搞基!")
3.实例:输入姓名,年龄,判断如果是女生且年龄小于28岁,打印我喜欢女生,否则,打印 姐弟恋也很好哦!
1 #-----------判断男女生和年龄-------------- 2 #提示输入姓名,性别和年龄 3 #判断性别是否为女生且年龄是否小于28岁 4 # 如果是,则输出我喜欢女生 5 # 如果不是,则输出姐弟恋也很好哦! 6 9 name = input("name:") 10 sex = input("sex:") 11 age = int(input("age:")) 12 13 if (sex == "F" or sex == "f") and age < 28: 14 print("我喜欢女生") 15 else: 16 print("姐弟恋也很好哦!")
4.实例:输入姓名,年龄,判断如果是女生且年龄小于28岁,打印我喜欢女生,否则,打印 姐弟恋也很好哦!如果是男生,打印 一起来搞基!
1 #-----------判断男女生和年龄升级版---------- 2 #提示输入姓名,性别和年龄 3 #判断是否为女生 4 # 判断是否小于28岁 5 # 如果是则输出,我喜欢女生 6 # 否则输出,姐弟恋也很好哦! 7 #否则输出,一起来搞基 8 9 10 name = input("name:") 11 sex = input("sex:") 12 age = int(input("age:")) 13 14 if (sex == "F" or sex == "f"): 15 if age < 28: 16 print("我喜欢女生") 17 else: 18 print("姐弟恋也很好哦!") 19 else: 20 print("一起来搞基!")
5.实例:成绩有ABCDE5个等级,分别对应如下:
# A 90-100
# B 80-89
# C 60-79
# D 40-59
# E 0-39
#
# 要求用户输入0-100的数字后,打印对应成绩
#-----------打印成绩----------- #提示输入一个数字 #判断是否大于100 # 如果是输出成绩最多只能到100 #否则判断是否大于等于90 # 如果是输出A #否则判断是否大于等于80 # 如果是输出B #否则判断是否大于等于60 # 如果是输出C #否则判断是否大于等于40 # 如果是输出D #否则判断是凑大于等于0 # 如果是输出E #否则输出成绩不能是负数! score = int(input("请输入0-100的数字:")) if score > 100: print("成绩最多只能到100") elif score >= 90: print("A") elif score >= 80: print("B") elif score >= 60: print("C") elif score >= 40: print("D") elif score >= 0: print("E") else: print("成绩不能是负数!") 最早写的一般代码,如下: score = int(input("请输入0-100的数字:")) if (score <= 100) and (score >= 90) : print("A") elif (score <= 89) and (score >= 80) : print("B") elif (score <= 79) and (score >= 60) : print("C") elif (score <= 59) and (score >= 40) : print("D") elif (score <= 39) and (score >= 0) : print("E") else: print("输入值有误!")
七.while循环:
1.实例:实现打印1-100的偶数
1 #----------实现打印1-100的偶数------------ 2 #初始化count等于1 3 #当count小于等于100 4 # 判断count模2是否为0 5 # 如果是,则打印偶数 6 7 count = 1 8 9 while count <= 100: 10 if count %2 == 0: 11 print("loop ",count) 12 # else: 13 # pass 14 count += 1
2.实例:循环打印1-100,第50次不打印值,第60-80次打印对应值的平方
#-----循环打印1-100,第50次不打印,60-80打印平方 #初始化count为1 #当count小于等于100 # 判断count是否为50,如果是,则pass # 否则判断count是否大于等于60并且小于等于80 # 如果是则输出count的平方 # 否则输出count的值 count = 1 while count <= 100: if count == 50: pass elif count >= 60 and count <= 80: print(count*count) else: print(count) count += 1
3.实例:猜一次年龄游戏
1 #-----------猜年龄游戏------------- 2 #初始化年龄为25 3 #提示出入猜测的年龄 4 #判断猜测年龄是否等于实际年龄 5 # 如果是,则输出恭喜你,猜对了! 6 #否则判断是否大于 7 # 如果是,则输出try smaller! 8 #否则,输出 try bigger! 9 10 11 age = 25 12 13 user_guess = int(input("请猜测年龄:")) 14 if user_guess == age: 15 print("恭喜你,猜对了!") 16 elif user_guess > age: 17 print("try smaller!") 18 else: 19 print("try bigger!")
4.实例:(猜年龄升级版)优化猜年龄游戏,允许用户最多猜3次,中间猜对了,直接跳出循环。
1 #-----------3次猜测年龄机会----------- 2 3 age = 25 #初始化年龄 4 count = 0 #计数初始化 5 while count < 3: #while判断count是否小于3,如果小于3则 6 #提示输出猜测的年龄 7 user_guess = int(input("请输入猜测年龄:")) 8 if user_guess == age: #判断猜测年龄和实际年龄是否相等 9 print("恭喜你猜对了!") #输出结果 10 break #break跳出整个循环,continue跳出本次循环,exit退出程序 11 elif user_guess > age: #判断猜测年龄大于实际年龄,则 12 print("try smaller!") #输出往小了猜 13 else: #判断猜测年龄小于实际年龄,则 14 print("try bigger!") #输出王大了猜 15 count += 1 #每次循环结束count加1
5.实例:(猜年龄完善版)优化猜年龄游戏,允许用户最多猜3次,猜了3次后,再问是否还想玩,如果用户选y,在允许猜3次,以此往复。
1 #---------------猜年龄游戏完善版---------------------- 2 3 #思路:在guess_age升级版的基础上进行修改,猜3次结束之后来判断,所以直接在while循环下一层开始进行判断count是否为3, 4 # 如果是,增加一个是否想玩的输入,选择y则进入之前猜测的环节,此时count为3无法循环,所以这时候count初始化为0, 5 # 如果count不是3,直接进入之前猜测的环节。 6 #反思:思维不严谨,重复代码太多,后面进行修正。 7 8 原始代码如下: 9 ''' 10 age = 25 11 count = 0 12 while count < 4: 13 if count == 3: 14 choice = input("是否还想玩?y/n:") 15 if choice == "y": 16 user_guess = int(input("请输入猜测年龄:")) 17 count = 0 18 if user_guess == age: 19 print("恭喜你猜对了!") 20 break 21 elif user_guess > age: 22 print("try smaller!") 23 else: 24 print("try bigger!") 25 count += 1 26 else: 27 break 28 else: 29 user_guess = int(input("请输入猜测年龄:")) 30 if user_guess == age: 31 print("恭喜你猜对了!") 32 break 33 elif user_guess > age: 34 print("try smaller!") 35 else: 36 print("try bigger!") 37 count += 1 38 ''' 39 40 #修正版本: 41 #思路:当猜测了3次之后要想重新猜测3次的关键点在于这个count = 0!!!!!!!,所以需要在猜测3次之后将count变成0. 42 43 age = 25 44 count = 0 45 46 while count < 3: 47 user_guess = int(input("请输入猜测年龄:")) 48 if user_guess == age: 49 print("恭喜你,猜对了!") 50 break 51 elif user_guess > age: 52 print("try smaller!") 53 else: 54 print("try bigger!") 55 56 count += 1 57 58 if count == 3: #判断是否猜测了3次,如果是,则 59 #提示输入是否继续猜年龄 60 choice = input("是否继续猜年龄?(y|Y):") 61 if choice == 'y' or choice == 'Y': #继续猜年龄 62 count = 0 #初始化count为0
6.while。。。else语句:
实例:
#while后面的else作用是指,当while循环正常执行完,中间没有被break终止的话,就会执行else后面的语句. #作用:提供一个简单的方法,帮助我们判断一个程序是否正常执行完,是否有问题 count = 0 #初始化coun为0 while count <= 5: #while判断count是否小于等于5,如果是; print("loop ",count) #输出count的值 # if count == 3: #判断count是否等于3,如果是 # break #跳出整个循环 count += 1 #每次循环结束count加1 else: print("loop is done...") #while正常循环5次结束后输出循环结束 print("out of loop!")
八.break和continue:
1.实例:break
#-------------break-------------- count = 0 while count <= 100: print("loop ",count) if count == 5: break #break跳出整个循环 count += 1 #输出结果: # loop 0 # loop 1 # loop 2 # loop 3 # loop 4 # loop 5
2.实例:continue
1 #------------------continue-------------------------- 2 3 count = 0 4 while count <= 100: 5 print("loop ",count) 6 if count == 5: 7 continue #跳出本次循环,count依然是5,继续判断是否为5,则又进入if判断语句中,最后是个死循环 8 count += 1 9 10 结果:continue在这里会是一个死循环,她是跳出本次循环 11 #loop 0 12 #loop 1 13 #loop 2 14 #loop 3 15 #loop 4 16 #loop 5 17 #loop 5 18 #loop 5 19 #. 20 #. 21 #. 22 23 24 count = 0 25 while count <= 100: 26 count += 1 # count在continue判断语句前面,防止进入死循环 27 if count > 5 and count < 95: 28 continue 29 print("loop ",count) 30 31 print("------out of while loop-------") 32 33 34 # 结果: 35 # loop 1 36 # loop 2 37 # loop 3 38 # loop 4 39 # loop 5 40 # loop 95 41 # loop 96 42 # loop 97 43 # loop 98 44 # loop 99 45 # loop 100 46 # loop 101 47 # ------out of while loop-------
九.浮点数:
1.浮点数:有限小数或者无限循环小数
2.小数精度:python默认是17位,也就是小数点后16位,这个精确度越往后越不准
如:
1 #python默认的是17位的精度,所以小数点之后只能存16位。 2 3 a = 1.21212121212121212121 4 b = 1.23456789123456789123 5 print(a) 6 print(b) 7 8 # 1.2121212121212122 9 # 1.234567891234568 10 #结果为何??? 11 # Python默认的是17位精度,也就是小数点后16位,尽管有16位,但是这个精确度却是越往后越不准的。
3.如何使用更高精度呢?
1 #借助decimal模块的"getcontext"和"Decimal"方法 2 3 a = 1.21212121212121212121 4 b = 1.23456789123456789123 5 6 from decimal import * 7 print(getcontext()) 8 #Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow]) 9 10 #prec表示的是精度,可以进行调整 11 getcontext().prec = 50 12 print(getcontext()) 13 #Context(prec=50, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow]) 14 15 print(Decimal(a)) 16 print(Decimal(b)) 17 18 # 1.2121212121212121548552431704592891037464141845703125 19 # 1.2345678912345678934769921397673897445201873779296875
十.列表:
1.常用操作:
1 #----------list常用操作----------- 2 #1.创建: 3 4 list_test1 = ['mm','tt'] 5 list_test2 = list('mm') 6 list_test3 = list(['mm','tt']) 7 8 #2.索引: 9 name = ['mm','tt','MM',5,13,8,24] 10 print(name[0]) 11 print(name[2]) 12 # mm 13 # MM 14 15 #3.切片: 16 print(name[0:2]) 17 print(name[2:5]) 18 print(name[:2]) 19 print(name[2:]) 20 print(name[:]) 21 print(name[::2]) #2为步长 22 print(name[::-1]) #反转列表 23 24 # ['mm', 'tt'] 25 # ['MM', 5, 13] 26 # ['mm', 'tt'] 27 # ['MM', 5, 13, 8, 24] 28 # ['mm', 'tt', 'MM', 5, 13, 8, 24] 29 # ['mm', 'MM', 13, 24] 30 # [24, 8, 13, 5, 'MM', 'tt', 'mm'] 31 32 #4.追加: 33 name.append('mumu') 34 print(name) 35 36 #['mm', 'tt', 'MM', 5, 13, 8, 24, 'mumu'] 37 38 #5.删除: 39 name.remove('tt') 40 print(name) 41 print(name.pop()) 42 43 #['mm', 'MM', 5, 13, 8, 24, 'mumu'] 44 # 'mumu' 45 46 #6.长度: 47 print(len(name)) 48 49 # 6 50 51 #7.包含: 52 print('mm' in name) 53 print('tt' in name) 54 55 # True 56 # False 57 58 #8.循环: 59 for i in name: 60 print(i) 61 62 # mm 63 # MM 64 # 5 65 # 13 66 # 8 67 # 24
2.习题:
1 #习题1:创建一个空列表,命名为names,往里面添加old_driver,rain,jack,shanshan,peiqi,black_girl元素 2 3 names = [] 4 names.append('old_driver') 5 names.append('rain') 6 names.append('jack') 7 names.append('shanshan') 8 names.append('peiqi') 9 names.append('black_girl') 10 print(names) 11 12 #结果:['old_driver', 'rain', 'jack', 'shanshan', 'peiqi', 'black_girl'] 13 14 #习题2:往names列表里black_girl前面插入一个alex 15 names.insert(5,'alex') 16 print(names) 17 18 #结果:['old_driver', 'rain', 'jack', 'shanshan', 'peiqi', 'alex', 'black_girl'] 19 20 #习题3:把shanshan的名字改为中文,姗姗 21 names[3] = '姗姗' 22 print(names) 23 24 #结果:['old_driver', 'rain', 'jack', '姗姗', 'peiqi', 'alex', 'black_girl'] 25 26 #习题4:往names列表里rain的后面插入一个子列表,['oldboy','oldgirl'] 27 names.insert(2,['oldboy','oldgirl']) 28 print(names) 29 30 #结果:['old_driver', 'rain', ['oldboy', 'oldgirl'], 'jack', '姗姗', 'peiqi', 'alex', 'black_girl'] 31 32 #习题5:返回peiqi的索引值 33 print(names.index('peiqi')) 34 35 #结果:5 36 37 #习题6:创建新列表[1,2,3,4,2,5,6,2]合并入names列表 38 names2 = [1,2,3,4,2,5,6,2] 39 print(names + names2) #结果为:['old_driver', 'rain', ['oldboy', 'oldgirl'], 'jack', '姗姗', 'peiqi', 'alex', 'black_girl', 1, 2, 3, 4, 2, 5, 6, 2] 40 41 names.extend(names2) 42 print(names) #结果为:['old_driver', 'rain', ['oldboy', 'oldgirl'], 'jack', '姗姗', 'peiqi', 'alex', 'black_girl', 1, 2, 3, 4, 2, 5, 6, 2] 43 44 #习题7:取出names列表中索引4-7的元素 45 46 a = names[4:7] 47 print(a) 48 49 #结果:['姗姗', 'peiqi', 'alex'] 50 51 #习题8:取出names列表中索引2-10的元素,步长为2 52 53 b = names[2:10:2] 54 print(b) 55 56 #结果:[['oldboy', 'oldgirl'], '姗姗', 'alex', 1] 57 58 59 #习题9:取出names列表中最后3个元素 60 61 c = names[-3:] 62 print(c) 63 64 #结果:[5, 6, 2] 65 66 #习题10:循环names列表,打印每个元素的索引值,和元素 67 68 #尝试1: 69 70 for i in names: 71 print('索引值:',names.index(i),',','元素:',i) 72 73 #结果: 74 # 有相同的元素的时候只能返回最前面元素的索引!!! 75 ''' 76 索引值: 0 , 元素: old_driver 77 索引值: 1 , 元素: rain 78 索引值: 2 , 元素: ['oldboy', 'oldgirl'] 79 索引值: 3 , 元素: jack 80 索引值: 4 , 元素: 姗姗 81 索引值: 5 , 元素: peiqi 82 索引值: 6 , 元素: alex 83 索引值: 7 , 元素: black_girl 84 索引值: 8 , 元素: 1 85 索引值: 9 , 元素: 2 86 索引值: 10 , 元素: 3 87 索引值: 11 , 元素: 4 88 索引值: 9 , 元素: 2 89 索引值: 13 , 元素: 5 90 索引值: 14 , 元素: 6 91 索引值: 9 , 元素: 2 92 ''' 93 94 #正确方法1: 95 for index,value in enumerate (names): #enumerate:枚举 96 print('索引值:',index,',','元素:',value) 97 98 #正确结果: 99 ''' 100 索引值: 0 , 元素: old_driver 101 索引值: 1 , 元素: rain 102 索引值: 2 , 元素: ['oldboy', 'oldgirl'] 103 索引值: 3 , 元素: jack 104 索引值: 4 , 元素: 姗姗 105 索引值: 5 , 元素: peiqi 106 索引值: 6 , 元素: alex 107 索引值: 7 , 元素: black_girl 108 索引值: 8 , 元素: 1 109 索引值: 9 , 元素: 2 110 索引值: 10 , 元素: 3 111 索引值: 11 , 元素: 4 112 索引值: 12 , 元素: 2 113 索引值: 13 , 元素: 5 114 索引值: 14 , 元素: 6 115 索引值: 15 , 元素: 2 116 ''' 117 118 #正确方法2: 119 count = 0 120 for i in names: 121 print(count,i) 122 count += 1 123 124 #正确结果: 125 ''' 126 0 old_driver 127 1 rain 128 2 ['oldboy', 'oldgirl'] 129 3 jack 130 4 姗姗 131 5 peiqi 132 6 alex 133 7 black_girl 134 8 1 135 9 2 136 10 3 137 11 4 138 12 2 139 13 5 140 14 6 141 15 2 142 ''' 143 144 #习题11:循环names列表,打印每个元素的索引值和元素,当索引为偶数时,把对应的元素改成-1 145 146 for index,value in enumerate (names): 147 if index % 2 == 0: 148 print('索引值:',index,',','元素:',-1) 149 else: 150 print('索引值:',index,',','元素:',value) 151 152 #结果: 153 ''' 154 索引值: 0 , 元素: -1 155 索引值: 1 , 元素: rain 156 索引值: 2 , 元素: -1 157 索引值: 3 , 元素: jack 158 索引值: 4 , 元素: -1 159 索引值: 5 , 元素: peiqi 160 索引值: 6 , 元素: -1 161 索引值: 7 , 元素: black_girl 162 索引值: 8 , 元素: -1 163 索引值: 9 , 元素: 2 164 索引值: 10 , 元素: -1 165 索引值: 11 , 元素: 4 166 索引值: 12 , 元素: -1 167 索引值: 13 , 元素: 5 168 索引值: 14 , 元素: -1 169 索引值: 15 , 元素: 2 170 ''' 171 172 # for index,value in enumerate(names): 173 # if index %2 == 0: 174 # names[index] = -1 175 # print(index,value) 176 # 177 # print(names) 178 179 #习题12:names里有3个2,请返回第2个2的索引值,要动态找(提示,找到第一个2的位置,再此基础上在找第2个) 180 181 ''' #这种方法不可取,因为将列表的元素改变了 182 names[names.index(2)] = 'x' 183 print(names.index(2)) 184 185 #由于列表中有相同的元素的时候,只能返回第一个元素的索引,所以这个时候将一个不同的元素替换掉这个相同的元素的时候,就可以返回第二个相同元素的所以 186 #结果:12 187 ''' 188 189 #正确方法: 190 #可以使用切片的方法,当找到第一个元素之后,从第一个元素后面切割出一个新的列表,然后在新的列表中找到第一个元素,然后用第一次找到的元素的索引加上第二次找到的元素的索引在加上1就找到了题目答案 191 192 first_index = names.index(2) 193 new_list = names[first_index+1:] 194 second_index = new_list.index(2) 195 print(first_index+second_index+1) 196 197 #正确答案:12 198 199 200 习题13: 201 # 现有商品列表如下: 202 # products = [['Iphone8',6888],['MacPro',14800],['小米6',2499],['Coffee',31],['Book',80],['Nike Shoes',799]] 203 # 需打印出这样的格式: 204 # 205 # ---------商品列表---------- 206 # 0.Iphone 6888 207 # 1.MacPro 14800 208 # 2.小米6 2499 209 # 3.Coffee 31 210 # 4.Book 80 211 # 5.NIke Shoes 799 212 213 #不规范解答: 214 215 products = [['Iphone8',6888],['MacPro',14800],['小米6',2499],['Coffee',31],['Book',80],['Nike Shoes',799]] 216 217 print("---------商品列表----------") 218 219 for index,value in enumerate (products): 220 print(index,value) 221 222 #结果: 223 ''' 224 ---------商品列表---------- 225 0 ['Iphone8', 6888] 226 1 ['MacPro', 14800] 227 2 ['小米6', 2499] 228 3 ['Coffee', 31] 229 4 ['Book', 80] 230 5 ['Nike Shoes', 799] 231 ''' 232 233 #low方法1: 234 print("---------商品列表----------") 235 for i1,v1 in enumerate (products): 236 print(i1,end=" ") #end="" 表示不换行,在这里表示输出一个索引不换行 237 for i2,v2 in enumerate(v1): 238 print(v2,end= " ") #表示输出值不换行 239 print("") #任意输出一个空的东西也会换行 240 241 #正确结果: 242 ''' 243 ---------商品列表---------- 244 0 Iphone8 6888 245 1 MacPro 14800 246 2 小米6 2499 247 3 Coffee 31 248 4 Book 80 249 5 Nike Shoes 799 250 ''' 251 252 #正确方法2: 253 print("---------商品列表----------") 254 for i3,v3 in enumerate(products): 255 print("%s. %s %s" % (i3,v3[0],v3[1])) #格式化输出 256 257 #正确结果:简单太多 258 ''' 259 ---------商品列表---------- 260 0. Iphone8 6888 261 1. MacPro 14800 262 2. 小米6 2499 263 3. Coffee 31 264 4. Book 80 265 5. Nike Shoes 799 266 ''' 267 268 #习题14:写一个循环,不断的问用户想买什么,用户选择一个商品编号,就把对应的商品添加到购物车里,最终用户输入q退出时,打印购物车里的商品列表 269 270 #方法: 271 exit_flag = False #标志位,控制while循环 272 products = [['Iphone8',6888],['MacPro',14800],['小米6',2499],['Coffee',31],['Book',80],['Nike Shoes',799]] 273 shopping_cart = [] #创建一个空购物车列表 274 275 while not exit_flag: 276 print("---------商品列表----------") 277 for i,v in enumerate(products): 278 print("%s. %s %s" % (i,v[0],v[1])) 279 choice = input("请问您想买什么:") 280 if choice.isdigit(): #isdigit:判断是否为数字 281 choice = int(choice) #将str转换为int 282 if choice >= 0 and choice < len(products): # 判断输入的数值是否超过列表长度 283 print("加入购物车的产品为:%s" % (products[choice])) 284 shopping_cart.append(products[choice]) #将选择的产品加入到购物车中 285 else: 286 print("对不起!您输出的数值有误!") #若输出的数值超过选项的结果 287 elif choice == "q": 288 exit_flag = True #将while的标志位改变,将跳出循环 289 if len(shopping_cart) > 0: #判断购物车是否有产品 290 print("-------您的购物车产品--------") 291 for i,v in enumerate(shopping_cart): 292 print("%s. %s %s" % (i,v[0],v[1])) 293 else: 294 print("对不起!您输出的数值有误!")
十一.拓展作业:
1 # 作业题目: 编写登陆认证程序 2 # 作业需求: 3 # 基础需求: 4 # 让用户输入用户名密码 5 # 认证成功后显示欢迎信息 6 # 输错三次后退出程序 7 # 8 # 升级需求: 9 # 可以支持多个用户登录 (提示,通过列表存多个账户信息) 10 # 用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态(提示:需把用户锁定的状态存到文件里) 11 12 #需要优化的点和不足的地方: 13 #1.当输入的用户名不在列表中的操作 14 #2.根据需求写到哪是哪,没有一个清晰地思路,代码会有很多bug,还有许多未知的需要完善的地方,就是一个字:low 15 16 #low版本: 17 18 user= [['mm','123'],['tt','456'],['MM','789']] 19 count = 0 20 error_count = 0 #错误输入计数初始化 21 22 while count < 3: 23 user_name = input("请输入用户名:") 24 pass_word = input("请输入密码:") 25 26 f = open(file = "用户登录状态文件.txt",mode ='r',encoding="utf-8") 27 data = f.read() 28 if user_name in data: #判断该用户是否被锁定 29 print("对不起!用户%s被锁定!请使用其他用户名登录!" % user_name) 30 else: 31 for i,v in enumerate(user): 32 if user_name == v[0] and pass_word == v[1]: 33 print("欢迎登录!") 34 # count = 3 35 exit() #直接退出程序 36 else: 37 f = open(file = "用户登录状态文件.txt",mode ='a+',encoding="utf-8") 38 error_count += 1 39 if error_count == 9: #每次for循环3次 40 f.write("%s状态:锁定" % user_name) 41 print("您的用户名密码输入有误!") 42 count += 1 43 f.close()
测试结果如下: