习题★★★★★★

敏感词列表 li = [“大大大”, “好黑”, “真大”, “真长”]

将用户输入的内容中的敏感词汇替换成等长度的*(大大大就替换***),并添加到一个列表中;如果用户输入的内容没有敏感词汇,则直接添加到新列表中。

lst=[]
while True:
	strvar = input('请输入您的内容')
	#按Q退出
	if strvar.upper()=='Q':
		print(lst)
		break
	for i in li:
		#寻找敏感词汇
		if i in strvar:
			strvar=strvar.replace(i,'*'*len(i))
	lst.append(strvar)

循环打印列表中的每个元素,并转化为小写,遇到列表则再循环打印出它里面的元素。

for i in li :
	# 判断是否是字符串
	if isinstance(i,str):
		print(i.lower())
		# 判断是不是列表
	# elif isinstance(i,(list,tuple)):
	elif type(i) == list:
		for j in i :
			if isinstance(j,str):
				print(j.lower())
			else:
				print(j)
	# 其他情况正常打印
	else:
		print(i)

将字符串strvar="k:1|k1:2|k2:3|k3:4"处理成字典{‘k’:1,‘k1’:2,‘k2’:3,‘k3’:4}

lst = strvar.split("|")
print(lst)
dic = {}
for i in lst:
	# print(i.split(":"))
	k,v = i.split(":")
	print(k,v)
	dic[k] = int(v)
print(dic)

li= [11,22,33,44,55,66,77,88,99,90],

将大于 66 的值保存至字典的k1键中,

将小于 66 的值保存至字典的k2键中。

# 即: {‘k1’: 大于66的所有值列表, ‘k2’: 小于66的所有值列表}

li= [11,22,33,44,55,66,77,88,99,90]
dic = {"k1":[] , "k2":[]}
for i in li:
	if i > 66:
		dic["k1"].append(i)
	elif i < 66:
		dic["k2"].append(i)
print(dic)

文件a.txt内容:每一行内容分别为商品名字,价钱,个数。

apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
变成如下数据格式,并计算出总价格
[
{'name':'apple','price':10,'amount':3},
{'name':'tesla','price':1000000,'amount':1}
] 

lst_total = []
money_count = 0
with open("a3.txt",mode="r+",encoding="utf-8") as fp:
	# 把数据读取到列表
	lst = fp.readlines()
	print(lst)
	# 循环列表数据
	for i in lst:
		dic = {}
		# 得到的字符串按照空格分隔=>列表
		lst2 = i.strip().split()
		# print(lst2) # ['apple', '10', '3']
		# 为字典添加键值对
		dic["name"] = lst2[0]   # 名字
		dic["price"] = int(lst2[1])  # 价格
		dic["amount"] = int(lst2[2]) # 数量
		# 将新子典插入到列表中
		lst_total.append(dic)
	
	# 计算总价格 = 单价 * 数量 = 当前商品总价
	money_count += dic["price"] * dic["amount"]
	 打印列表	
print(lst_total)
print(money_count)

定义函数:参数为容器类型数据,打印所有奇数位索引对应的元素

def func(lst):
	# 方法一
	# return lst[1::2]
	
	# 方法二 
	for i in range(1,len(lst),2):
	print(lst[i])
	
#lst = ["a","b","c","d"]
func(lst)
print(func(lst))

定义函数: ,接收一个参数(可迭代性数据) ,用_让元素相连成字符串 ,打印出来

def func(container):
	for i in range(len(lst)):
		# 直接把强转的字符串赋值给原来的位置
		lst[i] = str(lst[i])
	print(lst)
	return "_".join(lst)
lst = [ 1 ,2 ,3 ,4 ,5 ,6]
res = func(lst)
print(res)

接受任意参数,打印其中最小值

方法一

def func(*args):
	print(args)
	lst = list(args)
	lst.sort()
	return lst[0]
print(  func(1,2,3,-100,99,-200) )

方法二 可以传递一级容器,但是不限定数据类型

def func(*args):
	lst_new = []
	# print(args)
	for i in args:
		# 判断是整型或者浮点型
		if isinstance(i,(int , float)):
			lst_new.append(i)
	
		elif isinstance(i , (list,tuple,set,dict)):
			# 判断类型如果是字典
			if isinstance(i, dict):
				i = i.values()
			
			# 循环检测是不是整型或者小数
			for j in  i:
				if isinstance(j,(int , float)):
					lst_new.append(j)
	lst_new.sort()		
	return lst_new[0]
lst = func(1,2,3,6.7,"abc","啊你",[11,12,13],{"100",200},(100,-100),	{"a":-300,"b":-600})
print(lst)

写函数,用户传入要修改的文件名,与要修改的内容,执行函数,修改操作

方法一

def func(filename,str1,str2):
		# 读出来
	with open(filename,mode="r+",encoding="utf-8") as fp:
		strvar = fp.read()
	
		# 替换完写进去
	with open(filename,mode="w+",encoding="utf-8") as fp:
	# 替换字符串
	strvar = strvar.replace(str1,str2)
	# 写进去
	fp.write(strvar)
	
# print(strvar)
func("ceshi.txt","你好","你不好")

方法二

