• 几个python练习题


    从python公众号里面看到了几道python的练习题,就拿来练练手,结果上手了发现自己还是特别水,不是很难的8道题,我只做出来5道,其中还3道题卡住了,边查边做的。原题链接在这里:http://python.jobbole.com/83641/

    1. 编写代码, 打印1-1亿之内的偶数

    看完题目想都没想就直接写了一句:

    1 print [i for i in xrange(1, 10**9) if i % 2 == 0] 

    开始跑结果。然后。死机了。重启时候反省了一下,嗯,的确是有点二,一下生成五千万个元素的列表,电脑没炸了就算它好脾气了。可是,总不能一个for循环打印吧,那也太low了。考虑了一下,还是用协程靠谱一点。于是重新写了一个(在QQ群里看到别人写的稍微改良了一点):

    1 def even_maker(x):
    2     for i in (i for i in xrange(1, 50000001)):
    3         yield i * 2
    4 
    5 for i in even_maker(10**9):
    6     print i, ',',

    效率不太高,感觉应该有更好的办法,不过我暂时也没想继续深入想了。

    2. 写一个函数, 用正则表达式清除字符串中[]和其中的内容。s = "[lol]你好,帮我把这些markup清掉,[smile]。谢谢!"

    这个没什么难度,用正则处理正合适。

    1 s = "[lol]你好,帮我把这些markup清掉,[smile]。谢谢!"
    2 print re.sub('[.*?]', '', s)

    一行搞定(不许吐槽这是两行)。

    3. 请使用python, 对下面的函数进行处理,

    def hello(name):
    print "hello, %s" % name

    在函数被调用时打印耗时详情

    <function name: hello>
    <function call begin>
    hello, tom
    <function call end>
    [timecosts: 3.81469726562e-06s]

    典型的装饰器。不过我对装饰器是真的不熟,基本上都靠蒙。之前转载了一遍博客:http://www.cnblogs.com/anpengapple/p/5068580.html 是装饰器的,写的不错,我差不多每次都要照这个抄。这次这个装饰器已经是相当简单了。

     1 def name_and_time_func(func):
     2     def name_time(*param):
     3         start_time = datetime.datetime.now()
     4         print '<function name: %s>', func.__name__
     5         print '<function call begin>'
     6         func(*param)
     7         print '<function call end>'
     8         time.sleep(1)  # 可以不加,但是不加的话看不出来时间间隔
     9         print '[time costs: %s]', datetime.datetime.now() - start_time
    10     return name_time
    11 
    12 @name_and_time_func
    13 def hello(name):
    14     print "hello, %s" % name
    15 
    16 hello('apple')

    4. 写一个函数, 将驼峰命名法字符串转成下划线命名字符串,如GetItem -> get_item,getItem -> get_item

    开始不知道该怎么做,就写了个循环,挨个字符处理,如果是大写,就改成下划线+小写的形式。但是觉得这么写实在是太low了。群里同学指点用sed,然而我只是要练习python啊又不是玩shell。后来在网上查了查re.sub的用法。之前不太会用,以为只能则匹配到的字符串替成同一个字符串。查过才知道原来第二个参数可以用函数或者lambda表达式对匹配到的字符串逐一替换。有了这个强大的武器可就方便多了。

    1 def camel_name(name):
    2     _name = re.sub('[A-Z]', lambda x: '_' + x.group(0).lower(), name)
    3     return _name if _name[0] != '_' else _name[1:]  # 替换完之后有可能第一个字母是下划线,需要去掉
    4 
    5 names = ['GetItem', 'getItem', 'getitem']
    6     for i in names:
    7         print camel_name(i)

    5. 打印列表:[1, 2, 3, 4...n],n=20;请编写代码打印如下规律的输出:

            1 [1*, 2, 3, 4, 5]
            2 [1, 2*, 3, 4, 5]
            3 [1, 2, 3*, 4, 5]
            4 [2, 3, 4*, 5, 6]
            5 [3, 4, 5*, 6, 7]
            6 [4, 5, 6*, 7, 8]
            ...
            20 [16, 17, 18, 19, 20*]

    差不多就是网页中的翻页格式吧。这个也没有太大难度,不过我还是小卡一下,主要是强迫症犯了,想把这个改成更通用一点的形式。调了几次之后效果还是不错的,总页数和显示出来的页码数量可以自己传参数,*页码总会出现在中间。当页码大于总页数或小于1的时候也会自行调整。

     1 def page_print(page, total=20, width=5):
     2     # page是当前页码,就是标*的页码
     3     # total是总页码
     4     # width是显示的页数(*页码会出现在中间)
     5 
     6     # 设置打印页码,避免超出范围
     7     if page < 1:
     8         page = 1
     9     if page > total:
    10         page = total
    11 
    12     # 设置起始页码
    13     if page < width / 2 + 1:
    14         start = 1
    15     elif page > total - width / 2:
    16         start = total - width
    17     else:
    18         start = page - width / 2
    19 
    20     ret = str(page) + '['
    21     for i in xrange(start, start + width + 1):
    22         if i == page:
    23             ret += '*'
    24         ret += str(i)
    25         if i != start + 
    26             ret += ', '
    27         else:
    28             ret += ']
    '
    29 
    30 return ret
    31 
    32 t = 18
    33 for i in xrange(1, t + 1):
    34     print page_print(page=i, total=t, width=8)

    6. 写一个程序模拟银行排队, 只有一个队伍, 一个用户进入时允许插队(进入队伍任意位置), 但要保证每次导致队伍变更, 队伍中受影响的人都收到通知

    Customer A line up at position 11
    Customer B: order changed to 12
    Customer C: order changed to 13
    Customer D: order changed to 14

    不会。感觉像是某个设计模式的东西,我对设计模式了解的不多,暂时没想到什么好办法。强行写是能写的,不过程序写出来肯定会很丑。等有空再想想(潜台词是懒得动脑了)。

    7. 用户系统, 存在相互关注的动作, 当进入某个人的个人主页, 需要展示其粉丝数, 关注数, 粉丝列表以及关注列表. 请简要描述解决方案, 包括db建模/数据层/业务层, 以及应对高并发/关注取关等情况的处理逻辑。

    略。

    8. 给定一些NxN的矩阵,对于任意的路线,定义其【和】为其线路上所有节点的数字的和,计算从左上角到右下角的路线和最小值。每条路线只能从某一点到其周围(上下左右)的点,不可斜行。 例如,

    4,6
    2,8 的路线和最小值为 4-2-8 14
    1,2,3
    4,5,6
    7,8,9 的路线和最小值为 1-2-3-6-9 21

    程序只需输出最小和值即可(一个数字)

    这是典型的动态规划问题啊。当年学动态规划时候,算法导论书上的第一个例子流水线问题就是这个东西。不过然而但是可是,动态规划我几乎忘光了。先放在这里,过几天写篇日志补上。

  • 相关阅读:
    English trip V2-B 20 Happy Holiday Teacher: Russell
    English Voice of <<That Girl>>
    English trip V2-B 19 How often is often? Teacher: GABRIELE
    English trip EM4-LP 3A AT The MARKET Teacher:Patrick
    I1-3 Telephone English Teacher:Taylor
    Phonics 自然拼读法 ar er ir ur or 元音字母组合 Teacher:Lamb
    English trip V2-B 18 What's Your Job? 你是什么工作 Teacher: Russell
    English trip V2-B 17 Look to the Future Teacher: Russell
    Huawei设备配置系统时间
    iperf 网络测试工具
  • 原文地址:https://www.cnblogs.com/anpengapple/p/5071215.html
Copyright © 2020-2023  润新知