问题整理(代码类) ---更新中
1.基础部分
整理比较分散,遇到了会往这里加。。。
1.
1.print({"a": []}["a"].append(1)) # None 2.print(print(0)) # 0 None
2.字典get应用
a = [ 'a,1', 'b,3,22', 'c,3,4', 'f,5' ] b = [ 'a,2', 'b,4', 'd,2', 'e,12' ] dic = {i[0]: i for i in a} for x in b: if dic.get(x[0]): dic[x[0]] += x[1:] else: dic[x[0]] = x print(list(dic.values())) # ['a,1,2', 'b,3,22,4', 'c,3,4', 'f,5', 'd,2', 'e,12']
3.字符串回文
s = input('请输入一个回文:').strip() s1 = s[::-1] if s == s1: print('是回文') else: print('不是回文')
4.字典操作(念数字)
""" 念数字给出一个字典. 在字典中标识出每个数字的发音. 包括相关符号. 然后由用户输入一个数字. 让程序读出相对应的发音(不需要语音输出. 单纯的打印即可) """ dic = { "-": "fu", "0": "ling", "1": "yi", "2": "er", "3": "san", "4": "si", "5": "wu", "6": "liu", "7": "qi", "8": "ba", "9": "jiu", ".": "dian", } msg = input('input a string:') # 遍历输入的字符串,到字典中查找 for c in msg: # 查字典 if c in dic: print(dic[c],end=' ')
5.字典应用(电影投票)
lst = ['海王', '流浪地球', '美国往事', '西西里的美丽传说'] d = {} # 创建新字典 for i in lst: d.setdefault(i,0) print(d) # {'海王': 0, '流浪地球': 0, '美国往事': 0, '西西里的美丽传说': 0} for x in range(len(lst)): print('{}\t{}'.format(x+1,lst[x])) # 按照索引格式化输出序号和对应的电影名称 while 1: x = input("请输入序号进行投票:").strip() if x.upper() == "Q": break if x.isdigit() and 0 < int(x) <= len(lst): # 判断用户输入的序号是否符合 d[lst[int(x)-1]] = d[lst[int(x)-1]] + 1 # value = value +1 # d[lst[int(x)-1]]对应的是字典的value,初始定义的都是0 print('给{}投了一票'.format(lst[int(x)-1])) # 格式化输出 else: print("输入有误,重新输入") print(d)
2.函数部分
1.推导式
1.print([(x, y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1])
# [(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]
2.生成器
def demo(): for i in range(4): yield i g = demo() g1 = (i for i in g) g2 = (i for i in g1) print(list(g1)) # [0,1,2,3] print(list(g2)) # []
3.生成器(难)
def add(n, i): return n + i def test(): for i in range(4): yield i g = test() for n in [1, 10]: g = (add(n, i) for i in g) print(list(g)) # [20, 21, 22, 23]
4.列表推导式和生成器推导式
v = [lambda: x for x in range(10)] print(v) # 列表中是十个lambda函数的地址 print(v[0]) # 是一个没执行的函数的地址 lambda:x print(v[0]()) # 9 v = (lambda: x for x in range(10)) print(v) # 生成器地址 print(v[0]) # 报错 生成器不能用索引取值
5.函数中默认参数传递问题(错题)
def func(a = 1,b = 2,l = []): l.append(a+b) print(l) # [3] [7] [3,11] func(1,2) func(3,4,[]) func(5,6) # 所有的不传默认参数的调用,在这里是共用一个空列表, # 这个空列表中的修改永远不会因为新的调用而消失,是所有函数共享的一个资源
6. 内置函数filter
lst = filter(lambda n:n%3==1,range(10)) print(len(list(lst))) # 3(1,4,7) print(len(list(lst))) # 0 迭代器的元素只能从头到尾取一次
7.推导式和三元运算符
# 请用推到式或者循环实现以下需求,有字典d如下,请找出字典中key以’a’开头的项, # 判断年龄,如果年龄大于40,那么对应的value修改成老年,小于40,对应的项修改成青年 # d = {'alex': 84,'wusir': 73,'taibai':18,'amber':20} # 结果示例:{'alex': '老年', 'amber': ‘青年’} 解析:(一行代码实现) d = {'alex': 84,'wusir': 73,'taibai':18,'amber':20} d = {k:'老年' if d[k]>40 else '青年' for k in d if k.startswith('a')} print(d)
3.模块部分
1.random模块验证码
import random def v_code(): code = '' for i in range(4): num = random.randint(0, 9) alf = chr(random.randint(65, 90)) # 65-90 大写 A-Z, 97-122 小写 a-z add = random.choice([num, alf]) code = "".join([code, str(add)]) return code print(v_code())
import string, random print(''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(4)))
# 也是验证码
2.time模块
1. 获取当前月的第一天时间戳时间 # 思路:先要找到到当前的月份 # 代码分析: import time # 推荐方法 def day_time(): str_time = time.strftime('%Y%m') # 得出当前的字符串时间 tu_time = time.strptime(str_time, '%Y%m') # 转换成格式化时间 now_time = time.mktime(tu_time) # 转换成时间戳 return now_time ret = day_time() print(ret) # 解法二 def day_time(): tu_time = time.localtime() l1 = list(tu_time) # 获取到当前的结构化时间后强转成列表 l1[2] = 1 l1[3:6] = [0, 0, 0] # 使用列表的方法,改成第一天 now_time = time.mktime(tuple(l1)) # 再次强转回去,得出结论:mktime 只关心是不是元组 return now_time ret = day_time() print(ret)
2. 当前年月日的凌晨12点对应的时间戳时间是多少 import time def hour_time(): str_time = time.strftime('%Y%m%d') # 计算当前的字符串时间 tu_time = time.strptime(str_time,'%Y%m%d') # 转换成格式化时间,没有后面的小时取值,就相当于是0点 now_time = time.mktime(tu_time) # 转换成时间戳时间 return now_time ret = hour_time() print(ret) # 当前年月日的凌晨12点对应现在的时间差了多少s str_time = time.strftime('%Y%m%d') tu_time = time.strptime(str_time, '%Y%m%d') old_time = time.mktime(tu_time) now_time = time.time() s = now_time - old_time print(s) # 和上面一样,使用现在的时间戳减去凌晨12点的时间戳
3. 使用time模块编程,用户输入一个生日,计算这个人来到这个世界已经多少天? import time s = input('请输入生日(例19940915):') now_time = time.time() old_tup = time.strptime(s,'%Y%m%d') old_time = time.mktime(old_tup) new_time = now_time - old_time day = int(new_time / 86400) print('你来到这个时间已经{}天了'.format(day))
3.random模块发红包
import random def red_pac(money, num): # 函数 ret = random.sample(range(1, money * 100), num - 1) # 使用sample方法取随机数(从1开始,钱数*100是为了2个小数位),num-1是中间切的点数,得到一个列表 ret.sort() # 对列表进行排序 ret.insert(0, 0) # 对索引0位置定义0 ret.append(money * 100) # 列表追加上限钱数*100 for i in range(len(ret) - 1): # 取索引 value = ret[i + 1] - ret[i] # 每个人抢的的金额等于后面的点数减去前面的 yield value / 100 # 利用生成器具体的金额(需要除之前的100) g = red_pac(200, 10) for i in g: print(i)
4.hashlib模块---检验文件一致性
import hashlib md5 = hashlib.md5() md5.update(b'hello') md5.update(b'world') ret = md5.hexdigest() print(ret) # fc5e038d38a57032085441e7fe7010b0 md5 = hashlib.md5() md5.update(b'helloworld') ret = md5.hexdigest() print(ret) # fc5e038d38a57032085441e7fe7010b0 结论:单行编译和全部编译的结果是一样的
# 校验大文件的一致性(视频文件为例) import os import hashlib def file_md5(path): # 定义函数 filesize = os.path.getsize(path) # 使用os模块返回path的大小 md5 = hashlib.md5() with open(path, 'rb') as f: # 按字节读取文件 while filesize >= 4096: # 循环读取,按照4096个字节 content = f.read(4096) md5.update(content) filesize -= 4096 else: content = f.read(filesize) if content: md5.update(content) return md5.hexdigest() def cmp_file(path1, path2): return file_md5(path1) == file_md5(path2) path1 = r'D:\python记录\课上视频\作业题讲解.mp4' path2 = r'D:\python记录\课上视频\1.作业讲解.mp4' ret = cmp_file(path1, path2) print(ret)
5.os模块 --清空文件夹
# 写函数,完成清空一个文件夹的功能, # 假设这个文件夹中可能存在其他文件,但不存在文件夹 解析: import os def clear_dir(path): if os.path.isdir(path): name_lst = os.listdir(path) for name in name_lst: son_path = os.path.join(path,name) os.remove(son_path) clear_dir('文件路径')
# 计算文件大小(文件夹下的所有文件)
import os def get_size(path): size = 0 # 初始化一个size,用于计算 l = [path] # l = ['D:\BaiduNetdiskDownload'] while l: path = l.pop() # 新的路径是列表的pop值 lst = os.listdir(path) # 使用os模块读取相应路径下的文件,以列表的形式保存 for name in lst: # 循环遍历相应的文件(此时该路径下不确定是否还有文件夹) son_path = os.path.join(path, name) # 使用os模块os.path.join找到绝对路径 if os.path.isfile(son_path): # 判断是否是文件 size += os.path.getsize(son_path) # 是文件直接在size = 0的基础上加上计算出的文件大小 else: # 判断不是文件,如果是文件夹 l.append(son_path) # 将文件夹路径追加到列表中 return size size = get_size(r'D:\BaiduNetdiskDownload') print(size)
# 三级菜单 menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': { '爱奇艺': {}, '汽车之家': {}, 'youku': {}, }, '上地': { '百度': {}, }, }, '昌平': { '沙河': { '老男孩': {}, '北航': {}, }, '天通苑': {}, '回龙观': {}, }, '朝阳': {}, '东城': {}, }, '上海': { '闵行': { "人民广场": { '炸鸡店': {} } }, '闸北': { '火车战': { '携程': {} } }, '浦东': {}, }, '山东': {}, } l = [menu] while l: # clear 清空列表后,为空结束循环 for k in l[-1]: # l[-1]循环遍历整个列表,得到对应字典的键 print(k) key = input('>>>').strip() # 用户输入 if key.upper() == 'B': # 判断输入大小写B l.pop() # 默认删掉最后一个字典 --> 返回上一层 elif key.upper() == 'Q': # 判断输入大小写Q l.clear() # 清空列表 --> 退出程序 elif l[-1].get(key): # 如果字典中可以get到用户输入的内容 l.append(l[-1][key]) # 将对应的字典添加到列表中
4.面向对象
1.类的执行顺序
class A: Country = 'English' def __init__(self): self.Country = 'China' print(Country) # 'English' A.Country = 'English' class A: def __init__(self): self.Country = 'China' def show_country(self): return self.Country Country = 'English' print(A.Country) # 'English' print(A().Country) # 'China' print(A().show_country) # show_coutry的地址 print(A().show_country()) # 'China'
2.super方法的使用和函数调用
class A(object): def func(self): print('in A') class B(A): def func(self): super().func() print('in B') class C(A): def func(self): super().func() print('in C') class D(A): def func(self): super().func() print('in D') class E(B,C,D): def func(self): super().func() print('in E') E().func()
# in A in D in C in B in E
# super方法和c3算法
# 在多继承中,super就只和mro顺序有关系,和父类子类没有关系了
# 函数的调用:哪里调用的就回到哪里
5.网络编程
pass
6.并发编程
pass