def func(filename,str1,str2):
	with open(filename,mode="r+",encoding="utf-8") as fp:
		strvar = fp.read()
		strvar = strvar.replace("你不好","你好")
		# 把光标移动到开头
		fp.seek(0)
		# 截取0个字节 <==> 清空文件
		fp.truncate()
		fp.write(strvar)
func("ceshi.txt","你不好","你好")

写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数

方法一

def func(strvar):
		if isinstance(strvar,str):
			dic = {"num":0,"word":0,"space":0,"other":0}
			for i in strvar:
			print(i)
				if i.isdecimal():
					dic["num"] += 1
				elif i.isalpha():
					dic["word"] += 1
				elif i.isspace():
					dic["space"] += 1
				else:
					dic["other"] += 1
			return dic
res = func("sjfksP你好jdkf 23 34&**(&*")
print(res)

方法二

def func(strvar):
	if isinstance(strvar,str):
		dic = {"num":0,"word":0,"space":0,"other":0}
		for i in strvar:
			print(i)
			if i in "0123456789":
				dic["num"] += 1
			elif i.lower() in "abcdefghijklmnopqrstuvwxyz":
				dic["word"] += 1
			elif i == " ":
				dic["space"] += 1
			else:
				dic["other"] += 1
		return dic
res = func("ABC-1你好jdkf 23 34&**(&*")
print(res)

写函数,检查字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,返回处理后的结果.

#例:参数为:dic = {"k1": "v1v1", "k2": [11,22,33,44]}

def func(dic):
	lst = []
	if isinstance(dic,dict):
		val = dic.values()
		for i in val:
			print(i)
			if isinstance(i,(str,list,tuple)):
				lst.append(i[:2])
			
	return lst
dic = {"k1": "v1v1", "k2": [11,22,33,44],"k3":123}	
lst = func(dic)
print(lst)

传入多个容器类型数据,计算所有元素的个数

def func(*args):
	total = 0 
	for i in args:
		total += len(i)
	return total
res = func((1,2,3),[4,5,6],{7,8,9},"abc",{"a":1,"b":2})
print(res)

可滑动的序列 自定义一个函数 根据参数n的值,变成对应个元素的容器 (zip)

listvar = [1,2,3,4,5,6,7,8,9]
n = 2
listvar = [[1,2],[3,4],[5,6],[7,8]]
n = 3
listvar = [[1,2,3],[4,5,6],[7,8,9]]
n = 4
listvar = [[1,2,3,4],[5,6,7,8]]

n = 2
lst1 = [1,3,5,7,9]
lst2 = [2,4,6,8]

切片

lst1 = lst[0::2] 
lst2 = lst[1::2]
it = zip(lst1,lst2)
print(list(it))

n = 3
lst1 = [1,4,7]
lst2 = [2,5,8]]
lst3 = [3,6,9]

切片

lst[0::3] 
lst[1::3]
lst[2::3]
it = zip(lst1,lst2,lst3)
print(list(it))

n = 4
lst1 = [1,5,9]
lst2 = [2,6]
lst3 = [3,7]
lst4 = [4,8]

切片

lst1 = lst[0::4] 
lst2 = lst[1::4]
lst3 = lst[2::4]
lst4 = lst[3::4]
it = zip(lst1,lst2,lst3,lst4)
print(list(it))

lst = [1,2,3,4,5,6,7,8,9]
n = 2
print([lst[i::n] for i in range(n)])
n = 3
print([lst[i::n] for i in range(n)])
n = 4
print([lst[i::n] for i in range(n)])

 [   [1, 5, 9], [2, 6], [3, 7], [4, 8]   ]
 列表推导式 => 截取出对应的几个列表 
 [  lst[i::n]  for i in range(n)  ]
 将列表中的元素进行解包,通过参数一个一个传递;
 *[  lst[i::n]  for i in range(n)  ]
it = zip(*[lst[i::n] for i in range(n)])
print(list(it))

 *号在函数的调用处用来解包.
def func(a,b,c):
	print(a,b,c)
lst = [1,2,3]
func(*lst)
 最终答案
lst = [1,2,3,4,5,6,7,8,9]
def func(n):
	return zip(*[lst[i::n] for i in range(n)])

print("<====>")
lst = [1,2,3,4,5,6,7,8,9]
func = lambda n : zip(*[lst[i::n] for i in range(n)])
it = func(4)
print(list(  map(list,it)  ))

青蛙跳台阶

一只青蛙要跳上n层高的台阶
一次能跳一级,也可以跳两级
请问这只青蛙有多少种跳上这个n层高台阶的方法?

"""
n = 1   =>  1: 1
n = 2   =>  2: 1 1 | 2
n = 3   =>  3: 1 1 1 | 1 2 | 2 1 
n = 4   =>  5: 1 1 1 1 | 1 1 2 | 1 2 1 | 2 1 1 | 2 2
n = 5   =>  8: 1 1 1 1 1 | 1 1 1 2 | 1 1 2 1 | 1 2 1 1 | 2 1 1 1 | 2 2 1 | 2 1 	2 | 1 2 2 
1 2 3 5 8 类似于斐波那契;
"""
def fib(n):
	if n == 1 or n == 2:
		return n
	return fib(n-1) + fib(n-2)
