Skip to content

Commit c2c5139

Browse files
committed
problems
1 parent c64a758 commit c2c5139

6 files changed

Lines changed: 248 additions & 0 deletions

File tree

129.md

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
>因为世人都犯了罪,亏缺了神的荣耀。如今却蒙神的恩典,因基督耶稣的救赎,就白白的称义。神设立耶稣作挽回祭,是凭着耶稣的血,藉着人的信,要显明神的义。因为他用忍耐的心,宽容人先时所犯的罪。好在今时显明他的义,使人知道自己为义,也称信耶稣的人为义。(ROAMNS 3:23-26)
2+
3+
#练习
4+
5+
已经将python的基础知识学习完毕,包含基本的数据类型(或者说对象类型)和语句。利用这些,加上个人的聪明才智,就能解决一些问题了。
6+
7+
###练习1
8+
9+
**问题描述**
10+
11+
有一个列表,其中包括10个元素,例如这个列表是[1,2,3,4,5,6,7,8,9,0],要求将列表中的每个元素一次向前移动一个位置,第一个元素到列表的最后,然后输出这个列表。最终样式是[2,3,4,5,6,7,8,9,0,1]
12+
13+
**解析**
14+
15+
或许刚看题目的读者,立刻想到把列表中的第一个元素拿出来,然后追加到最后,不就可以了吗?是的。就是这么简单。主要是联系一下已经学习过的列表操作。
16+
17+
看下面代码之前,不妨自己写一写试试。然后再跟我写的对照。
18+
19+
**注意,我在这里所写的代码不能算标准答案。只能是参考。很可能你写的比我写的还要好。在代码界,没有标准答案。**
20+
21+
参考代码如下,这个我保存为12901.py文件
22+
23+
#!/usr/bin/env python
24+
# coding=utf-8
25+
26+
raw = [1,2,3,4,5,6,7,8,9,0]
27+
print raw
28+
29+
b = raw.pop(0)
30+
raw.append(b)
31+
print raw
32+
33+
执行这个文件:
34+
35+
$ python 12901.py
36+
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
37+
[2, 3, 4, 5, 6, 7, 8, 9, 0, 1]
38+
39+
第一行所打印的是原来的列表,第二行是需要的列表。这里用到的主要是列表的两个函数`pop()``append()`。如果读者感觉不是很熟悉,或者对这个问题,在我提供的参考之前只有一个模糊认识,但是没有明晰地写出代码,说明对前面的函数还没有烂熟于胸。唯一的方法就是多练习。
40+
41+
###练习2
42+
43+
**问题描述**
44+
45+
按照下面的要求实现对列表的操作:
46+
47+
1. 产生一个列表,其中有40个元素,每个元素是0到100的一个随机整数
48+
2. 如果这个列表中的数据代表着某个班级40人的分数,请计算成绩低于平均分的学生人数,并输出
49+
3. 对上面的列表元素从大到小排序
50+
51+
**解析**
52+
53+
这个问题中,需要几个知识点:
54+
55+
第一个是随机产生整数。一种方法是你做100个纸片,分别写上1到100的数字(每张上一个整数),然后放到一个盒子里面。抓出一个,看是几,就讲这个数字写到列表中,直到抓出第40个。这样得到的列表是随机了。但是,好像没有python什么事情。那么久要用另外一种方法,让python来做。python中有一个模块:random,专门提供随机事件的。
56+
57+
>>> dir(random)
58+
['BPF', 'LOG4', 'NV_MAGICCONST', 'RECIP_BPF', 'Random', 'SG_MAGICCONST', 'SystemRandom', 'TWOPI', 'WichmannHill', '_BuiltinMethodType', '_MethodType', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_acos', '_ceil', '_cos', '_e', '_exp', '_hashlib', '_hexlify', '_inst', '_log', '_pi', '_random', '_sin', '_sqrt', '_test', '_test_generator', '_urandom', '_warn', 'betavariate', 'choice', 'division', 'expovariate', 'gammavariate', 'gauss', 'getrandbits', 'getstate', 'jumpahead', 'lognormvariate', 'normalvariate', 'paretovariate', 'randint', 'random', 'randrange', 'sample', 'seed', 'setstate', 'shuffle', 'triangular', 'uniform', 'vonmisesvariate', 'weibullvariate']
59+
60+
在这个问题中,只需要`random.randint()`,专门获取某个范围内的随机整数。
61+
62+
第二个是求平均数,方法是将所有数字求和,然后除以总人数(40)。求和方法就是`sum()`函数。在计算平均数的时候,要注意,一般平均数不能仅仅是整数,最好保留一位小数吧。这是除法中的知识了。
63+
64+
第三个是列表排序。
65+
66+
下面就依次展开。不忙,在我开始之前,你先试试吧。
67+
68+
#!/usr/bin/env python
69+
# coding=utf-8
70+
71+
from __future__ import division
72+
import random
73+
74+
score = [random.randint(0,100) for i in range(40)] #0到100之间,随机得到40个整数,组成列表
75+
print score
76+
77+
num = len(score)
78+
sum_score = sum(score) #对列表中的整数求和
79+
ave_num = sum_score/num #计算平均数
80+
less_ave = len([i for i in score if i<ave_num]) #将小于平均数的找出来,组成新的列表,并度量该列表的长度
81+
print "the average score is:%.1f" % ave_num
82+
print "There are %d students less than average." % less_ave
83+
84+
sorted_score = sorted(score, reverse=True) #对原列表排序
85+
print sorted_score
86+
87+
##练习3
88+
89+
**问题描述**
90+
91+
如果将一句话作为一个字符串,那么这个字符串中必然会有空格(这里仅讨论英文),比如"How are you.",但有的时候,会在两个单词之间多大一个空格。现在的任务是,如果一个字符串中有连续的两个空格,请把它删除。
92+
93+
**解析**
94+
95+
对于一个字符串中有空格,可以使用[《字符串(4)》](./109.md)中提到的`strip()`等。但是,它不是仅仅去掉一个空格,而是把字符串两遍的空格都去掉。都去掉似乎也没有什么关系,再用空格把单词拼起来就好了。
96+
97+
按照这个思路,我这样写代码,供你参考(更建议你先写出一段来,然后我们两个对照)。
98+
99+
#!/usr/bin/env python
100+
# coding=utf-8
101+
102+
string = "I love code." #在code前面有两个空格,应该删除一个
103+
print string #为了能够清楚看到每步的结果,把过程中的量打印出来
104+
105+
str_lst = string.split(" ") #以空格为分割,得到词汇的列表
106+
print str_lst
107+
108+
words = [s.strip() for s in str_lst] #去除单词两边的空格
109+
print words
110+
111+
new_string = " ".join(words) #以空格为连接符,将单词链接起来
112+
print new_string
113+
114+
保存之后,运行这个代码,结果是:
115+
116+
I love code.
117+
['I', 'love', '', 'code.']
118+
['I', 'love', '', 'code.']
119+
I love code.
120+
121+
结果是令人失望的。经过一番折腾,空格根本就没有被消除。最后的输出和一开始的字符串完全一样。泪奔!
122+
123+
查找原因。
124+
125+
从输出中已经清楚表示了。当执行`string.split(" ")`的时候,是以空格为分割符,将字符串分割,并返回列表。列表中元素是由单词组成。原来字符串中单词之间的空格已经被作为分隔符,那么列表中单词两遍就没有空格了。所以,前面代码中就无需在用`strip()`去删除空格。另外,特别要注意的是,有两个空格连着呢,其中一个空格作为分隔符,另外一个空格就作为列表元素被返回了。这样一来,分割之后的操作都无作用了。
126+
127+
看官是否明白错误原因了?
128+
129+
如何修改?显然是分割之后,不能用`strip()`,而是要想办法把那个返回列表中的空格去掉,得到只含有单词的列表。再用空格连接之,就应该对了。所以,我这样修正它。
130+
131+
#!/usr/bin/env python
132+
# coding=utf-8
133+
134+
string = "I love code."
135+
print string
136+
137+
str_lst = string.split(" ")
138+
print str_lst
139+
140+
words = [s for s in str_lst if s!=""] #利用列表解析,将空格检出
141+
print words
142+
143+
new_string = " ".join(words)
144+
print new_string
145+
146+
将文件保存,名为12903.py,运行之得到下面结果:
147+
148+
I love code.
149+
['I', 'love', '', 'code.']
150+
['I', 'love', 'code.']
151+
I love code.
152+
153+
OK!完美地解决了问题,去除了code前面的一个空格。
154+
155+
##练习4
156+
157+
**问题描述**
158+
159+
>根據高德納(Donald Ervin Knuth)的《計算機程序設計藝術》(The Art of Computer Programming),1150年印度數學家Gopala和金月在研究箱子包裝物件長宽剛好為1和2的可行方法數目時,首先描述這個數列。 在西方,最先研究這個數列的人是比薩的李奧納多(義大利人斐波那契 Leonardo Fibonacci),他描述兔子生長的數目時用上了這數列。
160+
161+
>第一個月初有一對剛誕生的兔子;第二個月之後(第三個月初)牠們可以生育,每月每對可生育的兔子會誕生下一對新兔子;兔子永不死去
162+
163+
>假設在n月有可生育的兔子總共a對,n+1月就總共有b對。在n+2月必定總共有a+b對: >因為在n+2月的時候,前一月(n+1月)的b對兔子可以存留至第n+2月(在當月屬於新誕生的兔子尚不能生育)。而新生育出的兔子對數等於所有在n月就已存在的a對
164+
165+
上面故事是一个著名的数列——斐波那契数列——的起源。斐波那契数列用数学方式表示就是:
166+
167+
a0 = 0 (n=0)
168+
a1 = 1 (n=1)
169+
a[n] = a[n-1] + a[n-2] (n>=2)
170+
171+
我们要做的事情是用程序计算出n=100是的值。
172+
173+
在解决这个问题之前,你可以先观看一个[关于斐波那契数列数列的视频](http://swf.ws.126.net/openplayer/v02/-0-2_M9HKRT25D_M9HNA0UNO-vimg1_ws_126_net//image/snapshot_movie/2014/1/6/L/M9HNA8H6L-.swf),注意,请在墙内欣赏。
174+
175+
**解析**
176+
177+
斐波那契数列是各种编程语言中都要秀一下的东西,通常用在阐述“递归”中。什么是递归?后面的python中也会讲到。不过,在这里不准备讲。
178+
179+
其实,如果用递归来写,会更容易明白。但是,这里我给出一个用for循环写的,看看是否能够理解之。
180+
181+
#!/usr/bin/env python
182+
# coding=utf-8
183+
184+
a, b = 0, 1
185+
186+
for i in range(4): #改变这里的数,就能得到相应项的结果
187+
a, b = b, a+b
188+
189+
print a
190+
191+
保存运行之,看看结果和你推算的是否一致。
192+
193+
------
194+
195+
[总目录](./index.md)&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[上节:迭代](./128.md)&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[下节:函数(1)](./201.md)
196+
197+
如果你认为有必要打赏我,请通过支付宝:**[email protected]**,不胜感激。

1code/12901.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/usr/bin/env python
2+
# coding=utf-8
3+
4+
raw = [1,2,3,4,5,6,7,8,9,0]
5+
print raw
6+
b = raw.pop(0)
7+
raw.append(b)
8+
9+
print raw

1code/12902.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/usr/bin/env python
2+
# coding=utf-8
3+
4+
from __future__ import division
5+
import random
6+
7+
score = [random.randint(0,100) for i in range(40)]
8+
print score
9+
10+
num = len(score)
11+
sum_score = sum(score)
12+
ave_num = sum_score/num
13+
less_ave = len([i for i in score if i<ave_num])
14+
print "the average score is:%.1f" % ave_num
15+
print "There are %d students less than average."%less_ave
16+
17+
sorted_score = sorted(score, reverse=True)
18+
print sorted_score

1code/12903.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/usr/bin/env python
2+
# coding=utf-8
3+
4+
string = "I love code."
5+
print string
6+
7+
str_lst = string.split(" ")
8+
print str_lst
9+
10+
words = [s for s in str_lst if s!=""]
11+
print words
12+
13+
new_string = " ".join(words)
14+
print new_string

1code/12904.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/usr/bin/env python
2+
# coding=utf-8
3+
4+
a, b = 0, 1
5+
6+
for i in range(4):
7+
a, b = b, a+b
8+
9+
print a

index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
26. [文件(1)](./126.md)==>文件打开,读取,写入
4141
27. [文件(2)](./127.md)==>文件状态,read/readline/readlines,大文件读取,seek
4242
28. [迭代](./128.md)==>迭代含义,iter()
43+
29. [练习](./129.md)==>通过四个练习,综合运用以前所学
4344

4445
##第二部分:函数和类
4546

0 commit comments

Comments
 (0)