问题整理(代码类) ---更新中

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

 

posted @ 2019-04-20 14:25  blog_wu  阅读(175)  评论(0编辑  收藏  举报