print(fib(2))

2.递归反转字符串 “将14235 反转成53241”

strvar = "12345"
length = len(strvar)
print(length)

 函数的定义
def func(lth,lst = []):
	# 如果字符串总长度为0,代表所有数据装载完毕,返回列表
	if lth == 0 :
		return lst
	
	# 取字符串最后一个元素
	res = strvar[lth-1]
	# 塞新的列表里
	lst.append(res)
	# 携带着新的列表,进入到下一个函数空间存值;
	 return func(lth-1,lst)
	函数的调用
"""length <=> lth 一一对应 , lst实参没传,使用默认列表"""
lst = func(length)
res = ''.join(lst)
print(res, type(res))

让用户输入输入内容 且机会只有3次

方法一
num = 66
times = 1
while times <= 3:
	n = input("请输入数字:")
	if n.isdecimal():	
		n = int(n)
		if n > 66:
			print("猜测的结果大了")
		elif n < 66:
			print("猜测的结果小了")
		else:
			print("猜对了 ok")
			break
	else:
		print("这不是一个数字")

	if times == 3:
		print("都没猜对,继续努力")
	times +=1 
方法二
num = 66
flag = True
times = 1
while flag:
	n = input("请输入数字:")
	if n.isdecimal():	
		n = int(n)
		if n > 66:
			print("猜测的结果大了")
		elif n < 66:
			print("猜测的结果小了")
		else:
			print("猜对了 ok")
			break
	else:
		print("这不是一个数字")

	if times == 3:
		print("都没猜对,继续努力")
		flag = False
	times +=1 

打印菱形小星星

	 *
	***
   *****
  *******
 *********
***********
***********
 *********
  *******
   *****
    ***
     *

13 => 7
11 => 6
9  => 5
7  => 4

对于任意个星星n,一共是多少行?
hang = n // 2 + 1


1 => 5
2 => 4
3 => 3
4 => 2
5 => 1
对于当前行i,有多少个空格
kongge = hang - i


1 => 1
2 => 3
3 => 5
4 => 7
5 => 9
对于当前行i,有多少个星星
xingxing = i*2 - 1

方法一

n = 11
hang = n // 2 + 1
i = 1
while i <= hang:

	# 遍历空格
	kongge = hang - i
	print(" " * kongge,end="")	

	# 遍历星星
	xingxing = i*2 - 1
	print("*" * xingxing , end="")

	# 打印换行
	print()

	i+=1
	
 把星星到过来 (倒序)
i = hang
while i>0:

	# 遍历空格
	kongge = hang - i
	print(" " * kongge,end="")	

	# 遍历星星
	xingxing = i*2 - 1
	print("*" * xingxing , end="")

	# 打印换行
	print()

	i-=1

方法二

n = 11
hang = n // 2 + 1
i = 1
while i <= hang:

	# 遍历空格
	kongge = hang - i
	# print(" " * kongge,end="")	
	while kongge > 0:
		print(" ",end="")
		kongge -= 1	
	

	# 遍历星星
	# xingxing = i*2 - 1
	# print("*" * xingxing , end="")	
	xingxing = 1
	while xingxing <= i*2 - 1:
		print("*",end="")
		xingxing += 1

	# 打印换行
	print()	
	i+=1

i = hang
while i > 0:
	kongge = hang-i
	# 遍历空格
	while kongge > 0:
		print(" ",end="")
		kongge -= 1

	# 遍历星星
	xingxing = 1
	while xingxing <= i*2 - 1:
		print("*",end="")
		xingxing += 1

	# 打印换行
	print()

	i-=1

方法三 (for循环的)

n = 11
hang = n // 2 + 1
for i in range(1,hang+1):	
	kongge = hang - i
	xingxing = i*2 - 1	
	# 打印空格
	print(" " * kongge,end="")
	# 打印星星
	print("*" * xingxing)


for i in range(hang,0,-1):	
	kongge = hang - i
	xingxing = i*2 - 1	
	# 打印空格
	print(" " * kongge,end="")
	# 打印星星
	print("*" * xingxing)

找出敏感词汇

 通用写法
while True:
	sign = False
	strvar = input("请输入字符串:")
	lst = ["粉嫩","铁锤"]
	# 找字符串中是否含有敏感词汇.
	for i in lst:
		if i in strvar:
			# 设置sign这个标记为True 代表敏感词汇
			sign = True
			print("有敏感词汇")
	# 如果没有被标记成True ,代表可以使用
	if sign == False:
		print("可以使用")

python特有
 基本语法
#for ... else 
遇到break 终止了循环, else分支的代码块内容不执行
for i in range(3):
	print(i)
if i == 2:
	break
else:
	print("ok")


while True:
	strvar = input("请输入字符串:")
	lst = ["粉嫩","铁锤"]
	# 找字符串中是否含有敏感词汇.
	for i in lst:
		if i in strvar:			
			print("有敏感词汇")
			break
	else:
		print("可以使用")

登录小程序

账户密码会预先记录在文件中
输入账号密码:如果都正确,登录成功
如果用户登录时进行三次校验,都不对,记录黑名单文件中
如果是黑名单的用户,禁止下次再次登录

