Python编程题

开此贴用以记录python编程题,用以督促自己不断学习

输出杨辉三角(利用yield)

          1
        1   1
      1   2   1
    1   3   3   1
  1   4   6   4   1
1   5   10  10  5   1

解析:
把每一行当作一个列表 list ,只关注中间(非零)的元素
核心代码:

1
b=[1]+[b[i]+b[i+1] for i in range(len(b)-1)]+[1]

源代码:

1
2
3
4
5
6
7
8
9
10
>>> def yh(x):
n,b=0,[1]
while n<x:
yield b
n+=1
b=[1]+[b[i]+b[i+1] for i in range(len(b)-1)]+[1]


>>> for x in yh(11):
print(x)

输出:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
[1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]

利用map函数规范用户输入的英文名字

题目:

利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:[‘adam’, ‘LISA’, ‘barT’],输出:[‘Adam’, ‘Lisa’, ‘Bart’]:

代码:

1
2
3
4
5
6
def normalize(name):
return name.title()

L1 = ['adam', 'LISA', 'barT']
L2 = list(map(normalize, L1))
print(L2)


输出样例:
[‘Adam’, ‘Lisa’, ‘Bart’]


知识点:

字符串中字符大小写的变换:

  • S.lower()
    小写
  • S.upper()
    大写
  • S.swapcase()
    大小写互换
  • S.capitalize()
    首字母大写
  • String.capwords(S)
    这是模块中的方法。它把S用split()函数分开,然后用capitalize()把首字母变成大写,最后用join()合并到一起
  • S.title()
    只有首字母大写,其余为小写,模块中没有这个方法字符串在输出时的对齐:

利用sum(),reduce(),进行列表求积

Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,可以接受一个list并利用reduce()求积:

输入:

print('3 * 5 * 7 * 9 =', prod([3, 5, 7, 9]))

输出:

3 * 5 * 7 * 9 = 945


解题思路:

核心思路: 转化为 (((3个5)个7)个9)
sump(3,5),构造出五个三,并利用sum()进行求和,利用reduce()迭代求积


源代码:

1
2
3
4
5
6
7
from functools import reduce
def sump(x,y):
d=[ x for i in range(y)]
return sum(d)

def prod(L):
return reduce(sump,L)

利用map,reduce,lamdba来将字符串转化为float

题目:

利用map和reduce编写一个str2float函数,把字符串’123.456’转换成浮点数123.456:


解题思路:

这道题想了很久,就是没有想到好的方法(编程能力还是不行…),借鉴了一下别人的想法,这边我简单的说明一下…
由于用float(‘123.456’)后,输出’.’会出错,于是可以通过.find()函数找到’.’的位置(从零开始计数),并去除小数点使之成为整数(自然想到科学计数法的形式).
注意map,reduce,lambda的用法


源代码:

