几个python练习题
从python公众号里面看到了几道python的练习题,就拿来练练手,结果上手了发现自己还是特别水,不是很难的8道题,我只做出来5道,其中还3道题卡住了,边查边做的。原题链接在这里:http://python.jobbole.com/83641/
1. 编写代码, 打印1-1亿之内的偶数
看完题目想都没想就直接写了一句:
print [i for i in xrange(1, 10**9) if i % 2 == 0]
开始跑结果。然后。死机了。重启时候反省了一下,嗯,的确是有点二,一下生成五千万个元素的列表,电脑没炸了就算它好脾气了。可是,总不能一个for循环打印吧,那也太low了。考虑了一下,还是用协程靠谱一点。于是重新写了一个(在QQ群里看到别人写的稍微改良了一点):
def even_maker(x):
for i in (i for i in xrange(1, 50000001)):
yield i * 2 for i in even_maker(10**9):
print i, ',',
效率不太高,感觉应该有更好的办法,不过我暂时也没想继续深入想了。
2. 写一个函数, 用正则表达式清除字符串中[]和其中的内容。s = "[lol]你好,帮我把这些markup清掉,[smile]。谢谢!"
这个没什么难度,用正则处理正合适。
s = "[lol]你好,帮我把这些markup清掉,[smile]。谢谢!"
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 是装饰器的,写的不错,我差不多每次都要照这个抄。这次这个装饰器已经是相当简单了。
def name_and_time_func(func):
def name_time(*param):
start_time = datetime.datetime.now()
print '<function name: %s>', func.__name__
print '<function call begin>'
func(*param)
print '<function call end>'
time.sleep(1) # 可以不加,但是不加的话看不出来时间间隔
print '[time costs: %s]', datetime.datetime.now() - start_time
return name_time @name_and_time_func
def hello(name):
print "hello, %s" % name hello('apple')
4. 写一个函数, 将驼峰命名法字符串转成下划线命名字符串,如GetItem -> get_item,getItem -> get_item
开始不知道该怎么做,就写了个循环,挨个字符处理,如果是大写,就改成下划线+小写的形式。但是觉得这么写实在是太low了。群里同学指点用sed,然而我只是要练习python啊又不是玩shell。后来在网上查了查re.sub的用法。之前不太会用,以为只能则匹配到的字符串替成同一个字符串。查过才知道原来第二个参数可以用函数或者lambda表达式对匹配到的字符串逐一替换。有了这个强大的武器可就方便多了。
def camel_name(name):
_name = re.sub('[A-Z]', lambda x: '_' + x.group(0).lower(), name)
return _name if _name[0] != '_' else _name[1:] # 替换完之后有可能第一个字母是下划线,需要去掉 names = ['GetItem', 'getItem', 'getitem']
for i in names:
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的时候也会自行调整。
def page_print(page, total=20, width=5):
# page是当前页码,就是标*的页码
# total是总页码
# width是显示的页数(*页码会出现在中间) # 设置打印页码,避免超出范围
if page < 1:
page = 1
if page > total:
page = total # 设置起始页码
if page < width / 2 + 1:
start = 1
elif page > total - width / 2:
start = total - width
else:
start = page - width / 2 ret = str(page) + '['
for i in xrange(start, start + width + 1):
if i == page:
ret += '*'
ret += str(i)
if i != start + width:
ret += ', '
else:
ret += ']\n' return ret t = 18
for i in xrange(1, t + 1):
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
程序只需输出最小和值即可(一个数字)
这是典型的动态规划问题啊。当年学动态规划时候,算法导论书上的第一个例子流水线问题就是这个东西。不过然而但是可是,动态规划我几乎忘光了。先放在这里,过几天写篇日志补上。
几个python练习题的更多相关文章
- Python练习题 028:求3*3矩阵对角线数字之和
[Python练习题 028] 求一个3*3矩阵对角线元素之和 ----------------------------------------------------- 这题解倒是解出来了,但总觉得 ...
- Python练习题 027:对10个数字进行排序
[Python练习题 027] 对10个数字进行排序 --------------------------------------------- 这题没什么好说的,用 str.split(' ') 获 ...
- Python练习题 026:求100以内的素数
[Python练习题 026] 求100以内的素数. ------------------------------------------------- 奇怪,求解素数的题,之前不是做过了吗?难道是想 ...
- Python练习题 025:判断回文数
[Python练习题 025] 一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. ---------------------------------------- ...
- Python练习题 024:求位数及逆序打印
[Python练习题 024] 给一个不多于5位的正整数,要求:一.求它是几位数,二.逆序打印出各位数字. ---------------------------------------------- ...
- Python练习题 004:判断某日期是该年的第几天
[Python练习题 004]输入某年某月某日,判断这一天是这一年的第几天? ---------------------------------------------- 这题竟然写了 28 行代码! ...
- Python练习题-1.使用匿名函数对1~1000求和,代码力求简洁。
Python 练习 标签(空格分隔): Python Python练习题 Python知识点 一.使用匿名函数对1~1000求和,代码力求简洁. 答案: In [1]: from functools ...
- PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。
Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...
- python 基础 2.8 python练习题
python 练习题: #/usr/bin/python #coding=utf-8 #@Time :2017/10/26 9:38 #@Auther :liuzhenchuan #@File ...
- Python练习题2
如果真的想学精,学什么都不是好学的,如果真的想把Python学的出神入化,几乎自己想做什么都可以,就要下定恒心,坚持下去. 接下来继续更新Python练习题2,通过更新前一部的练习题让自己也学到了不少 ...
随机推荐
- Git命令学习笔记
一.本地代码增,删,改,查,提交,找回git checkout . //抛弃工作区所有修改git checkout -- <file> //抛弃工作区& ...
- Java 基础(6)——关键字 & 标识符 & 转义字符
依然是基础的一天,看一看就好~ 关键字 之前就有说过关键字哦~ 注:关键字就是程序发明者规定的有特殊含义的单词. from Java基础(2) Java 中除了关键字以外还有暂时没有成为关键字的保留字 ...
- 从服务器下载文件 DownloadServlet()
.html代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- Be opinionated out of the box but get out of the way quickly as requirements start to diverge from
Be opinionated out of the box but get out of the way quickly as requirements start to diverge from t ...
- Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
环境 Android Studio 3.0 升级&导入项目 错误 Error:java.util.concurrent.ExecutionException: com.android.tool ...
- 【转】spring boot使用Druid和监控配置
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012100371/article/details/76602612 Druid是Java语言中最好 ...
- 鼠标拖动改变DIV等网页元素的大小的最佳实践
1.初次实现 1.1 html代码 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" la ...
- mysql的with rollup
无意间发现了mysql的with rollup函数(用在group by 函数后面) 测试 1. SELECT NAME,DATE,score FROM stu 结果是 2. SELECT NAME, ...
- 洛谷P3952 时间复杂度(模拟)
题意 题目链接 Sol 咕了一年的题解..就是个模拟吧 考场上写的递归也是醉了... 感觉一年自己进步了不少啊..面向数据编程的能力提高了不少 #include<bits/stdc++.h> ...
- ElementUI组件库常见方法及问题汇总(持续更新)
本文主要介绍在使用ElementUI组件库的时候,常遇见的问题及使用到的方法,汇总记录便于查找. 1.表单 阻止表单的默认提交 <!-- @submit.native.prevent --> ...