思路:首先要设置账户和密码还有黑名单空列表,先输入你的账户,打开文件,把账户和密码添加到新的列表中,判断账户是否存在,存在就打开黑名单,把黑名单放到新的列表中,判断是否在黑名单,没有在,就开始循环,输入密码(密码的索引和账户索引一样),循环3次,密码错误要打开黑名单写进去

存放账户
accountlist = []
存放密码
pwdlist = []
存放黑名单用户
blacklist = []

sign = True
while sign:
	username = input("请输入您的用户名:")
	print(username)

	# 1.获取用户密码等数据
	with open("user.txt",mode="a+",encoding="utf-8") as fp:
		fp.seek(0)
		lst = fp.readlines()
		# print(lst) # ['ceshi1:111\n', 'ceshi2:222\n', 'ceshi3:333']
	
		# 提取文件里面的账户和密码
		for i in lst:
			account , pwd = i.strip().split(":")
			# print(account , pwd)
			accountlist.append(account)
			pwdlist.append(pwd)
		
	print(accountlist)
	print(pwdlist)


	# 2.判定是否存在该用户
	if username in accountlist:


		# 3.判断是不是黑用户
		with open("black.txt",mode="a+",encoding="utf-8") as fp:
			fp.seek(0)
			lst = fp.readlines()
			for i in lst:
				# print(i)
				blacklist.append(i.strip())
		print(blacklist)
	
	
		if username in blacklist:
			print("抱歉,您的账户被冻结...")
		else:
			# 允许用户输入账号 密码:
			num = accountlist.index(username)
			print(num) # pwdlist[num] 是username 对应的密码
		
			# 检查输入的次数为三次
			times = 0
			while times < 3: # 0 1 2
		
				pwd = input("请输入您的密码:")
				if pwd ==  pwdlist[num]:
					# 如果都正确,程序结束.
					print("恭喜你~ 登录成功~")
					sign = False
					break
				else:
					# 剩余次数 = 总次数 - 当前次数
					print("密码输入错误,你还剩下%s次机会" % (2-times))
					if times == 2:
						print("因为密码错了三次,您的账户被冻结...")
						# 记录黑名单文件中
						with open("black.txt",mode="a+",encoding="utf-8") as fp:
							res = username + "\n"
							fp.write(res)
					
				times += 1
		
	else:
		print("该用户根本不存在")

构建如下列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]

lst =  [ (i,i+1) for i in range(6) ]
print(lst)

把M中3,6,9组成新列表

M = [[1,2,3],[4,5,6],[7,8,9]]
lst = [j for i in M for j in i if i.index(j) == 2]
print(lst)

lst = [i[-1] for i in M ]
print(lst)

用推导式写如下程序

lst1 = {
		'name':'alex',
		'Values':[
			{'timestamp': 1517991992.94,'values':100,},			 
			{'timestamp': 1517992000.94,'values': 200,},			
			{'timestamp': 1517992014.94,'values': 300,},			 
			{'timestamp': 1517992744.94,'values': 350},			 
			{'timestamp': 1517992800.94,'values': 280}			 
		]
	}

将lst1 转化成如下lst2:

lst2 = [
	[1517991992.94, 100], 
	[1517992000.94, 200], 
	[1517992014.94, 300], 
	[1517992744.94, 350], 
	[1517992800.94, 280]
]
lst = [ [i["timestamp"],i["values"]] for i in lst1["Values"] ]
print(lst)
或
lst2 = [[i for i in j.values()] for j in lst1["Values"]]
print ( lst2 )

读取一个文件所有内容,通过生成器调用一次获取一行数据.

'''文件对象是迭代器'''
def readfile():
	with open("ceshi.txt",mode="r+",encoding="utf-8") as fp:		
		for i in fp:
			# 一次读取一行
			# print(i)
			yield i
	
gen = readfile()
res = next(gen)
res = next(gen)
print(res)

注册

 (1)检测两次密码如果相同,确认注册成功
 (2)检测两次密码如果不同,提示两次密码不一致
 (3)用户名不能重复
思路;先打开文件,把账户放到新的列表当中.请注册账户,判断账户是否有非法字符,以及账户是否存在,然后输入注册密码,第二次跑循环,在判断两次密码是否正确.
用来 存放所有账户的列表 accountlist
accountlist = []
sign = True
with open("user.txt",mode="a+",encoding="utf-8") as fp:
		while sign:
			username = input("请输入要注册的用户名:")
		
			if ' ' in username or username == '':
				print("对不起,改名字含有非法字符")
			else:
				# 不能含有重复的用户名
				fp.seek(0)
				lst = fp.readlines()
				for i in lst:
					k = i.strip().split(":")[0]
					accountlist.append(k)
				print(accountlist)
			
				# 如果用户名在这个accountlist中,说明该用户注册过了
				if username in accountlist:
					print("该用户已经存在")
				else:
					# 允许用户注册 , 提示输入密码
					pwd = input("请输入您的密码")
					while True:
						pwd2 = input("请确认您的密码")
						if pwd == pwd2:
							print("恭喜你,注册成功~")
							strvar = username + ":" + pwd + "\n"
							fp.write(strvar)
							sign = False
							break
						elif pwd2.upper() == "Q":
							break
						else:
							print("你两次不一致")