1
2
3
4
5
6
7
8
9
from functools import reduce
def sf(s):
pos=s.find('.')
s=s[:pos]+s[pos+1:]#去掉'.'
if pos<0: #未找到
time=0
else:
time=pos-len(s)
return reduce(lambda x,y:x*10+y,map(lambda x:{'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'0':0}[x],s))*pow(10,time)


输出:

1
2
 >>>print('sf(\'123.456\') =', sf('123.456'))
sf('123.456') = 123.456

求素数(仔细揣摩)

先说明下如何求素数,对于一个从2开始的自然数序列,先去除所有2的倍数,得到一个新的序列,再除去首个元素的所有倍数元素,以此类推,,,

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def _odd():#构造从2开始的所有自然数序列
n=2
while True:
yield n
n+=1

def notDivsible(n):#判断x是否被n整除
return lambda x:x%n>0#(返回的是带参的整数,比如:lambda x:x%3)
#`x:x%n`不能等于0,当True时,保留,等于0,则是保留n的倍数

def prime():
it=_odd()
while True:
n=next(it)
yield n
it=filter(notDivsible(n),it)#注意要notDivsible后面有`(n)`
#如果不加就无法进行筛选!!!


for i in prime():
if i<100:
print (i,end=' | ')
else:
break

输出样例:

1
2
>>> 
2 | 3 | 5 | 7 | 11 | 13 | 17 | 19 | 23 | 29 | 31 | 37 | 41 | 43 | 47 | 53 | 59 | 61 | 67 | 71 | 73 | 79 | 83 | 89 | 97 |

注意:
def notDivsible(n):#判断x是否被n整除
return lambda x:x%n==0#(返回的是带参的整数,比如:lambda x:x%3)

返回的是一个函数,比如n=3时,返回值是lambda x: x % 3 >0
filter(_not_divisible(n), it)就相应变成了filter(lambda x: x % 3 >0, it)


python TCP 编程 (client)

直接上代码(以get方式获取网页内容)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#建立连接
s.connect(('blog.youhaiqun.mom',80))
#发送数据
s.send(b'GET / HTTP/1.1\r\nHOST:blog.youhaiqun.mom\r\nConnection: close\r\n\r\n')
#接受数据
buffer=[]
while True:
d=s.recv(1024)
if d:
buffer.append(d)
else:
break
data=b''.join (buffer)
#关闭连接
s.close()

#保存文件
header,html=data.split(b'\r\n\r\n',1)
print(header.decode('utf-8'))

with open('blog1.html','wb') as f:
f.write(html)

头文件header:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
>>> 
HTTP/1.1 200 OK

Server: GitHub.com

Content-Type: text/html; charset=utf-8

Last-Modified: Fri, 29 Jul 2016 13:25:19 GMT

Access-Control-Allow-Origin: *

Expires: Sat, 30 Jul 2016 07:06:14 GMT

Cache-Control: max-age=600

X-GitHub-Request-Id: B91F1216:5541:3874F99:579C4F8E

Content-Length: 51037

Accept-Ranges: bytes

Date: Sat, 30 Jul 2016 07:38:54 GMT

Via: 1.1 varnish

Age: 0

Connection: close

X-Served-By: cache-lcy1125-LCY

X-Cache: MISS

X-Cache-Hits: 0

Vary: Accept-Encoding

X-Fastly-Request-ID: 33951915ca6bc0582b71c9114c79366eb4db721f


利用turtle画图

基本原理:

画出16*16的格子,利用随机模块随机产生0~3四个数字,  
分别代表四个方向,每次移动一个格子,碰到边界则结束画图,      
turtle.setheading(270)用来设置箭头的方向(此时箭头指向北)  

源代码:

import turtle
from random import randint
turtle.speed(1)
turtle.color('gray')
x=-80
for y in range (-80,80+1,10):
    turtle.penup()
    turtle.goto(x,y)
    turtle.pendown()
    turtle.forward(160)
y=80
turtle.right(90)
for x in range (-80,80+1,10):
    turtle.penup()
    turtle.goto(x,y)
    turtle.pendown()
    turtle.forward(160)
turtle.pensize(3)
turtle.color('red')
turtle.penup()
turtle.goto(0,0)
turtle.pendown()
x=y=0
while abs(x)<80 and abs(y)<80:
    r=randint(0,3)
    if r==0:#right
        x+=10
        turtle.setheading(0)
        turtle.forward(10)
    elif r==1:#left
        x-=10
        turtle.setheading(180)
        turtle.forward(10)
    elif r==2:#up
        y+=10
        turtle.setheading(270)
        turtle.forward(10)
    else:
        y-=10
        turtle.setheading(90)
        turtle.forward (10)

turtle.done()

程序运行截图:


本文标题:Python编程题

文章作者:定。

发布时间:2016年7月27日 - 21时07分

本文字数:4,515字

原始链接:http://cocofe.cn/2016/07/27/python编程题/

许可协议: Attribution-NonCommercial 4.0

转载请保留以上信息。