zoukankan      html  css  js  c++  java
  • 记录python题

    def mone_sorted(itera):
        new_itera = []
        while itera:
            min_value = min(itera)
            new_itera.append(min_value)
            itera.remove(min_value)
      return new_itera if __name__ == "__main__": lst = [2, 3, 1, 5, 4] print(mone_sorted(lst))

    函数内部使用了选择排序的思想

    1 编写函数,模拟内置函数sorted()

    2 若有一个jsonline格式的文件file.txt,大小约为10K,我们的处理方式为:

    def get_lines():
            l = []
            with open('file.txt', 'rb') as f:
                for eachline in f:
                    l.append(eachline)
                return l
    
    if __name__ == '__main__':
        for e in get_lines():
            process(e) #处理每一行数据

    现在要处理一个大小为10G的file.txt文件,但是内存只有4G。如果在只修改get_lines 函数而其他代码保持不变的情况下,应该如何实现?需要考虑的问题都有那些?

    def get_lines():
            l = []
            with open('file.txt','rb') as f:
                data = f.readlines(60000)
            l.append(data)
            yield l

    3 输入日期。判断这一天是今年的第几天。

    import datetime
    
    year = int(input('请输入年:'))
    month= int(input('请输入月:'))
    day = int(input('请输入日:'))
    date1 = datetime.date(year=year, month=month, day=day)
    date2 = datetime.date(year=year, month=1, day=1)
    date3 = date1-date2
    print(date3)

    4 打乱一个排好序的list

    import random
    
    def daluan(lst):
        random.shuffle(lst)
        return lst
    
    lst = [1, 2, 3, 4, 5]
    print(daluan(lst))

    5 按照一个字典的值来对这个字典进行排序

    old_dic = {'a':6, 'b':3, 'c':2, 'd':4, 'e':5, 'f':1}
    new_dic = sorted(old_dic.items(), key=lambda d:d[1])
    print(new_dic)

    6 字典推导式

    {key,value for key,value in iterable}

    7 反转字符串

    s[::-1]

    8 将字符串 "k:1 |k1:2|k2:3|k3:4",处理成字典 {k:1,k1:2,...}

    def qie(str):
        new_dict = {}
        for i in str.split('|'):
            key, value = i.split(':')
            new_dict[key] = value
        return new_dict
    
    str = "k:1|k1:2|k2:3|k3:4"
    print(qie(str))

    9 请按alist中元素的age由大到小排序

    def sort_by_age(lst):
        return sorted(lst, key=lambda x:x['age'])
    
    alist = [{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}]
    print(sort_by_age(alist))

    10 下面代码的输出结果将是什么?

    list = ['a','b','c','d','e']
    print(list[10:])

    答案 []

    11 写一个列表生成式,产生一个公差为11的等差数列

    lst = [x*11 for x in range(0,11)]
    print(lst)

    12 给定两个列表,怎么找出他们相同的元素和不同的元素?

    list1 = [1, 2, 3, 4]
    list2 = [2, 3, 4, 5]
    print(set(list1) & set(list2))
    print(set(list1) ^ set(list2))

    13 序列去重

    old_lst = [2, 2, 1, 1, 3, 4]
    new_lst = list(set(old_lst))
    new_lst.sort(key=old_lst.index)
    print(new_lst)
    
    new_lst1 = []
    for i in old_lst:
        if i not in new_lst1:
            new_lst1.append(i)
    print(new_lst1)

    14 python中新式类和经典类的区别

    a. 在python里凡是继承了object的类,都是新式类

    b. Python3里只有新式类

    c. Python2里面继承object的是新式类,没有写父类的是经典类

    d. 经典类目前在Python里基本没有应用

    15 如何用python实现单例模式

    第一种:__new__

    class Singalton:
        def __new__(cls, *args, **kwargs):
            if not hasattr(cls, 'instance'):
                cls.instance = super(Singalton, cls).__new__(cls, *args, **kwargs)
            return cls.instance
    
    obj1 = Singalton()
    obj2 = Singalton()
    obj1.attr1 = 'value1'
    print(obj1.attr1, obj2.attr1)
    print(obj1 is obj2)

    第二种:装饰器

    class Singalton:
        def __new__(cls, *args, **kwargs):
            if not hasattr(cls, 'instance'):
                cls.instance = super(Singalton, cls).__new__(cls, *args, **kwargs)
            return cls.instance
    
    obj1 = Singalton()
    obj2 = Singalton()
    obj1.attr1 = 'value1'
    print(obj1.attr1, obj2.attr1)
    print(obj1 is obj2)

    16 反转一个整数

    def fan(n):
        if n >= 0:
            n_str = str(n)
            new_n = int(n_str[::-1])
        else:
            n_str = str(n)
            new_n = -int(n_str[:0:-1])
        return new_n
    
    if __name__ == '__main__':
        n1 = 123
        n2 = -123
        print(type(fan(n1)),fan(n1))
        print(type(fan(n2)),fan(n2))

    17 实现遍历目录和子目录

    import os
    
    def scanf(path):
        file_lst = os.listdir(path)
        for obj in file_lst:
            print(obj)
            if os.path.isfile(obj):
                print(obj)
            elif os.path.isdir(obj):
                scanf(obj)
            else:
                print('over')
    if __name__ == '__main__':
        scanf('G:学习与资料')

    18 一行代码实现1-100之和

    print(sum(range(0, 101)))

    19 遍历列表时删除元素

    我们规定删除大于10的数字

    第一种:列表推导式

    lst = [1, 5, 12, 5, 13, 6, 9, 10]
    
    new_lst = [i for i in lst if i < 10]
    print(new_lst)

    第二种:遍历删除

    lst = [1, 5, 12, 5, 13, 6, 9, 10]
    
    for i in lst:
        if i >= 10:
            lst.remove(i)
    print(lst)

    第三种:filter()

    lst = [1, 5, 12, 5, 13, 6, 9, 10]
    
    new_lst = filter(lambda x : x < 10, lst)
    print(list(new_lst))

    20 全字母短句 PANGRAM 是包含所有英文字母的句子,比如:A QUICK BROWN FOX JUMPS OVER THE LAZY DOG. 定义并实现一个方法 get_missing_letter, 传入一个字符串采纳数,返回参数字符串变成一个 PANGRAM 中所缺失的字符。应该忽略传入字符串参数中的大小写,返回应该都是小写字符并按字母顺序排序(请忽略所有非 ACSII 字符)

    下面示例是用来解释,双引号不需要考虑:

    (0)输入: "A quick brown for jumps over the lazy dog"

    返回: ""

    (1)输入: "A slow yellow fox crawls under the proactive dog"

    返回: "bjkmqz"

    (2)输入: "Lions, and tigers, and bears, oh my!"

    返回: "cfjkpquvwxz"

    (3)输入: ""

    返回:"abcdefghijklmnopqrstuvwxyz"

    def get_missing_letter(a):
        a1 = set('abcdefghijklmnopqrstuvwxyz')
        a2 = set(a)
        new_a = ''.join(sorted(a1-a2))
        return new_a
    
    print(get_missing_letter('python'))

    21 求出列表的所有奇数

    lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    new_lst = [i for i in lst if i % 2 != 0]
    print(new_lst)

    22 python中变量的作用域

    函数作用域的LEGB

    L: local 函数内部作用域

    E: enclosing 函数内部与内嵌函数之间

    G: global 全局作用域

    B: build-in 内置作用

    python在函数里面的查找分为4种,称之为LEGB,也正是按照这是顺序来查找的

    23 字符串123装换为'123',不适用内置函数,如int()

    def zhuan_huan(a):
        num = 0
        for i in a:
            for j in range(10):
                if i == str(j):
                    num = num*10 + j
        return num
    
    print(zhuan_huan('120'))

    24 统计一个文本中单词频数最高的四个单词

    import re
    
    def search(path):
        dictone = {}
        with open(path) as f:
            for line in f:
                line = re.sub('W+', ' ', line)#把一些特殊的字符换为空格
                lineone = line.split()
                for oneline in lineone:
                    if not dictone[oneline]:
                        dictone[oneline] = 1
                    else:
                        dictone += 1
        num_ten = sorted(dictone.items(), key=lambda x: x[1], reverse=True)[:10]
        num_ten = [x[0] for x in num_ten]
        return num_ten

    25 请写出一个函数满足以下条件

    该函数的输入是一个仅包含数字的list,输出一个新的list,其中每一个元素要满足以下条件:

    1、该元素是偶数

    2、该元素在原list中是在偶数的位置(index是偶数)

    def num_list(lst):
        return [i for i in lst if i%2==0 and lst.index(i)%2 == 0]
    
    num = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    print(num_list(num))

    26 用一行代码生成[1,4,9,16,25,36,49,64,81,100]

    lst = [i**2 for i in range(1, 11)]
    print(lst)

    27 两个有序列表,l1,l2,对这两个列表进行合并不可使用extend

    def sort_by(lst1, lst2):
        new_lst = []
        while len(lst1)> 0 and len(lst2) > 0:
            if lst1[0] < lst2[0]:
                new_lst.append(lst1[0])
                del lst1[0]
            elif lst1[0] > lst2[0]:
                new_lst.append(lst2[0])
                del lst2[0]
            elif lst1[0] == lst2[0]:
                new_lst.append(lst2[0])
                del lst1[0], lst2[0]
            if lst1 == []:
                new_lst += lst2
            if lst2 == []:
                new_lst += lst1
        return new_lst
    
    lst1 = [1, 2, 3, 4, 5, 9, 11, 15]
    lst2 = [3, 4, 6, 8, 9 , 11, 12, 19]
    print(sort_by(lst1, lst2))

    28 给定一个任意长度数组,实现一个函数

    让所有奇数都在偶数前面,而且奇数升序排列,偶数降序排序,如字符串'1982376455',变成'1355798642'

    def ji_ou(s):
        s1, s2 = [], []
        for i in s:
            if int(i) % 2 == 0:
                s2.append(i)
            else:
                s1.append(i)
        new_s = sorted(s1) + sorted(s2)
        new_s = ''.join(new_s)
        return new_s
    
    
    s = '1982376455'
    print(ji_ou(s))

    29 写出一个函数找出整数组中第二大的数

    def search(lst):
        num = sorted(lst, reverse=True)[1]
        return num
    
    lst = [1, 3, 5, 2, 4, 0]
    print(search(lst))

    30 阅读如下代码,它会输出什么结果

    def multi():
        return [lambda x : i*x for i in range(4)]
    print([m(3) for m in multi()])

    [9, 9, 9, 9]

    31 统计一段字符串中字符出现的次数

    def count_word(s):
        out_dict = {}
        for i in set(s):
            out_dict[i] = list(s).count(i)
        return out_dict
    
    print(count_word('dwadwakigjihefha'))

    32 遍历一个类的所有属性,并打印每一个属性名

    class Car:
        def __init__(self, name, loss):
            self.name = name
            self.loss = loss
    
        def getName(self):
            return self.name
    
        def getPrice(self):
            return self.loss[0]
    
        def getLoss(self):
            return self.loss[1] * self.loss[2]
    
    bmw = Car('奔驰', [100, 1, 50]) # 实例化
    print(getattr(bmw, 'name')) # 使用getattr传入name属性
    print(dir(bmw)) # 答应实例的属性

     33 写一个类,并让他尽可能多的支持字符操作

    class Array:
        __list = []
        
        def __init__(self):
            print "constructor"
        
        def __del__(self):
            print "destruct"
        
        def __str__(self):
            return "this self-defined array class"
    
        def __getitem__(self,key):
            return self.__list[key]
        
        def __len__(self):
            return len(self.__list)
    
        def Add(self,value):
            self.__list.append(value)
        
        def Remove(self,index):
            del self.__list[index]
        
        def DisplayItems(self):
            print "show all items---"
            for item in self.__list:
                print item

    34 动态的获取和设置对象的属性

        dir([obj]):
        调用这个方法将返回包含obj大多数属性名的列表(会有一些特殊的属性不包含在内)。obj的默认值是当前的模块对象。
        hasattr(obj, attr): 
        这个方法用于检查obj是否有一个名为attr的值的属性,返回一个布尔值。
        getattr(obj, attr): 
        调用这个方法将返回obj中名为attr值的属性的值,例如如果attr为'bar',则返回obj.bar。
        setattr(obj, attr, val):
        调用这个方法将给obj的名为attr的值的属性赋值为val。例如如果attr为'bar',则相当于obj.bar = val。

    35 写一个函数找出一个整数数组中,第二大的数

    def find_sec(lst):
        new_lst = list(set(lst))
        sec_num = sorted(new_lst, reverse=True)[1]
        return sec_num
    
    lst = [4, 6, 3, 1, 5, 5]
    print(find_sec(lst))

     36 python交换2个变量的值

    a, b = 1, 2
    a, b = b, a
    print(a, b)

    37 map函数和reduce函数

    map函数:根据指定的函数对指定的序列做映射

    reduce函数:会对参数序列中元素进行累积

    38 x是什么类型?

    x = (i for i in range(10))
    print(type(x))

    39 请用一行代码 实现将1-N 的整数列表以3为单位分组

    lst = [[x for x in range(1, 101)][i:i+3] for i in range(0, 100, 3)]
    print(lst)

    40 请鞋一段正则表达式 匹配出ip地址

    import re
    
    pattern = re.compile('^(25[0-5]|2[0-4]d|[0-1]d{2}|[1-9]?d).(25[0-5]|2[0-4]d|[0-1]d{2}|[1-9]?d).(25[0-5]|2[0-4]d|[0-1]d{2}|[1-9]?d).(25[0-5]|2[0-4]d|[0-1]d{2}|[1-9]?d)$')
    str1 = '192.168.225.255'
    x = pattern.findall(str1)
    print(x)

    上述代码分析:

    25[0-5]:匹配250-255

    2[0-4]d:匹配200-249

    [0-1]d{2}:匹配000-199

    [1-9]?d:匹配0-99

    41 str1 = “abbbccc”,用正则匹配为abccc,不管有多少b,就出现一次

    import re
    
    str1 = 'abbbbccc'
    pattern = re.sub('b+', 'b', str1)
    print(pattern)

    42 写出开头匹配字母和下划线,末尾是数字的正则表达式

    ^w.*d$

    43 怎么过滤评论中的表情

    用正则匹配出评论中的表情,然后使用sub将表情替换为空

    44 进程Process

    import os
    from multiprocessing import Process
    import time
    
    def pro_func(name, age, **kwargs):
        for i in range(5):
            print("子进程进行中 name=%s,age=%d,pid=%d"%(name, age, os.getpid()))
            print(kwargs)
            time.sleep(0.2)
    
    if __name__ == '__main__':
        p = Process(target=pro_func, args=('李强', 30), kwargs={'m':20})
        p.start()
        time.sleep(0.5)
        p.terminate() #一种强行关闭子进程的方法
        p.join()

    45 进程间的消息队列

    from multiprocessing import Process, Queue
    import os, time, random
    
    def write(q):
        for value in ['A', 'B', 'C']:
            print('put %s to queue...'%value)
            q.put(value)
            time.sleep(random.random())
    
    def read(q):
        while True:
            if not q.empty():
                value = q.get(True)
                print('get %s from the queue'%value)
                time.sleep(random.random())
            else:
                break
    if __name__ == '__main__':
        q = Queue()
        pw = Process(target=write, args=(q,))
        pr = Process(target=read, args=(q,))
        pw.start()
        pw.join()
        pr.start()
        pr.join()
        print('所有数据写完,并且读完')

    46 进程池

    from multiprocessing import Pool
    import os,time,random
    
    def worker(msg):
        start = time.time()
        print("%s 开始执行,进程号为%d"%(msg,os.getpid()))
        # random.random()随机生成0-1之间的浮点数
        time.sleep(random.random()*2)
        stop = time.time()
        print(msg,'执行完毕,耗时%0.2f'%(stop - start))
    
    if __name__ == '__main__':
        po = Pool(3) #定义一个进程池,最大进程数3
        for i in range(0,10):
            po.apply_async(worker,(i,))
        print("---start----")
        po.close()
        po.join()
        print("----end----")

    47 进程池中使用queue

    如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue(),否则会得到如下的错误信息:

    RuntimeError: Queue objects should only be shared between processs through inheritance

    from multiprocessing import Manager,Pool
    import os,time,random
    
    def reader(q):
        print("reader 启动(%s),父进程为(%s)"%(os.getpid(),os.getpid()))
        for i in range(q.qsize()):
            print("reader 从Queue获取到消息:%s"%q.get(True))
    
    def writer(q):
        print("writer 启动(%s),父进程为(%s)"%(os.getpid(),os.getpid()))
        for i in 'itcast':
            q.put(i)
    
    if __name__ == "__main__":
        print("(%s)start"%os.getpid())
        q = Manager().Queue()#使用Manager中的Queue
        po = Pool()
        po.apply_async(writer,(q,))
        time.sleep(1)
        po.apply_async(reader,(q,))
        po.close()
        po.join()
        print("(%s)End"%os.getpid())

     48 多线程共同操作同一个数据互斥锁同步

    import threading
    import time
    
    class MyThread(threading.Thread):
        def run(self):
            global num
            time.sleep(1)
            if mutex.acquire(1):
                num += 1
                msg = self.name + 'set num to ' + str(num)
                print(msg)
                mutex.release()
    
    num = 0
    mutex = threading.Lock()
    
    def test():
        for i in range(5):
            t = MyThread()
            t.start()
    
    if __name__ == "__main__":
        test()

    49 请介绍下python的线程同步

    一 setDaemon(False) 默认情况下就是setDaemon(False),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束

    import threading, time
    
    def thread():
        time.sleep(2)
        print('子线程结束')
    
    def main():
        t1 = threading.Thread(target=thread)
        t1.start()
        print('主线程结束')
    
    if __name__ == '__main__':
        main()

    二 setDaemon(True) ) 当我们使用setDaemon(True)时,这是子线程为守护线程,主线程一旦执行结束,则全部子线程被强制终止

    import threading, time
    
    def thread():
        time.sleep(2)
        print('子线程结束')
    
    def main():
        t1 = threading.Thread(target=thread)
        t1.setDaemon(True)
        t1.start()
        print('主线程结束')
    
    if __name__ == '__main__':
        main()

    三 join(线程同步) join 所完成的工作就是线程同步,即主线程任务结束以后,进入堵塞状态,一直等待所有的子线程结束以后,主线程再终止。

    当设置守护线程时,含义是主线程对于子线程等待timeout的时间将会杀死该子线程,最后退出程序,所以说,如果有10个子线程,全部的等待时间就是每个timeout的累加和,简单的来说,就是给每个子线程一个timeou的时间,让他去执行,时间一到,不管任务有没有完成,直接杀死。

    没有设置守护线程时,主线程将会等待timeout的累加和这样的一段时间,时间一到,主线程结束,但是并没有杀死子线程,子线程依然可以继续执行,直到子线程全部结束,程序退出。

    import threading, time
    
    def thread():
        time.sleep(2)
        print('子线程结束')
    
    def main():
        t1 = threading.Thread(target=thread)
        t1.setDaemon(True)
        t1.start()
        # t1.join() # 不设置时堵塞主线程,等待子线程结束后主线程再结束
        t1.join(timeout=1) # 设置timeout=1时,主线程堵塞1s,然后杀死所有子线程,然后主进程结束
        print('主线程结束')
    
    if __name__ == '__main__':
        main()

    50 多线程交互访问数据,访问到了就不访问了?如何做?

    创建一个已访问数据列表,用于储存已访问的数据,并且加上互斥锁,在多线程访问数据的时候查看数据是否在已访问的数据中,若已存在就直接跳过。

  • 相关阅读:
    【1801日語听解4】第14回:6月9日
    【日語听解2】第14回:6月8日
    【日語視聴説2】第14回:6月8日
    【日本語新聞編集】第13回:6月5日
    【1801日語写作】第13回:6月4日
    【日本語新聞選読】第13回:6月2日
    Win10版本
    家庭或小规模无线使用方
    批处理bat复制命令Copy与Xcopy
    批处理bat删除命令
  • 原文地址:https://www.cnblogs.com/xiaozx/p/10577655.html
Copyright © 2011-2022 走看看