匹配整数或者小数(包括正数和负数)

[+-]?\d+(\.\d+)?

匹配年月日日期 格式 2018-12-31

01 02 03 4 5 6 7 8 9 10 11 12  1 2 3  11 12 13 21 22 23 30 31
([1-9]\d{3})-(0?[1-9]|1[0-2])-(0?[1-9]|1[0-9]|2[0-9]|3[01])
([1-9]\d{3})-(0?[1-9]|1[0-2])-(0?[1-9]|[12]\d|3[01])

11位的电话号码

^1[3-9]\d{9}$

匹配邮箱地址 邮箱规则 123463922@qq.com 123@abc.com.cn

@之前必须有内容且只能是字母,数字,下划线(_),减号(-),点(.)
[\w\-\.]+
 @符号后面是字母,数字,减号(-),保留121@qq.com.cn 的可能
@[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]+)?
最后一个点(.)之后必须有内容,字母,数字且长度为大于等于2个字节,小于等于6个字节
\.[a-zA-Z0-9\-]{2,6}

[\w\-\.]+@[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]+)?\.[a-zA-Z0-9\-]{2,6}				

'1-2*((60-30+(-40/5)(9-25/3+7/399/42998+10568/14))-(-43)/(16-3*2))'从上面算式中匹配出最内层小括号以及小括号内的表达式

import re
strvar = '1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'
obj = re.search("\([^()]+\)",strvar)
print(obj.group())
已经不能再表达是括号的情况下才是最里层,再也没括号

正则小程序:给你字符串 ‘1-2*((60-30+(-40/5)(9-25/3+7/399/42998+10568/14))-(-43)/(16-3*2))’ 计算最后结果.

思路:先要去掉空格,然后去括号,在操作计算,去完第一个括号,要去操作计算第一个括号里面的乘除加减,然后返回到去括号的函数中,返回一个字符串,通过主函数的调用操作计算函数可得结果
import re
strvar = "1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))" # 2776672.6952380957
处理符号
def sign_exp(strvar):
	strvar = strvar.replace("+-","-")
	strvar = strvar.replace("--","+")
	strvar = strvar.replace("-+","-")
	strvar = strvar.replace("++","+")
	return strvar
计算表达式		 
def calc_exp(strvar):
	# 判断字符串是 乘法 还是 除法
	if "*" in strvar:
		a,b = strvar.split("*")
		return float(a) * float(b)
	
	if "/" in strvar:
		a,b = strvar.split("/")
		return float(a) / float(b)
操作表达式
def opreate_exp(strvar):
	# 先算乘除
	while True:
		# (40+5*-2+3/2)
		# 匹配 [谁*谁]  或者 [谁/谁]  例: 5*-2 3/2
		obj = re.search(r"\d+(\.\d+)?[*/][+-]?\d+(\.\d+)?",strvar)
		if obj:
			res1 = obj.group()
			# print(res1) # 5*-2
			# 计算表达式的结果
			res2 = calc_exp(res1)
			# print(res2 , type(res2)) # -10.0 <class 'float'>
			# 将所得的结果,替换到原来的字符串当中,以匹配下一个乘法或者除法
			strvar = strvar.replace(res1,str(res2))
			# print(strvar) # (40+-10.0+3/2)
		else:
			# 当obj 返回None的时候停止
			break
		
	# 处理表达式中的符号
	strvar = sign_exp(strvar)
	# print(strvar) # (40+-10.0+1.5)  (40-10.0+1.5)

	# 计算剩下+-的表达式(将每一个数字匹配出来,做累加)
	lst = re.findall("[+-]?\d+(?:\.\d+)?",strvar)
	# print(lst) # ['40', '-10.0', '+1.5']
	total = 0
	for i in lst:
		total += float(i)
	# print(total) # 31.5
	return total
移除括号
def remove_bracket(strvar):
	while True:
		obj = re.search("\([^()]+\)",strvar)
		# print(obj)
		if obj:
			res1 = obj.group()
			# print(res1) # (40+5*-2+3/2)   "-30+(40+5*-2+3/2)*8 +(4-7)"
			# 计算一个括号里面表达式的值
			res2 = opreate_exp(res1)
			# print(res2) # 31.5
			# 替换原来的括号,消除括号
			strvar = strvar.replace(res1,str(res2))
			# print(strvar) # -30+31.5*8+(4-7)
		else:
			return strvar # 返回一串没有括号的表达式
main函数当中不写逻辑,只调用相关的功能
def main(strvar):
	# 1.整理数据,把没用的空格去掉
	strvar = strvar.replace(" ","")
	# 2.移除所有括号
	strvar = remove_bracket(strvar)
	# print(strvar) # -30+31.5*8+-3.0
	# 3.计算表达式
	return opreate_exp(strvar)

res = main(strvar)
print(res) # 219.0

自己创建类,实例化对象,在终端输出:

小明 ,10岁,男,上山去砍柴
小明 ,10岁,男,开车去东北
小明 ,10岁,男,最爱大保健

小明 ,10岁,男,上山去砍柴
小明 ,10岁,男,开车去东北
小明 ,10岁,男,最爱大保健

