二分法的应用
有一个从小到大排列的整形数字列表,我们判断某一个数字是不是在这个列表里面。
动用二分法查找数字
import time def rec_find_num(num, lis): """递归版本""" lis_len = int(len(lis) / 2) # 10.0 binary_num = lis[lis_len] # 10 if len(lis) == 1: print('没找到') return if binary_num > num: lis = lis[:lis_len] rec_find_num(num, lis) elif binary_num < num: # 10 < 18 lis = lis[lis_len + 1:] rec_find_num(num, lis) else: print('找到了') lis = [i for i in range(100000000)] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] start = time.time() rec_find_num(4567899900, lis) end = time.time() print(end - start) # 1.1569085121154785 import time lis = [i for i in range(100000000)] def time_count(func): def wrapper(*args, **kwargs): start = time.time() res = func(*args, **kwargs) end = time.time() print(end - start) return res return wrapper
@time_count def find_num(num): """普通版本""" for i in lis: if i == num: print('找到了') break else: print('没有被找到') find_num(4567899900) # 2.293410062789917
匿名函数
有名函数:有名字的函数
def laowang(): pass laowang()
匿名函数:没有绑定名字,使用一次即被收回,加括号可以运行
lambda关键字定义a
#语法: lambda x,y(参数):x+y(逻辑代码) res=(lambda x,y:x+y)(1,2) print(res) ----->3
匿名函数也能调用,但是调用需要注意只能使用一次,一般不单独使用。
与内置函数联用:匿名函数通常与max()、min()、map()、sorted()、filter()方法联用
salary_dict = {j 'nick': 3000, 'jason': 100000, 'tank': 5000, 'sean': 2000, 'tttt': 4000, 'egon': 10000000, } #我们要找到工资最高的那个人 max() max_salary = max(iterable) # 按照键取最大 # jnst # tttt print(max_salary) def key(res): # res='nick','tank' return iterable[res] max_salary = max(iterable, key=key) print(max_salary) #1. salary_dict变成迭代器对象salary_dict_iter #2. res = salary_dict_iter.__next__ #3. res丢入函数func中,3000,100000,5000,2000,4000 #4. 得到函数的返回值,把这个返回值作为判断依据 #5. 只要把值丢到max函数里,就可以找到最大值
内置函数
掌握:
-
bytes() :解码字符
-
chr()ord() :chr()参考ASCII码表将数字转化为对应字符; ord()将字符转化为对应的数字
print(chr(65))
A
print(ord('A'))
65
-
divmod() :分栏
-
enumerate() :带有索引的迭代
-
eval() :把字符串翻译成数据类型
-
hash() :是否可哈希
解码字符
例如:机选一组双色球
import random print([random.randint(1,32) for i in range(6)]) lis = [] for i in range(12): if len(lis)==6: break num = random.randint(1,32) if num in lis: pass else: lis.append(num) print(lis)
面向过程编程
例如:
一个瓶子的工厂:
-
原材料(一堆熟料)
-
融化塑料
-
通过模具做出一个瓶子
-
包装检测瓶子
-
买瓶子
按照一定的顺序,瞬息中的每一步都可以看成函数,这个函数是上一个函数的输出,这就叫面向过程编程
优点:1. 逻辑清晰,简单明了
2. 每个函数可以独立的写出来
缺点:1. 相互之间会有联系,上一部中断了,下一步也就中断了
2.有一个功能改变了,其他的功能也要改变
3.可扩展性差
注册功能
- 接受用户输入用户名,进行 合法性校验,拿到合法的用户名。
- 接受用户输入密码,进行合法性校验,拿到合法的密码
- 将合法的用户名和密码写入文件
- 注册
- 封装文件读写功能
分层实现功能
- 用户功能层:实现用户具体的功能
- 接口层:连接数据处理层和用户功能层
- 数据处理层:处理数据后把结果交给接口层
函数阶段性练习
例如:
shopping_car_dict = dict() # 存储购买商品 user_info_dict = dict() # 记录用户登陆信息 goods_price_total = 0 # 总价 def input_username_pwd(): """输入用户名/密码""" username = input('请输入你的名字》》》') pwd = input('请输入你的密码》》》') return username, pwd def save_file_a(filename, content): """a模式保存文件""" with open(filename, 'a', encoding='utf8') as fa: fa.write(content) return True def save_file_w(filename, content): """w模式保存文件""" with open(filename, 'w', encoding='utf8') as fw: fw.write(content) return True def read_file(filename): """读取文件""" with open(filename, 'r', encoding='utf8') as fr: data_list = fr.readlines() return data_list def login_deco(func): def wrapper(*args, **kwargs): if not user_info_dict: login_res = login() if login_res: res = func(*args, **kwargs) return res else: print('登陆失败,请重新登陆') return res = func(*args, **kwargs) return res return wrapper def register(): """注册""" print("\033[1;31;40m欢迎使用注册功能\033[0m") while True: username, pwd = input_username_pwd() # 判断用户名是否已经存在 user_info_data_list = read_file('user_info.txt') for user_info in user_info_data_list: user_list = user_info.strip().split(':') username_file = user_list[0] if username_file == username: print('用户名已经存在,请重新注册') break else: save_file_a('user_info.txt', f'{username}:{pwd}:15000:0\n') break def login(): """登陆,登陆三次后退出""" print("\033[1;31;40m欢迎使用登陆功能\033[0m") count = 0 while count < 3: username, pwd = input_username_pwd() # 判断用户是否存在 user_info_data_list = read_file('user_info.txt') for user_info in user_info_data_list: # 姓名:密码:余额:锁 user_list = user_info.strip().split(':') username_file = user_list[0] pwd_file = user_list[1] extra = int(user_list[2]) lock_num = user_list[3] lock_num_int = int(lock_num) if username == username_file and pwd == pwd_file: if lock_num_int == 0: print('登陆成功') # 存放用户信息 user_info_dict['username'] = username_file user_info_dict['pwd'] = pwd_file user_info_dict['extra'] = extra user_info_dict['lock_num'] = lock_num return True else: print('账户被冻结') return False else: # for循环没有被break/return后执行 count += 1 print('账户名/密码错误,请重新登陆') @login_deco def shopping(): """购物""" print("\033[1;31;40m欢迎使用购物功能\033[0m") goods_dict = { '0': ('tesla', 100), '1': ('tiger', 1000), '2': ('nick全*写真集', float("inf")), '3': ('nick半*写真集', float("inf") / 2), '4': ('iphoneX', 10), '5': ('MacPro', 15), 'q': '退出' } while True: for ind, goods in goods_dict.items(): print(ind, goods) goods_choice = input('请选择你需要购买的商品号(输入q退出)》》》').strip() if goods_choice == 'q': break if goods_choice not in goods_dict: print('傻逼,眼瞎,滚走,讨厌~!') continue goods_num_choice = input('请输入你需要购买的商品数量(输入q退出)》》》').strip() if goods_num_choice == 'q': break if not goods_num_choice.isdigit(): print('傻逼,你数学体育老师教的???') continue goods_num_choice_int = int(goods_num_choice) shopping_goods = goods_dict[goods_choice] print(f'你购买的{shopping_goods} {goods_num_choice_int}已经加入购物车,请进入购物车结账!') if not shopping_car_dict.get(shopping_goods): shopping_car_dict[shopping_goods] = goods_num_choice_int else: shopping_car_dict[shopping_goods] += goods_num_choice_int @login_deco def shopping_car(): """购物车""" print("\033[1;31;40m欢迎使用购物车功能\033[0m") global goods_price_total while True: # 打印购物车信息+计算总价 print('你的购物车有如下产品:') for shopping_goods, goods_num in shopping_car_dict.items(): print(shopping_goods, goods_num) goods_price_total += shopping_goods[1] * goods_num if goods_price_total > user_info_dict['extra']: print('穷逼,余额不足,无法购买,平台无法充值,请修改or请滚蛋!!!') # 修改购物车 while True: for ind, goods in enumerate(shopping_car_dict): print(ind, goods) shopping_car_list = [goods for _, goods in enumerate(shopping_car_dict)] modify_goods_ind = input('请选择你需要修改的商品编号》》》').strip() modify_goods = shopping_car_list[int(modify_goods_ind)] modify_goods_num = int(input('请选择你需要修改的商品数量》》》').strip()) shopping_car_dict[modify_goods] = modify_goods_num break else: print('你可以去结账了') break @login_deco def check(): """结账""" print("\033[1;31;40m欢迎使用结账功能\033[0m") if goods_price_total <= user_info_dict['extra']: user_info_dict['extra'] -= goods_price_total # 清空购物车 global shopping_car_dict shopping_car_dict = dict() print(f'结账{goods_price_total}成功,你余额为{user_info_dict["extra"]}') else: print('余额不足,请前往购物车修改商品信息') shopping_car() @login_deco def lottery(): # 抽奖 """抽奖""" print("\033[1;31;40m欢迎使用抽奖功能\033[0m") pass @login_deco def goods_back(): """退货""" print("\033[1;31;40m欢迎使用退货功能\033[0m") pass @login_deco def coupon(): """优惠券""" print("\033[1;31;40m欢迎使用优惠券功能\033[0m") pass @login_deco def shopping_history(): """消费记录""" print("\033[1;31;40m欢迎使用消费记录功能\033[0m") pass '**************************************************' func_dict = { 0: register, 1: login, 2: shopping, 3: shopping_car, 4: check, 5: lottery, # 抽奖 6: goods_back, 7: coupon, 8: shopping_history, } func_msg = """ 0:注册, 1:登录, 2:购物, 3:购物车, 4:结账, 5:抽奖 6:退货, 7:优惠券, 8:消费记录, q:退出 """ while True: print(func_msg) func_choice = input('请输入你想要使用的功能(输入q退出)》》》').strip() # 退出 if func_choice == 'q': break # 判断是否非法输入 if not func_choice.isdigit(): print('非法输入') continue # 判断是否非法输入 func_choice_int = int(func_choice) if func_choice_int not in func_dict: print('非法输入') continue # 正常选择功能 func_dict[func_choice_int]()
来源:https://www.cnblogs.com/gongjingyun123--/p/10976021.html