一、day04作业分析
#思考 #1.先取到文件中的字典 #作业:对字典的增删改查 # 写一个管理商品的程序,商品文件格式a.json里面 # 提供商品得增删改查得功能 # choice = input("请输入你的选择:1.查看商品2、新增商品、3、修改商品4、删除商品") #1.查看商品,输入商品名称,print单个商品的信息,价格,数量,输入all,查看所有商品 #2.新增商品,输入商品名称、数量、价格,数量是大于0 的整数,价格必须是大于0的数值(商品存在无法添加,输入商品名不能为空) #3.修改商品,输入商品名称、数量、价格,商品存在才可以修改,数量是大于0的整数,价格必须是大于0的数值 #4.输入商品名称,如果存在,删除 #不要重复代码 #下周讲数据库redis以及模块,网盘中有安装包,安装mysql和redis import json FILE_NAME = 'a.json'#常量:基本不会变化,常量一般写成大写字母 def read_products(): with open('FILE_NAME',encoding='utf-8') as fr: return json.load(fr) def write_products(data): with open('FILE_NAME','W',encoding='utf-8') as fw: json.dumps(data,fw,ensure_ascii=False,indent=4) def show_product(): #第一种方案 # products = read_products() # product_name = input("请输入商品名称:").strip() # if not product_name: # print("请输入商品名称:") # elif product_name == 'all': # print(products) # elif product_name not in products: # print('商品不存在') # else: # product = products.get(product_name) # print('商品信息:',product) # 第二种方案 product_name = input("请输入商品名称:").strip() if product_name: products = read_products()if product_name == 'all': print(products) elif product_name not in products: print('商品不存在') else: product = products.get(product_name) print('商品信息:', product) else: print('商品不存在') def is_digit(number): s = str(number) if s.isdigit(): if int(s) > 0: return True def is_price(price):#>0的整数和小数 s = str(price) if is_digit(S): return True else: if s.count('.') == 1: left,right = s.split('.') if left.isdigit() and right.isdigit(): if float(s)>0: return True def add_product(): product_name = input("请输入商品名称:").strip() count = input("请输入商品数量:").strip() price = input("请输入商品价格:").strip() if product_name and price and count: if is_price(price) and is_digit(count): products = read_products() if product_name not in products: products[product_name] = {"count":count,"price":price} write_products(products) print('商品新增成功!') else: print('商品已经存在') else: print('价格/数量不合法') else: print('不能为空') def modify_product(): product_name = input("请输入商品名称:").strip() count = input("请输入商品数量:").strip() price = input("请输入商品价格:").strip() if product_name and price and count: if is_price(price) and is_digit(count): products = read_products() if product_name in products: # products.pop(product_name) # products[new_product_name] = {"count": count, "price": price} products[product_name] = {"count":count,"price":price} write_products(products) print('商品修改成功!') else: print('商品不经存在') else: print('价格/数量不合法') else: print('不能为空') def delete_product(): product_name = input("请输入商品名称:").strip() if product_name: products = read_products() print("请输入商品名称:") if product_name == 'all': print(products) elif product_name not in products: print('商品不存在') else: products.pop(product_name) write_products(products) else: print('商品不能为空') choice = input('1.查看商品 2.新增 3.修改 4.删除') func_map = {'1':show_product(),'2':add_product(),'3':modify_product(),'4':delete_product()} if choice in func_map: func_map[choice]() else: print('请输入正确的选项') # # if choice == '1': # show_product() # elif choice == '2': # add_product() # elif choice == '3': # modify_product() # else: # delete_product()
二、内置函数
1.必须会的:len type print input open round min max filter may zip exec eval
a = b = c = False # #if a and b and c: === if all([a,b,c]) print(all([1,2,3,4]))#判断可迭代的对象里面的值都为真,值为真True print(any([1,2,3,4,5]))#只要有一个为真,值为真True print(any([0,False,'',[],1]))#True print(max(111,12))#返回最大值#111 print(min([1,2,3,4]))#返回最小值#1 print(round(11.11988,2))#保留2位小数#11.12 a = '1' print(dir(a))#查看a中可用的方法,.不出来的时候使用#['__add__', '__class__', ...]
2.exec 执行储存在字符串或文件中的Python语句,相比于 eval,exec可以执行更复杂的 Python 代码。exec 返回值永远为 None。
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
eval(expression[, globals[, locals]])
- expression -- 表达式。
- globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
- locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
#在线编程工具
s = '''
for i in range(10):
print(i)
'''
exec(s)#用来动态执行python代码的#1~9
print(eval('[1,2,3]'))#[1,2,3]
result = eval('1+1')#用来动态执行python代码的
print(result)#2
f = open('a.json',encoding='utf-8')
result = eval(f.read())
print(result)#{'mac book': {'count': 50, 'price': 8999}, '矿泉水': {'count': 100, 'price': 1.1}}
3.filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
#简化代码 # filter()#过滤,会自动循环你传给它的list,然后list里面的每一个元素传给指定的函数,如果这个函数结果为true,那么就保留这个元素 def oushu(number): if number%2 == 0: return True l = range(1,11) l2 = [] for i in l: if oushu(i): l2.append(i) result = list(filter(oushu,l))#func_name,list;自动帮你循环list,真保留,假丢掉 print(l2) print(result) #map()#保存函数的返回值,会自动循环你传给它的list,然后list里面的每一个元素传给指定的函数,把这个函数返回的结果保留下来 def oushu(number): if number%2 == 0: return True l = range(1,11) l2 = [] for i in l: if oushu(i): l2.append(i) result = list(map(oushu,l))#func_name,list;自动帮你循环list,真保留,假丢掉 print(l2) print(result)
#str是函数名
result2 = list(map(str,range(1,11)))#自动循环,把int类型转成了字符串
print(result2)
结果:
4.globals和locals
globals()#获取当前函数里的全局变量 locals()#获取当前函数里的局部变量 def test(): a = 1 B = 2 print(locals()) print(globals()) test()
结果:
5.sorted排序
''' sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。 list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。 ''' # sorted()#升序 a = [5,65,7,43,64,86,13,4,32]#[4, 5, 7, 13, 32, 43, 64, 65, 86] print(sorted(a)) print(sorted(a,reverse=True))#降序 #练习,排序第一名 #第一种方法 d = { 'fd':100, 'ds':93, 'lhy':88, 'hzy':35 } print(d.items())#二维数字dict_items([('fd', 100), ('ds', 93), ('lhy', 88), ('hzy', 35)]) result = sorted(d.items(),key=lambda x:x[0],reverse=True) print(result) def get_value(x): return x[1] result1 = sorted(d.items(), key=get_value,reverse=True) print(result1) c = d.items() result2 = sorted(c,reverse=True) print(result2)
结果:
6.zip
# zip()#压缩 a = ['fd','hzy','ds'] b = ['123','456','789'] c= ['1','2','3'] for username,password in zip(a,b): print(username) print(password) for u in zip(c,a,b): print(u)
结果:
三、匿名函数
a = lambda x:x+1 a1 = lambda x,y:x+y # x入参、x+1返回值 result = a(1) result = a1(1,2) print(result)#3 filter(lambda x:str(x),[1,2,3,4,5]) filter(str,[1,2,3,4,5])
四、常用模块:import os,random,sys,time,string
1.random
#random随机数模块 print(random.randint(1,10))#包含10,随机的整数 print(random.uniform(1,10))#随机的小数 print(random.choice(string.ascii_lowercase))#随机选择一个元素,传一个循环就可以 print(random.sample(string.ascii_uppercase,3))#随机取多个,不能超出循环的最大值,使用:随机验证码 l = [random.choice(string.digits) for i in range(4)]#随机取一个,取4次,可能会有重复现象 l2 =random.sample(string.digits,6)#这个取的元素,它不会重复 print(''.join(l)) print(''.join(l2)) print(random.shuffle)#洗牌,打乱顺序 l = [1,2,3,4,5,6,7,8] print('打乱之前的',l) random.shuffle(l) print('打乱之后的',l)
结果:
2.os
#os模块 # print(os.listdir('/Users/fangdandan/fangdan/学习python/学习python-天马座/day05'))#获取某个目录下的内容 # print(os.name)#获取系统名字 #mkdir和makedirs的区别:mkdir如果父目录不存在的话是会报错的,makedirs如果父目录不存在会创建 # os.mkdir('/Users/fangdandan/Desktop/python') # os.mkdir('python/day1')#创建会报错 # os.makedirs('java') # os.makedirs('java/day1')#创建不会报错 # os.remove('python')#只能删除文件,不能删除文件夹 # os.rmdir('java)#只能删除空文件夹 # os.rename('java','python')#可以重命名文件和文件夹 # os.chdir('/Users/fangdandan/fangdan/学习python/学习python-天马座/day05')#进入到某个目录里面 # print(os.getcwd())#获取当前所在的目录 # result = os.popen('ifconfig').read()#执行命令,并且可以拿到结果 # result = os.system('ifconfig')#执行操作系统命令的;reboot重启;ifconfig:ip地址;rm -rf a.json删除文件等 # #window执行后可能会产生乱码,因为字符集的问题 # print('!!!!',result) #它返回的是命令是否执行成功, 如果返回0,代表执行成功 # print(os.environ)#获取系统环境变量里面配置的内容 # p = 'e:'+os.path.sep+'movies'+os.path.sep+'动漫' # print(p) # print(os.path.join('e:','movies','动漫','柯南.mp4')) # print(os.path.abspath('../day05/a.json'))#把相对路径转换成绝对路径 #/Users/fd/Pycharm/day05/a.json绝对路径 #../day4/a.json相对路径 # print(os.path.split('/Users/fangdandan/fangdan/学习python/学习python-天马座/day05'))#路径和文件名分割开 # print(os.path.dirname('/Users/fangdandan/fangdan/学习python/学习python-天马座/day05/a.json'))#取父目录 # print(os.path.sep)#当前系统的路径分割符 # print(os.path.isfile('a.py'))#判断是不是一个文件 # print(os.path.isdir('a.py'))#判断是不是一个文件夹 # print(os.path.exists('a.py'))#文件或文件夹是否存在 # print(os.path.getsize('a.py'))#获取大小 # print(os.path.getctime('a.py'))#创建时间#时间戳 # print(os.path.getmtime('a.py'))#修改时间 # print(os.path.getatime('a.py'))#最后一次访问时间
练习:
#当前目录,当前目录下有哪些文件夹,有哪些文件walk() #查找电影 # for cur_path,dirs,files in os.walk('/Users/fangdandan/fangdan/学习python/学习python-天马座/day05'): # # print(cur_path,dirs,files) # print('在当前%s目录下查找' %cur_path) # for file in files: # if file.endswith('.mp4') or file.endswith('.avi'): # print('发现电影在%s目录下'%cur_path) # break
3.time
#时间戳153434353.552323 一串数字,从unix元年到现在的时间 #格式化好的时间2020-08-29 17:24:38,但是计算起来不方便,所以有了时间戳 #3234352353+ 60 *60 * 24 * 8 print(time.time())#获取当前的时间戳 print(int(time.time())) print(time.strftime('%Y-%m-%d %H:%M:%S'))#当前格式化时间 seven = int(time.time()) + 60 * 60 * 24 * 7 print(seven) str_time = '2020-08-29 17:31:02' str_time2 = '2020-08-29' time_stamp = 1598693386 #时间元祖 #时间戳转格式化好的时间 lt = time.localtime(time_stamp)#当前时区的时间 bt = time.gmtime(time_stamp)#标准时区的时间 print(lt) print(bt) print(time.strftime('%Y-%m-%d %H:%M:%S',lt)) #格式化好的时间转时间戳 time_tuple = time.strptime(str_time,'%Y-%m-%d %H:%M:%S') time_stamp_nwo = time.mktime(time_tuple) print(time_stamp_nwo) print(time.strptime(str_time2,'%Y-%m-%d'))
结果:
4.import的函数不执行的代码方法
使用__name__ == '__main__'这个判断下面的代码,只有在本文件中会执行,如果import导入到其他的文件中,if下面的测试代码是不会被执行的。
a = 1 def func(): print('abc') def execute_sql(sql): print(sql) # execute_sql('select') # execute_sql('delete') print('__name__',__name__) #__name__当前py文件的名字 if __name__ == '__main__': print('abc') func() execute_sql('select') execute_sql('delete')
5.造日志的代码
def timestamp_to_str(timestamp=None,format='%Y-%m-%d %H:%M:%S'): '''时间戳转格式化好的时间,如果没有传时间戳,就获取当前的格式化时间''' if timestamp: time_tuple = time.localtime(timestamp) #把时间戳转成时间元组 result = time.strftime(format,time_tuple) #把时间元组转成格式化好的时间 return result else: return time.strftime(format) import time,os,random l = ['ios','android','nginx','tomcat','python','blog','apache','mysql','redis'] for i in l: p = os.path.join('logs',i) os.makedirs(p) for j in range(30): t = int(time.time())-86400*j time_str = timestamp_to_str(t,'%Y-%m-%d') log_name = '%s_%s.log'%(i,time_str) abs_file_path = os.path.join('logs',i,log_name) fw = open(abs_file_path, 'w', encoding='utf-8') if random.randint(1,10)%2==0: fw.write('胜多负少防守打法双方都') fw.close()