class Person():
	def __init__(self,name,age,sex):
		self.name = name
		self.age = age
		self.sex = sex
	
	def print_str(self):
		strvar = """
{0},{1}岁,{2},上山去砍柴
{0},{1}岁,{2},开车去东北
{0},{1}岁,{2},最爱大保健
		"""
print(strvar.format(self.name,self.age,self.sex))
p1 = Person("小明",10,"男")
p1.print_str()
p2 = Person("刘伟",78,"男")
p2.print_str()

创建一个lol类,构造方法中给对象name,ad(攻击力),hp(血量),三个属性,通过ATTACK方法,接收两个对象,要完成谁攻击谁,掉了多少血,还是多少血的提示

对象变化用init
class Game_role():
	def __init__(self,name,ad,hp):
		self.name = name
		self.ad = ad 
		self.hp = hp

	def attack(self,obj):
		obj.hp -= self.ad
		strvar = "{}攻击{},{}掉了{}血,  还剩{}血"
		print(strvar.format(self.name,obj.name,obj.name,self.ad,obj.hp))


p1 = Game_role("盖伦",10,100)
p2 = Game_role("剑豪",20,80)
p1.attack(p2)

定义一个圆形类,求周长和面积,圆的半径通过参数给初始化

import math

class Circle():

	def __init__(self,r):
		self.r = r
	
	def zhouchang(self):
		return 2 * math.pi * self.r
	
	def mianji(self):
		return math.pi * pow(self.r,2)

obj = Circle(5)
print(obj.zhouchang())
print(obj.mianji())

创建AB两个类,A类中有属性abc=5把A类的对象存储在B类对象的成员属性pty中,用B类对象调用出abc这个值.

class A():
	abc = 51

class B():
	def __init__(self,obj):
		self.pty = obj
	
obj1 = A()
obj2 = B(obj1)
print(obj1.abc) # 51
print(obj2.pty) # <__main__.A object at 0x0000024771ACE828>
print(obj2.pty.abc)
或
class A():
abc=58
obj=A()
class  B():
	pty=obj
obj1=B()
print(obj1.pty.abc)

读程序写结果.(不执行)

#在类内可以创建对象的私有成员,但是没什么太大意义
class JustCounter:
	__secretCount = 0
	def count(self):
		print(self.__secretCount) # 获取
		self.__secretCount += 1
		"""★★★★★
		self.__secretCount = self.__secretCount + 1
		self.__secretCount = 0 + 1 = 1
		self.__secretCount = 1 为当前对象添加私有成员__secretCount 值为1
		为对象的私有属性赋值,添加一个私有成员,不是类的,因为是self点私有属性
		"""

	def count3():
		print(JustCounter.__secretCount) 
		JustCounter.__secretCount += 1
		print(JustCounter.__secretCount)

class Bars(JustCounter):
	def count2(self):
		print(self.__secretCount)
情况一

 counter1 = JustCounter()
 counter1.count() # 0  第一次是获取私有成员★★★★★
 counter1.count() # 1	第二次是为对象创建一个私有成员,第二次打印的是对象在类内创建的私有成员,不是类的私有成员★★★★★
 JustCounter.count3()  # 0 1  类调用类的私有成员
情况二
counter2 = Bars()
counter2.count() # 1
counter2.count() # 2
情况三
JustCounter.count3() # 0 1

连贯操作

#通过点( . )不断的调用下一个对象的操作就是连贯操作
class my1():
	def func1(self):
		print('我是my1')
class my2():
	def __init__(self,obj):
		self.pty1=obj
class my3():
	def __init__(self, obj):
		self.pty2 = obj
obj1=my1()
obj2=my2(obj1)
obj3=my3(obj2)
obj3.pty2.pty1.func1()==>我是my1

小人射击★★★★★

用面向对象的思维完成该程序,要求:
1:子弹可以装载到弹夹中
2:弹夹可以装载到枪支中
3:人具有拿枪射击的功能,也可以换子弹
#面向对象的思维,一个类一个文件,把所有类的文件放到一个文件夹中,然后在同级创建一个主文件(main),然后用主文件(main)统一调用,main只负责调用
#面向对象的核心思想:把对象作为程序的最小单元,让对象操作一切★★★★★

第一步 先想一下总体步骤(思路)

'''
弹夹类:BulletBox
属性:子弹数量可以增加  bulletcount
方法: 无

枪类 Gun
属性: 可以装载弹夹(对象)
方法: 用来射击shoot

人类 Person
属性: 拿枪(对象)
方法: 拿枪射击shoot  换子弹
'''

第二步 创建一个文件夹,在文件夹中创建3个类文件

#弹夹类 BulletBox
class BulletBox():
	def __init__(self,bulletcount):
		self.bulletcount=bulletcount
#枪支类 Gun
class Gun():
	def __init__(self,BulletBox):
		self.BulletBox=BulletBox
	def shoot(self,shootcount):
		#通过self调用自己的BulletBox属性得到一个弹夹对象,在通过弹夹对象.bulletcount属性得到子弹的一个数量
		if self.BulletBox.bulletcount <= shootcount:
			print('对不起,子弹数量不够,请先上子弹')
		else:
			#开始射击
			#剩余子弹=总数量-已经射出的数量
			self.BulletBox.bulletcount -= shootcount
			print('哒'*shootcount,'还剩下{}颗子弹'.format(self.BulletBox.bulletcount))
#人类 Person
class Person():
	def __init__(self,Gun):
		self.Gun=Gun
	#射击
	def shoot(self,shootcount):
		self.Gun.shoot(shootcount)
	#上子弹
	def addcount(self,num):
		self.Gun.BulletBox.bulletcount  +=num
		#self.Gun==>枪对象
		#self.Gun.BulletBox==>弹夹对象
		#self.Gun.BulletBox.bulletcount==>子弹数量

第三步 在文件夹同级创建一个主文件,导入文件夹中的类(具体到文件夹中文件里面的类),统一调用

from package.BulletBox  import BulletBox
from package.Gun  import Gun
from package.Person  import Person

#先创建一个弹夹
danjia=BulletBox(20)
#在创建一杆枪
jiatel=Gun(danjia)
#在创建一个人
xboy=Person(jiatel)

#防止文件当成模块导入其他文件
#小人射击
if __name__=='__main__':
	xboy.shoot(1)
	xboy.addcount(100)
	xboy.shoot(80)

### 购物车

import json
import time
money = 0
goods_lst = []
定义一个购物车字典
car = {} 
"""
car = {
1:{电脑... }
2:{鼠标...}
	}
"""


with open("shopping_data.json" , mode="r+",encoding="utf-8") as fp:
	for i in fp:	
		dic = json.loads(i)
		goods_lst.append(dic)
	print(goods_lst)
"""

[
	0:{'name': '电脑', 'price': 1999}, 1
	1:{'name': '鼠标', 'price': 10,"account":2},   2
	2:{'name': '游艇', 'price': 20},   3
	3:{'name': '美女', 'price': 998},  4 
	4:{'name': '风油精', 'price': 30}  5
]
"""

def progress(percent):
	if percent > 1:
		percent = 1
	strvar = int(50 * percent) * "#"
	print("\r[%-50s] %d%%" % (strvar , int(100 * percent)) ,end="")

def exe_progress():
	recv_size = 0
	# 假设文件总大小是 1028000
	total_size = 1028000
	while recv_size < total_size:
		time.sleep(0.01)

		# 一次接受的字节数是1024
		recv_size += 6000
		percent = recv_size/total_size
		progress(percent)
充值
def recharge():
	global money

	while True:
		num = input("请充值吧,大哥")
		if num.isdecimal():
			money = int(num)
			print("恭喜你~ 充值成功{}元人民币".format(money))
			print(money)
			break
		else:
			print("充值失败,非数字.")
加载
def loading():
	print("加载商品中 ... ")
	exe_progress()
	print()
展示
def show_goods():
	strvar = "{}".format("商品名称").center(18)
	print("序号" + strvar + "价格")
	# 打印对应的商品

	for k,v in enumerate(goods_lst,start=1):
		# print(k,v)
		v['num'] = k
		strvar = "{v[num]:<10}{v[name]:<12}{v[price]}".format(v=v)
		print(strvar)
	
	
def error():
	strvar = """
**************************************************
*           您输入的选项不存在 , 请重新输入          *
**************************************************	
"""
	print(strvar)
	time.sleep(1)


def add_car(num):
	if num not in car:
		car[num] = {
		"name": goods_lst[num-1]["name"],
		"price": goods_lst[num-1]["price"],
		"account": 1
		}
	else:
		car[num]["account"] += 1

	print(car)
	"""
	{
		序号: 商品描述(字典形式展现)
		2: {'name': '鼠标', 'price': 10, 'account': 1}, 
		3: {'name': '游艇', 'price': 20, 'account': 1}
	}
	"""

def show_car(num):
	print("*" * 50 )
	print("您选择的商品具体信息:")
	print("*-商品名称:{}".format(car[num]["name"]))
	print("*-商品单价:{}".format(car[num]["price"]))
	print("*-商品数量:{}".format(car[num]["account"]))
	print("已成功添加到购物车~ 请继续shopping ~")
	print("*" * 50 )


def balance():
	total = 0 
	print("[-------------------您购物车的具体商品如下:-------------------]")
	for k,v in car.items():
		print(k,v)
		v["num"] = k
		# 计算当前商品总价格
		v["total"] = v["price"] * v["account"]
		# 计算所有商品总价格
		total += v["total"]
		strvar = "序号{v[num]}: 商品名称:{v[name]} 商品单价:{v[price]} 商品数量:{v[account]} 此商品总价:{v[total]}".format(v=v)
	print(strvar)
	
	return total


def success(total,money):
	print("正在结算数据中 ... ")
	exe_progress()
	print("\n请稍后...")
	time.sleep(1)	

	print("[一共:{}元]".format(total))
	print("[您已经成功购买以上所有商品 , 余额还剩{}元,感谢您下次光临~]".format(money-total))

def del_goods(total,money):
	print("余额不足,还差{}元,请忍痛割爱,删除某些商品".format(total-money))
	num = input("[-------------------请输入要删除的商品序号:-------------------]")
	# 判断是不是纯数字
	if num.isdecimal():
		# 变成数字类型
		num = int(num)
		# 判断该商品在不在购物车当中
		if num in car:
			# 数量-1
			car[num]["account"] -= 1
			# 如果数量变成了0,意味着从购物车中删除该商品
			if not car[num]["account"]:
				car.pop(num)
		else:
			error()
	else:
		error()

def myexit():
	print("[============== 欢迎下次光临: ==============]")
	time.sleep(1)
主文件调用
def main():
	# 1.充值
	recharge()
	# 2.加载中
	# loading()
	# 3.展示商品
	show_goods()
	# 4.开始购物
	sign = True
	while sign:
		num = input("请输入您要购买的商品:")
		# 购物
		if num.isdecimal():
			num = int(num)
			if num <= len(goods_lst):
				# 添加购物车
				add_car(num)
				# 展示购物车
				show_car(num)
			else:
			error()
			
		# 结算
		elif num.upper() == "N":
		
			while True:
				# 结算总价格
				total = balance()
				# print(total,money) # 10 0
				# 判断总价格超过实际充值,提示用户删除商品
				if total > money:
					# 删除商品
					del_goods(total,money)
				else:
					# 成功购买
					success(total,money)
					sign = False
					break
		
		
			# while True:
				# 开始计算
				# total = balance()
				# if 结算的价格 > 充值的钱:
					# 删除商品操作
				# else:
					# 展现购买成功的信息
					# break
			
		# 退出		
		elif num.upper() == "Q":
			myexit()
			sign = False
		else:
			# 报错
			error()



main()

求res是多少?

题:
def func():
	return [lambda x : i*x    for i in range(4)]
res = [m(2) for m in func()]

思路:[lambda x : i*x    for i in range(4)]

1.里面放了个匿名函数 错误
  [  lambda表达式(匿名函数)  ]
 lambda 参数 : 返回值   
"""这个写法是错误的,因为返回值没有加[]{}()括号,不是推导式"""
func = lambda  x : i*x  for i in range(4)
func(3) # SyntaxError: invalid syntax


2.是列表推导式,里面放了4个函数
[ lambda x : i*x  , lambda x : i*x   , lambda x : i*x   , lambda x : i*x   ]
转换为:
lst = []
def func():
	for i in range(4):
		def ceshi(x):
			return i*x
		lst.append(ceshi)
	return lst
lst = func()
print(lst)

res = [m(2) for m in func()]
将返回的内函数遍历
def ceshi(x):
	return i*x
[ceshi(2),ceshi(2),ceshi(2),ceshi(2)]

[return 2*i , return 2*i , return 2*i , return 2*i]
[2*3,2*3,2*3,2*6] => [6,6,6,6] 
在这个环节开始调用函数.才去执行其中的代码块,里面需要i,那么就回去找i,i已经遍历4次,再回去找的时候是最后一个i,但是此刻的i已经是3了,因为闭包的原因保留了i=3这个值,所有得到的值是3,所以拿出2*3想乘,最后是4个6


思维误区:
函数的定义处
"""
函数在定义时,其中的代码是不执行的,
只有在函数调用的时候,其中的代码块才执行.
"""
for i in range(4):
	# 函数的定义处
	def func():
		return 6
函数的调用处才会执行代码块

打印结果是多少?

题:
普通函数
def add(a,b):                     
   return a + b
   
生成器函数
def test():                       
  for r in range(4): 
  	  yield r
g=test() # g的范围: 0 1 2 3 

for n in [2,10]:
	# 定义2个生成器
	g=(add(n,i) for i in g)
	
调用
print(list(g))
print(n) # n = 10  ==>当回来再去取n值得时候是最后一个

思路:
第二次循环的时候,要拿着第一次定义的这个g使用,
g=(add(n,i) for i in g) # 第一层 i 分别得到 0 1 2 3 , n = 10  add(10,0) return a + b => (10,11,12,13)  新的生成器g的范围 10 11 12 13
g=(add(n,i) for i in g) # 第二层 i 分别得到 10 11 12 13 , n = 10 add(10,10) return a+b => (20,21,22,23) 新的生成器g的范围 20,21,22,23
print(list(g)) [20,21,22,23]

如何判断输入的数是质数

#质数(素数):除了1和本身,不再被别的数整除,2是质数当中唯一的一个偶数


while True:
	num = input("请输入>>>").strip()
	if num.isdecimal():
		num = int(num)
		if num > 1:
			for i in range(2,num):
				if num % i == 0 :
					print("不是质数")
					break
			else:
				print("是质数")	
		else:
			print("质数需大于1!")
	else:
		print("go out,乱写的人不让玩")
		break



通用写法

num = int(input("请输入>>>").strip())
if num >1:
	sign = False # 设置一个标记
	for i in range(2,num):
		if num % i == 0 :
			sign = True
			break
	if sign == True:
		print("不是质数")
	else:
		print("是质数")
else:
	print("质数需大于1!")


函数写法:
def zhishu(n):
   list1 = []
  if n >1:
   	 for i in range(2,n):
    	    res = n % i
      	  list1.append(res)
		
    	if 0 in list1:
      	  print("这不是质数!")
	    else:
   	     print("这是质数!")
    else:
      print("质数需大于1!")
zhishu(2)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值